ComboBox.Item.AddRange(string[])与ComboBox.DataSource=string[]的区别是什么?

3

那么,我有两个选项:

aComboBox.Item.AddRange(stringArray);
aComboBox.SelectedItem = stringFromStringArray;

并且

aComboBox.DataSource = stringArray;
aComboBox.SelectedItem = stringFromStringArray;

现在,第一种方法在初始化时速度非常慢(大约5-6倍)。虽然它确实将选定的项目设置正确,但仍然很慢,所以我决定使用第二种方法。
但是,如果我使用第二种方法,在执行第二个命令时,aComboBox内的Items数组还没有设置,因此选定的项目是索引1处的项目,而不是指定的项目。
问题是,如何在保持第一种方法的功能性的同时获得第二种方法的性能?
编辑:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ComboBoxTest
{
class MainWindow : Form
{
    string[] list = new string[1548];
    TableLayoutPanel panel = new TableLayoutPanel();

    public MainWindow() : base()
    {
        Height = 2000;
        Width = 1000;

        Random rand = new Random();

        for (int i = 0; i < 1547; i++)
        {
            list[i] = rand.Next().ToString();
        }

        list[1547] = 5.ToString();

        Button button = new Button();
        button.Text = "Press me";
        button.Click += Button_Click;

        panel.Controls.Add(button, 0, 0);

        panel.Height = 2000;
        panel.Width = 1000;

        Controls.Add(panel);

        Show();
    }

    private void Button_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 36; i++)
        {
            ComboBox box = new ComboBox();
            box.DataSource = list;  //box.Items.AddRange(list);
            box.SelectedItem = 5.ToString();

            panel.Controls.Add(box, 0, i+1);
        }
    }
}
}

我使用这个程序重现了问题。如果你将它更改为addRange(),那么它将需要更多的时间,但这样会设置项目。

尝试在SelectedItem上添加断点,然后查看ComboBox。 如果你设置其中一个,另一个将为空(DataSource vs. Items)。 ComboBox似乎查找Items来检查列表中是否存在字符串,这就是为什么使用DataSource方法会失败的原因。

额外问题:为什么所有ComboBoxes都像一个(尝试更改值)?


无法重现第二个案例。请在独立项目中测试并发布一个简单的复制代码。 - Reza Aghaei
只需在项目中搜索,直到找到指定的项目,并将选择的索引设置为它。 - Cjen1
我测试了10、100、1000、10000和100000个项目。它正常工作。它首先设置“DataSource”,然后设置所选项目。可能你的“stringFromStringArray”不存在于数组中。 - Reza Aghaei
stringFromStringArray 存在于该数组中,这是我检查的第一件事。 - Karlovsky120
2个回答

3
问题是,如何在保留第一个的功能的情况下获得第二个的性能?
如果您想让它正常工作,可以将box.SelectedItem = 5.ToString();这一行移到添加框到面板后的那一行。
当您为组合框使用DataSource时,只有在您的窗体上存在组合框时,设置SelectedItem才有效。
我不确定性能,但肯定是功能。
额外问题:为什么所有ComboBox都像一个ComboBox(尝试更改值)?
因为它们绑定到相同的DataSource。实际上,它们使用单个BindingManagerBase
您可以为它们使用不同的BindingSource。此外,您可以将它们绑定到list.ToList()

我并没有说你应该将它们添加到表单中,而是在它们被添加到面板后设置 SelectedItem。当你将它们添加到面板时,它们存在于表单上。但是关于性能方面,我认为最好让你之前的问题得到答复 :) - Reza Aghaei
是的,由于某种原因,在我的主程序中无法正常工作。问题是我在创建之后才添加所有内容。所以ComboBox所在的面板?我是在将ComboBox放置在方法中处理ComboBox的方法之后再添加它的。所以comboBox直到我在层次结构中上升了几个方法之后才存在。而那个面板,它仍然不存在,我在创建完成后还必须将其添加到一个选项卡中。然后将该选项卡添加到另一个选项卡中。依此类推。有什么想法吗? - Karlovsky120
是的,我会切换回Java。 - Karlovsky120
如果我对于如何提高加载组合框性能有任何想法,我会通知您的 :) 顺便说一下,既然这篇文章回答了您的两个问题,如果您可以投票并接受答案,那将非常好 :) - Reza Aghaei
如果您能够帮我翻译以下与编程有关的内容,我将感激不尽。是的,尽管我讨厌这个答案,但它是正确的。我真的很讨厌C#处理GUI的方式。它太难以忍受了,甚至与Java相比也是如此。 - Karlovsky120
显示剩余6条评论

0
使用DataSource方法并使用FindString方法查找所需选定文本的索引:
string[] arrString = {"hello", "how r u", "fine" };
comboBox1.DataSource = arrString;
comboBox1.SelectedIndex=comboBox1.FindString("fine");
MessageBox.Show(comboBox1.SelectedIndex.ToString());

由于“DataSource”和“Item”之间的关系,它无法工作。 它也将在索引处失败。 - Karlovsky120
什么是关系?使用FindStringExact。 - Amir

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