C# 将ListBox数据源属性设置为null以更改列表项是否错误?

C# 将ListBox数据源属性设置为null以更改列表项是否错误?,c#,winforms,listbox,datasource,C#,Winforms,Listbox,Datasource,我发现Items.Clear并不总是在通过数据源填充列表框时清除列表框。将数据源设置为Null允许使用Items.Clear()清除它 这样做是错误的吗?这样做是不是我的想法有点错误 谢谢 下面是我准备用来说明我的问题的代码。它包括一个列表框和三个按钮 如果按此顺序单击按钮,一切正常: 用数组按钮填充列表 用数组按钮填充列表项 使用“数据源”按钮填充列表项 但是,如果您首先单击“使用数据源填充列表项”按钮,则单击其他两个按钮中的任何一个都会导致此错误:“System.Windows.Forms.

我发现Items.Clear并不总是在通过数据源填充列表框时清除列表框。将数据源设置为Null允许使用Items.Clear()清除它

这样做是错误的吗?这样做是不是我的想法有点错误

谢谢

下面是我准备用来说明我的问题的代码。它包括一个列表框和三个按钮

如果按此顺序单击按钮,一切正常:

  • 用数组按钮填充列表
  • 用数组按钮填充列表项
  • 使用“数据源”按钮填充列表项
  • 但是,如果您首先单击“使用数据源填充列表项”按钮,则单击其他两个按钮中的任何一个都会导致此错误:“System.Windows.Forms.dll中发生了类型为“System.ArgumentException”的未处理异常,并且“设置数据源属性时无法修改项集合”

    评论

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void btnFillListWithArray_Click(object sender, EventArgs e)
        {
           string[] myList = new string[4];
    
            myList[0] = "One";
            myList[1] = "Two";
            myList[2] = "Three";
            myList[3] = "Four";
            //listBox1.DataSource = null;  <= required to clear list
            listBox1.Items.Clear();
            listBox1.Items.AddRange(myList);
        }
    
        private void btnFillListItemsWithList_Click(object sender, EventArgs e)
        {
            List<string> LStrings = new List<string> { "Lorem", "ipsum", "dolor", "sit" };
            //listBox1.DataSource = null;  <= required to clear list
            listBox1.Items.Clear();            
            listBox1.Items.AddRange(LStrings.ToArray());
    
        }
    
        private void btnFillListItemsWithDataSource_Click(object sender, EventArgs e)
        {
            List<string> LWords = new List<string> { "Alpha", "Beta", "Gamma", "Delta" };
            //listBox1.DataSource = null;  <= required to clear list
            listBox1.Items.Clear();
            listBox1.DataSource = LWords;
    
        }
    }
    
    公共部分类表单1:表单
    {
    公共表格1()
    {
    初始化组件();
    }
    私有void btnFillListWithArray_单击(对象发送方,事件参数e)
    {
    字符串[]myList=新字符串[4];
    myList[0]=“一”;
    myList[1]=“两个”;
    myList[2]=“三”;
    myList[3]=“四”;
    
    //listBox1.DataSource=null;如果您的listbox绑定到一个数据源,那么该数据源将成为listbox的“主”。然后您不清除listbox,但需要清除该数据源。 因此,如果列表框绑定到LWORD,则执行LWORD.clear(),列表框将被清除。 这是正确的行为,因为这就是数据绑定的意义所在

    如果将数据源设置为null,基本上就是告诉listbox它不再是数据绑定的。当然,作为副作用,它会变为空。 但是,根据具体情况,您可能不希望只清除列表框,但您可能希望同时清除数据源和列表框


    假设您想通过GUI清除LWORD,并且LWORD是列表框的源,您按下一个按钮并将数据源设置为null,您会看到列表框变为空,认为LWORD不是空的,但LWORD根本不是空的,然后在这种情况下,这将是一个bug。

    根据Microsoft的说法,它看起来像是set将数据源设置为Null,然后清除列表是可以接受的


    来源:

    根据Microsoft的说法,您需要将数据源设置为null以清除项目。