我发现Items.Clear并不总是清除列表框,当列表框已经通过DataSource填充时。 将DataSource设置为Null后,就可以用Items.Clear()清除它。
这样做是不是错了? 我这样做的思路是不是有点错?
谢谢。
下面是我准备的代码来说明我的问题。它包括一个Listbox和三个按钮。
如果你按这个顺序点击按钮,所有的东西都能正常工作。
但是如果先点击 "用DataSource填充列表项 "按钮,点击其他两个按钮中的任何一个都会导致这个错误。"在System.Windows.Forms.dll中发生了一个类型为'System.ArgumentException'的未处理异常",并提示 "当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;
}
}
如果你的列表框绑定到一个数据源,那么这个数据源就会成为列表框的 "主人"。所以,如果列表框绑定到LWords,你做Lwords.clear(),列表框就会被清空,这是正确的行为,因为这就是数据绑定的目的。
如果你把datasource设置为null,基本上就是告诉listbox它不再是databound了。当然,它的副作用是变成了空。但根据情况,你可能不希望只清除listbox,而是希望同时清除datasource和listbox。
假设你想通过GUI清除LWords,而LWords是你的listbox的源头,你按了一个按钮,你把datasource设置为null,你看到listbox变成了空的,以为LWords不是空的,但LWords根本不是空的,那么在这种情况下,这将是一个bug。
根据微软的说法,似乎将Datasource设置为Null然后Clearing列表是可以接受的。
资料来源:http:/support.microsoft.com。http:/support.microsoft.comkb319927