listbox使用DataSource进行数据绑定和删除,大家肯定都会,
写这个随笔只是因为。。。。这是一年半以前刚进公司的我遗留的bug,现在看看当时竟然没有解决 - -
现在写个测试程序,写个随笔记录一下,当时萌新的我。。。
首先声明了一个类,要绑定的类型。
//声明一个全局集合 public List<BindingType> bi; //声明一个绑定类型的类 public class BindingType { public string Name { get; set; }//名称 public DateTime Time { get; set; }//时间 }
然后两个方法,一个添加,一个删除。问题就出现在删除当中。
private void button1_Click(object sender, EventArgs e) { //初始化添加数据 bi = new List<BindingType>() { new BindingType { Name=Guid.NewGuid().ToString("N"),Time=DateTime.Now}, new BindingType { Name=Guid.NewGuid().ToString("N"),Time=DateTime.Now}, new BindingType { Name=Guid.NewGuid().ToString("N"),Time=DateTime.Now}, new BindingType { Name=Guid.NewGuid().ToString("N"),Time=DateTime.Now}, }; //绑定到listbox HashSet<BindingType> hs = new HashSet<BindingType>(bi); BindingSource bs = new BindingSource(); bs.DataSource = hs; listBox1.DataSource = bs; listBox1.DisplayMember = "Name"; } private void button2_Click(object sender, EventArgs e) { //删除集合选中数据 foreach (BindingType item in listBox1.SelectedItems) { bi.Remove(item); } //重新绑定新的集合 如果此处bi这个集合数据为空就会出现显示错误 HashSet<BindingType> hs = new HashSet<BindingType>(bi); BindingSource bs = new BindingSource(); bs.DataSource = hs; listBox1.DataSource = bs; listBox1.DisplayMember = "Name"; }
左边是添加效果图,右边是全部删除之后会提示绑定的错误。
没有使用 Items 进行数据绑定是因为需要取绑定中的数据。
当时记得弄了大半天都没有解决,最近刚好有个新的接口接入需要类似的功能,导致这个问题再次出现。。。
想了一下使用 Remove,Clear是没办法删除的因为属于绑定数据,然后试试给他赋值一个新的 BindingSource。
//删除集合选中数据 foreach (BindingType item in listBox1.SelectedItems) { bi.Remove(item); } if (bi.Count < 1)//结合没有数据 { //重新new BindingSource bs = new BindingSource(); listBox1.DataSource = bs; } else { //重新绑定新的集合 如果此处bi这个集合数据为空就会出现显示错误 HashSet<BindingType> hs = new HashSet<BindingType>(bi); BindingSource bs = new BindingSource(); bs.DataSource = hs; listBox1.DataSource = bs; listBox1.DisplayMember = "Name"; }
到此。。。算是解决了不会显示错误,然后说看看这个DataSource是个什么东西,结果发现 “默认为null” 这几个字。。。。瞬间自己都笑了,
直接 listBox1.DataSource = null;
当时的我还真的萌新。。这么简单的问题我竟然没有解决。。。活到老,学到老。