我无法绑定到数据源上的属性或列 itemDescription

Posted

技术标签:

【中文标题】我无法绑定到数据源上的属性或列 itemDescription【英文标题】:I Cannot bind to the property or column itemDescription on the DataSource 【发布时间】:2021-04-09 23:30:54 【问题描述】:

当我按下登录名并调用 LoginClick() 方法时,发生异常,这是在我使用 SSMS 将 SQL 数据库中的列名从“itemDescription”更改为“itemName”之后发生的,希望您能帮助我。我已经尝试了一切,并确保我在问这个问题之前进行了研究。我现在被困在这里几个小时了。不知道问题出在哪里。

LoginForm.cs

private void LoginClick()
    
        if (MTBoxUsername.Text.Length == 0 || MTBoxPassword.Text.Length == 0)
        
            MessageBox.Show("Please enter your username and password", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        
        else
        
            if (!int.TryParse(MTBoxUsername.Text, out int j))
            
                MessageBox.Show("Your username is your student number", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            
            string username = MTBoxUsername.Text;
            string password = MTBoxPassword.Text;
            var student = (from s in DatabaseHelper.db.tblUsers
                           where s.username == long.Parse(username)
                           select s).First();
            if (student != null)
            
                if (BCrypt.CheckPassword(password, student.password))
                
                    MessageBox.Show("Login Succesful!", "INFORMATION", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.Hide();
                    if (student.userType.Equals("STUDENT"))
                    
                        var loginStudent = (from s in DatabaseHelper.db.tblStudents
                                            where s.StudentNumber == long.Parse(username)
                                            select s).First();
                        new StudentForm().Show();
                    
                    else if (student.userType.Equals("ADMIN"))
                    
                        new AdminForm().Show();
                    
                    else if (student.userType.Equals("FACULTY"))
                    
                        new StaffFormMain().Show();
                    
                
                else
                
                    MessageBox.Show("Invalid username or password", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                
            
            else
            
                MessageBox.Show("Invalid username or password.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            
        
    

StudentForm.cs

public StudentForm()
    
        this.selectedStudent = (from s in DatabaseHelper.db.tblStudents
                               where s.StudentNumber == 2000013113
                               select s).First();
        InitializeComponent();
        materialSkinManager = MaterialSkin.MaterialSkinManager.Instance;
        materialSkinManager.EnforceBackcolorOnAllComponents = true;
        materialSkinManager.AddFormToManage(this);
        materialSkinManager.Theme = MaterialSkin.MaterialSkinManager.Themes.LIGHT;
        materialSkinManager.ColorScheme = new MaterialSkin.ColorScheme(MaterialSkin.Primary.Indigo500,
            MaterialSkin.Primary.Indigo700,
            MaterialSkin.Primary.Indigo100,
            MaterialSkin.Accent.Pink200,
            MaterialSkin.TextShade.WHITE);
    

    private void RefreshCartList()
    
        DgvCartList.Rows.Clear();
        subTotal = 0;
        foreach (OrderDetail item in cartList)
        
            DgvCartList.Rows.Add(item.itemName,
                item.quantity,
                item.pricePerUnit,
                item.total);
            subTotal += item.total;
        
        BtnCheckout.Enabled = cartList.Count > 0;
        BtnClearCart.Enabled = cartList.Count > 0;
        BtnRemoveItem.Enabled = cartList.Count > 0;
        LabelSubTotal.Text = cartList.Count > 0 ? subTotal.ToString() : "";
    

    private void ClearCart()
    
        cartList.Clear();
        RefreshCartList();
    

    private void CmbItems_SelectedIndexChanged(object sender, EventArgs e)
    
        LabelStockCount.Text = itemList[CmbItems.SelectedIndex].stocks.ToString();
        LabelPrice.Text = itemList[CmbItems.SelectedIndex].price.ToString();
        BtnAddToCart.Enabled = true;
    

    private void BtnAddToCart_Click(object sender, EventArgs e)
    
        if (CmbItems.SelectedIndex != -1)
        
            tblItem selectedItem = itemList[CmbItems.SelectedIndex];

            if (cartList.Count > 0)
            
                foreach (OrderDetail item in cartList)
                
                    if (item.itemID.Equals(selectedItem.ID))
                    
                        if (item.quantity == 99)
                        
                            MessageBox.Show("You cannot add more than 99 items of the same type in cart.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        
                        if (item.quantity == selectedItem.stocks)
                        
                            MessageBox.Show("You have reached the maximum number of stocks available.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        
                        item.quantity++;
                        RefreshCartList();
                        return;
                    

                
            
            cartList.Add(new OrderDetail
            
                itemID = selectedItem.ID,
                itemName = selectedItem.itemName,
                quantity = 1,
                pricePerUnit = selectedItem.price
            );
            RefreshCartList();


        
    

    private void DgvCartList_RowEnter(object sender, DataGridViewCellEventArgs e)
    
        selectedItemFromCart = DgvCartList.Rows[e.RowIndex].Cells[0].Value.ToString();
    

    private void BtnRemoveItem_Click(object sender, EventArgs e)
    
        DialogResult dialogResult = MessageBox.Show("Are you sure you want to remove '" + selectedItemFromCart + "' from your cart?",
            "QUESTION", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (dialogResult == DialogResult.Yes)
        
            foreach (OrderDetail item in cartList)
            
                if (item.itemName.Equals(selectedItemFromCart))
                
                    cartList.Remove(item);
                    RefreshCartList();
                    return;
                
            
        
    

    private void BtnClearCart_Click(object sender, EventArgs e)
    
        DialogResult dialogResult = MessageBox.Show("Are you sure you want to clear your cart?", "QUESTION", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (dialogResult == DialogResult.Yes)
        
            ClearCart();
        
    

    private void BtnCheckout_Click(object sender, EventArgs e)
    
        DialogResult dialogResult = MessageBox.Show("Are you sure you want to checkout? You cannot reverse this action once done.", "QUESTION", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (dialogResult == DialogResult.Yes)
        
            var newOrder = new tblOrder
            
                studentId = selectedStudent.StudentNumber,
                orderStatus = "PENDING",
                orderDate = DateTime.Today.Date,
                totalPrice = subTotal

            ;
            DatabaseHelper.db.tblOrders.InsertOnSubmit(newOrder);
            DatabaseHelper.db.SubmitChanges();

            var st = (from tbl in itemList
                     join cart in cartList on tbl.ID equals cart.itemID
                     select new  
                         tbl.ID,
                         cart.quantity
                     ).ToList();

            foreach(var item in st)
            
                var reduceStock = (from s in DatabaseHelper.db.tblItems
                                  where s.ID == item.ID
                                  select s).First();
                reduceStock.stocks -= item.quantity;
                
            

            DatabaseHelper.db.SubmitChanges();

            foreach (OrderDetail item in cartList)
            
                var newOrderDetail = new tblOrderDetail
                
                    orderIdRef = newOrder.ID,
                    itemID = item.itemID,
                    itemName = item.itemName,
                    quantity = item.quantity,
                    pricePerUnit = item.pricePerUnit,
                    totalPrice = item.total,
                    orderStatus = "PENDING"

                ;
                DatabaseHelper.db.tblOrderDetails.InsertOnSubmit(newOrderDetail);
            
            DatabaseHelper.db.SubmitChanges();

            MessageBox.Show("Order placed!", "INFORMATION", MessageBoxButtons.OK, MessageBoxIcon.Information);
            MessageBox.Show("Please save this document and/or print it and show it to the cashier.", "INFORMATION", MessageBoxButtons.OK, MessageBoxIcon.Information);
            using (PrintForm frm = new PrintForm())
            
                frm.PrintInvoice(newOrder.studentId,
                fullName.Trim(),
                newOrder.ID,
                newOrder.orderDate.ToString("MM-dd-yyyy"),
                subTotal,
                cartList);
                frm.ShowDialog();
            
            ClearCart();
            
        
    

    private void MStudentForm_Load(object sender, EventArgs e)
    
        LabelStudentNum.Text = selectedStudent.StudentNumber.ToString();
        
        if (selectedStudent.MiddleName.ToString().Length == 0)
        
            fullName = selectedStudent.FirstName.ToString() + " " + selectedStudent.LastName.ToString();
        
        else
        
            fullName = selectedStudent.FirstName.ToString() + " " + selectedStudent.MiddleName.ToString() + " " + selectedStudent.LastName.ToString();
        
        LabelName.Text = fullName.Trim();
        LabelCourse.Text = selectedStudent.Course.ToString();
        LabelGender.Text = selectedStudent.Gender.ToString();

        switch (selectedStudent.Course.ToString())
        
            case "BSIT":
                courseCategory = "IT";
                break;
            case "BSHM":
                courseCategory = "HM";
                break;
            case "BSTM":
                courseCategory = "TM";
                break;
            case "BACOMM":
                courseCategory = "AB";
                break;
        

        var allItems = from item in DatabaseHelper.db.tblItems
                       where item.category == courseCategory
                       || item.category == "General"
                       || item.gender == selectedStudent.Gender
                       select item;

        foreach (var item in allItems)
        
            tblItem item1 = new tblItem();
            item1.ID = item.ID;
            item1.itemName = item.itemName + " " + item.size;
            item1.category = item.category;
            item1.size = item.size;
            item1.price = item.price;
            item1.stocks = item.stocks;
            if (item1.stocks > 0)
                itemList.Add(item1);
            else
                notAvailableItemsList.Add(item1.itemName);
        

        itemList = itemList.OrderBy(y => y.itemName).ToList();
        notAvailableItemsList = notAvailableItemsList.OrderBy(y => y).ToList();
        
        if(notAvailableItemsList.Count > 0)
        
            string items = "";
            foreach(string item in notAvailableItemsList)
            
                items += item;
                items += "\n";
            
            MessageBox.Show("Not available items are:\n" + items, "INFORMATION", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        

        foreach (var item in itemList)
        
            CmbItems.Items.Add(item.itemName);
        
    

    private void MStudentForm_FormClosing(object sender, FormClosingEventArgs e)
    
        DialogResult dialogResult = MessageBox.Show("Are you sure you want to sign out?", "SIGN OUT", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (dialogResult == DialogResult.Yes)
        
            this.Hide();
            new LoginForm(false).Show();
        
        else
        
            e.Cancel = true;
        
    

    private void DgvCartList_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    
        if (e.RowIndex >= 0)
        
            string name = DgvCartList.Rows[e.RowIndex].Cells[0].Value.ToString();
            int stockItem = 0;
            foreach (var item in itemList)
            
                if (name.Equals(item.itemName))
                
                    stockItem = item.stocks;
                    break;
                
            

            if (DgvCartList.Rows[e.RowIndex].Cells[1].Value == null)
            
                MessageBox.Show("You cannot leave this field empty.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                RefreshCartList();
                return;
            

            int quantity = int.Parse(DgvCartList.Rows[e.RowIndex].Cells[1].Value.ToString());

            if (quantity > 99)
            
                MessageBox.Show("You cannot add more than 99 items of the same type in cart.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                RefreshCartList();
                return;
            
            if (quantity > stockItem)
            
                MessageBox.Show("You have reached the maximum number of stocks available.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                RefreshCartList();
                return;
            
            foreach (OrderDetail item in cartList)
            
                if (item.itemName.Equals(name))
                
                    item.quantity = int.Parse(DgvCartList.Rows[e.RowIndex].Cells[1].Value.ToString());
                    RefreshCartList();
                

            

        
    

错误

    System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>ProwareSystem.exe</AppDomain><Exception><ExceptionType>System.ArgumentException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Cannot bind to the property or column itemDescription on the DataSource.
Parameter name: dataMember</Message><StackTrace>   at System.Windows.Forms.BindToObject.CheckBinding()
   at System.Windows.Forms.BindToObject.SetBindingManagerBase(BindingManagerBase lManager)
   at System.Windows.Forms.Binding.SetListManager(BindingManagerBase bindingManagerBase)
   at System.Windows.Forms.ListManagerBindingsCollection.AddCore(Binding dataBinding)
   at System.Windows.Forms.BindingsCollection.Add(Binding binding)
   at System.Windows.Forms.BindingContext.UpdateBinding(BindingContext newBindingContext, Binding binding)
   at System.Windows.Forms.Control.UpdateBindings()
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.ListControl.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnParentBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.set_BindingContextInternal(BindingContext value)
   at System.Windows.Forms.ContainerControl.set_BindingContext(BindingContext value)
   at System.Windows.Forms.ContainerControl.get_BindingContext()
   at System.Windows.Forms.Control.get_BindingContextInternal()
   at System.Windows.Forms.Control.get_BindingContext()
   at System.Windows.Forms.Control.UpdateBindings()
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.ListControl.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnParentBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.ContainerControl.OnCreateControl()
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message&amp;amp; m)
   at System.Windows.Forms.Control.WndProc(Message&amp;amp; m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message&amp;amp; m)
   at System.Windows.Forms.Form.WmShowWindow(Message&amp;amp; m)
   at System.Windows.Forms.Form.WndProc(Message&amp;amp; m)
   at MaterialSkin.Controls.MaterialForm.WndProc(Message&amp;amp; m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp;amp; m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp;amp; m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)</StackTrace><ExceptionString>System.ArgumentException: Cannot bind to the property or column itemDescription on the DataSource.
Parameter name: dataMember
   at System.Windows.Forms.BindToObject.CheckBinding()
   at System.Windows.Forms.BindToObject.SetBindingManagerBase(BindingManagerBase lManager)
   at System.Windows.Forms.Binding.SetListManager(BindingManagerBase bindingManagerBase)
   at System.Windows.Forms.ListManagerBindingsCollection.AddCore(Binding dataBinding)
   at System.Windows.Forms.BindingsCollection.Add(Binding binding)
   at System.Windows.Forms.BindingContext.UpdateBinding(BindingContext newBindingContext, Binding binding)
   at System.Windows.Forms.Control.UpdateBindings()
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.ListControl.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnParentBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.set_BindingContextInternal(BindingContext value)
   at System.Windows.Forms.ContainerControl.set_BindingContext(BindingContext value)
   at System.Windows.Forms.ContainerControl.get_BindingContext()
   at System.Windows.Forms.Control.get_BindingContextInternal()
   at System.Windows.Forms.Control.get_BindingContext()
   at System.Windows.Forms.Control.UpdateBindings()
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.ListControl.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnParentBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.ContainerControl.OnCreateControl()
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message&amp;amp; m)
   at System.Windows.Forms.Control.WndProc(Message&amp;amp; m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message&amp;amp; m)
   at System.Windows.Forms.Form.WmShowWindow(Message&amp;amp; m)
   at System.Windows.Forms.Form.WndProc(Message&amp;amp; m)
   at MaterialSkin.Controls.MaterialForm.WndProc(Message&amp;amp; m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp;amp; m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp;amp; m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)</ExceptionString></Exception></TraceRecord>
An unhandled exception of type 'System.ArgumentException' occurred in System.Windows.Forms.dll
Cannot bind to the property or column itemDescription on the DataSource.

【问题讨论】:

错误消息很清楚,您实际上自己回答了这个问题:检查所有文件 - 特别是 XAML 文件 - 仍然应该有一个“itemDescription”需要重命名为“itemName”。您应该真正考虑一下您的表定义,并使其尽可能保持不变,以避免将来出现这种工作量。附言这种问题可能更适合 Stackexchanges 的代码审查 我使用 linq to sql DBML 文件,但找不到这样的东西。我认为当我尝试刷新它时它会自动更新,但似乎我找不到错误在哪里。 【参考方案1】:

看来我只需要将 Designer.cs 中的数据绑定从“itemDescription”更改为“itemName”。

我通过这行代码解决了。

this.CmbItems.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.tblItemBindingSource, "itemName", true));

我要感谢大家分享他们的知识。

【讨论】:

以上是关于我无法绑定到数据源上的属性或列 itemDescription的主要内容,如果未能解决你的问题,请参考以下文章

Flex 警告:无法绑定到类“Object”上的属性“foo”(类不是 IEventDispatcher)

我无法绑定树视图上的 IsExpanded 属性

WinForm 绑定到嵌套对象上的属性

组件输入属性上的双向数据绑定

允许绑定到ember组件上的任何data- *属性

绑定属性上的 DataTrigger