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

Is it wrong to set ListBox DataSource property to null in order to change list Items?

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

这样做是不是错了?这样做是不是我的想法有点不对?

谢谢。

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

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

  1. 用数组按钮填充列表
  2. 使用数组按钮填充列表项
  3. 使用数据源按钮填充列表项

但是如果您先单击 "Fill List Items With DataSource" 按钮,单击其他两个按钮中的任何一个都会导致此错误:"An unhandled exception of type 'System.ArgumentException' occurred in System.Windows.Forms.dll" 和 "Items collection cannot be modified when the DataSource property is set."

评论?

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;

    }
}

如果您的列表框绑定到数据源,则该数据源将成为列表框的 'master'。然后您不清除列表框,但您需要清除数据源。 因此,如果列表框绑定到 LWords,则执行 Lwords.clear() 并且列表框将被清除。 这是正确的行为,因为这就是数据绑定的意义所在。

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

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

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

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