c#listbox fed List表现得非常奇怪

时间:2012-09-07 13:40:32

标签: c# list listbox datasource

好的,所以我有这个函数,它通过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;
    }

1 个答案:

答案 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;
    }