该死的不好用的控件。
使用它绑定到数据源上:如list<T>,arrayList等数据源。
你对此类数据源的数据进行增加删除时候,Listbox控件显示不会跟数据源同步。
如果是grid控件它就是自动同步的。
此时,如果去调用Listbox.items.add(item),系统会给出“设置数据源后不允许修改数据项”。意思就是不允许调用该方法了。
如此,你要实现上下移动数据项就难了啊。
解决方法一:
重新定义一个List,它里面的数赋值原来的。然后再把它关联到Listbox.datasoure。就可以实现同步更新listbox视图了。
list orgin=new list();
list.add(item);
list.add(item);
list.add(item);
listbox.datasource=orgin.
orgin.add(item2);
//此时listbox不会同步更新。
list newDataSource=new list();
list.addrange(orgin);
listbox.datasource=newDatasouse.
//可以实现同步更新。
解决方法2:
用bindingsource做中间人。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using MyListControlSample;
namespace WindowsFormsApplication2
{
public partial class Form3 : Form
{
private ArrayList USStates;
public Form3()
{
InitializeComponent();
USStates = new ArrayList();
USStates.Add(new USState("Alabama", "AL"));
USStates.Add(new USState("Washington", "WA"));
USStates.Add(new USState("West Virginia", "WV"));
USStates.Add(new USState("Wisconsin", "WI"));
USStates.Add(new USState("Wyoming", "WY"));
BindingSource bs = new BindingSource();
bs.DataSource = USStates;
this.listBox1.DataSource = bs;
}
private void buttonRemove_Click(object sender, EventArgs e)
{
USState temp = (USState)this.listBox1.SelectedItem;
USStates.Remove(temp);
BindingSource bs = new BindingSource();
bs.DataSource = USStates;
this.listBox1.DataSource = bs;
}
private void buttonAdd_Click(object sender, EventArgs e)
{
USStates.Add(new USState("OuYang", "Viola"));
BindingSource bs = new BindingSource();
bs.DataSource = USStates;
this.listBox1.DataSource = bs;
}
private void buttonMoveUp_Click(object sender, EventArgs e)
{
int index = this.listBox1.SelectedIndex;
if (index==0)
{
return;
}
int up = index - 1;
USStates[index] = USStates[up];
USStates[up] = this.listBox1.SelectedItem;
BindingSource bs = new BindingSource();
bs.DataSource = USStates;
this.listBox1.DataSource = bs;
this.listBox1.ClearSelected();
this.listBox1.SelectedItem = USStates[up];
}
}
}