为什么BindingList(Of T)没有AddRange成员?

10

我认为标题已经概括了我的问题,但是还有一些背景需要说明:

当我的一个表单加载时,它会向绑定列表中添加几千个(大约30k)对象。当我的应用程序第一次加载时,它需要多秒钟(大约10秒左右)才能循环遍历对象列表并使用add函数将其添加到BindingSource中。然而,当在具有相同加载代码的后续表单上发生这种情况时,只需要一两秒钟。

所以我的问题是:
1. 为什么BindingList(Of T)没有AddRange成员?
2. 使用AddRange函数会使初始和后续添加更快吗?
3. 为什么代码的一个版本运行比相同版本慢?

感谢您提供的任何帮助。


应用程序加载时是否同时加载了表单?这可能是导致慢速的原因吗? - Tim Murphy
1
经过很长时间的追踪,我终于找到了一个(不确定是否是唯一的)问题,即DataGridView DefaultRowTemplate ContextMenuProperty。当设置此属性时,在向底层BindingSource添加项目时会增加相当多的时间。 - chris.au
1
为了以后参考,我发现这个网址http://msdn.microsoft.com/en-us/library/ha5xt0d9.aspx有关于“高效使用快捷菜单”的内容。我吃过亏才学到这个教训。 - chris.au
2个回答

3

我不确定为什么没有AddRange方法可用。您可以轻松地编写自己的扩展方法:

    /// <summary>
    /// Adds all the data to a binding list
    /// </summary>
    public static void AddRange<T>(this BindingList<T> list, IEnumerable<T> data)
    {
        if (list == null || data == null)
        {
            return;
        }

        foreach (T t in data)
        {
            list.Add(t);
        }
    }

谢谢。这真是一个节省时间的工具。 - John Foll

0

来自楼主

经过很长时间的追踪,我终于找到了一个问题(不确定是否是唯一的),即 DataGridView DefaultRowTemplate ContextMenuProperty。当设置此属性时,在向基础 BindingSource 添加项目时会添加相当多的时间。

供以后参考,我发现了这个 msdn.microsoft.com/en-us/library/ha5xt0d9.aspx,使用“高效使用快捷菜单”。我已经吃过这个亏了。

在上述文章中,MSDN链接建议不要在每个单元格中使用快捷菜单,尤其是将快捷菜单放在模板中。相反,用户应该为整个控件创建一个单一的快捷菜单,或者处理CellContextMenuStripNeededRowContextMenuStripNeeded事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接