好的,所以我有这个函数,它通过gui中的choise和新选择的feed来清除列表......非常简单:一个具有构造函数和覆盖的ToString方法的类被抛入List并作为数据源对于列表框...我做的任何测试,这完美无缺,但不是在这个特定的程序,我无法弄清楚为什么。我不是绝望,我只是非常好奇。
我发现如果我只是转换List<>它的工作原理......但为什么呢?
这是我的原始代码不起作用:
private void QaControl(string _itemNo, int _curIndex)
{
List<QaControlPoint> list = new List<QaControlPoint>();
//remove old ones from list
if (listBox1.DataSource != null)
{
list = (List<QaControlPoint>)listBox1.DataSource;
for (int n = listBox1.Items.Count - 1; n >= 0; --n)
{
QaControlPoint qcp = (QaControlPoint)listBox1.Items[n];
if (_boxList.IndexOf(qcp.link_box) >= _curIndex)
list.Remove(qcp);
}
}
string fs = service.getQa(Int32.Parse(_itemNo), "R");
string[] temp = fs.Split('@');
for (int a = 0; a < temp.Length - 1; a++)
list.Add(new QaControlPoint(temp[a], _boxList[_curIndex]));
listBox1.DataSource = list;
}
此代码,我使用简单数组作为数据源工作完美。
private void QaControl(string _itemNo, int _curIndex)
{
List<QaControlPoint> list1 = new List<QaControlPoint>();
//remove old ones from list
if (listBox1.DataSource != null)
{
//convert to list here
QaControlPoint[] rcp = (QaControlPoint[])listBox1.DataSource;
list1.AddRange(rcp);
QaControlPoint rcp2;
for (int n = listBox1.Items.Count - 1; n >= 0; --n)
{
rcp2 = (QaControlPoint)listBox1.Items[n];
if (_boxList.IndexOf(rcp2.link_box) >= _curIndex)
list1.Remove(rcp2);
}
}
string fs = service.getQa(Int32.Parse(_itemNo), "R");
string[] temp = fs.Split('@');
for (int a = 0; a < temp.Length - 1; a++)
list1.Add(new QaControlPoint(temp[a], _boxList[_curIndex]));
//convert back to array here
QaControlPoint[] rcnew = list1.ToArray();
listBox1.DataSource = rcnew;
}
答案 0 :(得分:0)
这里只是猜测,但在第一个示例中,DataSource属性永远不会更改。当然,您正在添加和删除项目,但是当您设置DataSource时,您将其设置为已有的相同对象实例。
在第二个示例中,您使用的是新实例(新的List,然后是新的Array)。
我的猜测是,ListBox非常智能,可以识别出在设置为同一个实例时没有更改DataSource的值,因此它不会执行非常昂贵的刷新步骤。这看起来像WinForms,我不是很熟悉,但我不认为List<T>
实现了ListBox捕获集合更改事件的必要接口。
请改为尝试:
private void QaControl( string _itemNo, int _curIndex ) {
List<QaControlPoint> list = new List<QaControlPoint>();
//remove old ones from list
if ( listBox1.DataSource != null ) {
List<QaControlPoint> oldList = (List<QaControlPoint>) listBox1.DataSource;
list.AddRange( oldList );
for ( int n = listBox1.Items.Count - 1; n >= 0; --n ) {
QaControlPoint qcp = (QaControlPoint) listBox1.Items[n];
if ( _boxList.IndexOf( qcp.link_box ) >= _curIndex )
list.Remove( qcp );
}
}
string fs = service.getQa( Int32.Parse( _itemNo ), "R" );
string[] temp = fs.Split( '@' );
for ( int a = 0; a < temp.Length - 1; a++ )
list.Add( new QaControlPoint( temp[a], _boxList[_curIndex] ) );
listBox1.DataSource = list;
}