代码之家  ›  专栏  ›  技术社区  ›  Matt

用窗口窗体中的按钮从列表框中删除所选项

  •  2
  • Matt  · 技术社区  · 8 年前

    我有一个列表框,我想在其中选择和项目,然后按一个按钮从数据库中删除它。我可以编辑和保存罚款只是不删除。

    当前代码:

    private void button1_Click_3(object sender, EventArgs e)
    {
         if (listBox1.Items.Count >= 1)
              {
                   if (listBox1.SelectedValue != null)
                   {
                        listBox1.Items.Remove(listBox1.SelectedItem);
                        System.Windows.Forms.MessageBox.Show("Item Deleted");
                   }
              }
         else
         {
              System.Windows.Forms.MessageBox.Show("No ITEMS Found");
         }
    }
    

    我得到错误:

    设置DataSource属性时无法修改项集合。

    2 回复  |  直到 8 年前
        1
  •  2
  •   k1dev    8 年前
    private void button1_Click_3(object sender, EventArgs e)
    {
         if (listBox1.Items.Count >= 1)
              {
                   if (listBox1.SelectedValue != null)
                   {
                        var items = (List<YourType>)listBox1.DataSource;
    
                        var item = (YourType)listBox1.SelectedValue;
                        listBox1.DataSource = null;
                        listBox1.Items.Clear();
                        items.Remove(item);
                        listBox1.DataSource = items;
                   }
              }
         else
         {
              System.Windows.Forms.MessageBox.Show("No ITEMS Found");
         }
    }
    

    这就行了

        2
  •  0
  •   vCillusion    8 年前

    假设列表框中可以选择多个项目。下面的逻辑将从UI中移除。此外,如果需要,还可以添加逻辑以从数据库中删除项。

    当数据绑定与数据源不同时,会发生以下异常。

    当DataSource属性为 设置

    数据源指定数据源,而数据绑定定义数据在检索后如何绑定到。通常,数据绑定只在UI初始化期间发生,并且在初始化之后不会改变。
    数据源本身可以在控件的生命周期中发生更改,但这很少见。

    在这里,数据源元素会发生变化。

    关于你的实际错误。不能设置数据源和修改项属性。这是不允许的。正确的处理方法是将项目添加到数据源中。在数据源中插入此项将导致控件自动更新列表。列表框控件依赖于DS来存储数据,因此所有更改都必须经过此过程。在极少数情况下,您需要能够直接编辑这些项,那么就必须去掉数据源并手动填充项集合。但通常不需要对数据源进行此更新。

    以下代码用于重置数据源

    if(listBox1.SelectedItems != null)
    {
        // Assuming its List of string
        var items = listBox1.DataSource as List<string>;  
    
        // Remove multiple selected items
        var count = listBox1.SelectedItems.Count;    
        while(count != 0)
        {
            var selectedItem = listBox1.SelectedItems[count-1];
            if(items.ContainsKey(selectedItem))
            {
                items.Remove(selectedItem);
            }
            count--;
        }
        listBox1.DataSource = null;
        listBox1.Items.Clear();
        listBox1.DataSource = items;
    }
    

    存储和修改数据源以直接更新数据源的优化方法。使用 ObservableCollection 键入并更新集合以更新UI。

    public class NamesClass : DependencyObject
    {
       public ObservableCollection<string> Names {get; private set; }
       public TestClass()
       {
                this.Names = new ObservableCollection<string>();
       }
    }
    

    现在包括 DependencyObject 类作为数据源并更新名称集合。