将ListBox DataSource属性设置为null以更改列表项是错误的吗?

时间:2015-02-23 20:09:14

标签: c# winforms listbox datasource clear

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

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

感谢。

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

如果按此顺序单击按钮,一切都有效:

  1. 使用数组按钮填写列表
  2. 使用数组按钮填写列表项
  3. 使用DataSource按钮填写列表项
  4. 但是,如果您单击"使用DataSource填充列表项"按钮首先,单击其他两个按钮之一会导致此错误:"未处理的类型' System.ArgumentException'发生在System.Windows.Forms.dll"使用"设置DataSource属性时无法修改Items集合。"

    评论

    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;
    
        }
    }
    

2 个答案:

答案 0 :(得分:2)

根据Microsoft的说法,将Datasource设置为Null然后清除列表是可以接受的。

来源:http://support.microsoft.com/kb/319927

答案 1 :(得分:1)

如果您的列表框绑定到数据源,那么该数据源将成为&#39; master&#39;的列表框。然后,您不清除列表框,但需要清除数据源。 因此,如果列表框绑定到LWords,则执行Lwords.clear()并清除列表框。 这是正确的行为,因为这就是数据绑定的全部内容。

如果将数据源设置为null,则基本上告诉列表框它不再是数据绑定。当然,作为其副作用,它变得空洞。 但根据情况,您可能不希望清除列表框,但您可能希望清除数据源和列表框。

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