ComboBox.Item.AddRange(string [])VS. ComboBox.DataSource = string []

时间:2016-03-14 22:28:06

标签: c# winforms performance combobox

所以,我有两个选择:

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

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

现在,第一个问题在初始化时会慢得多(大约5-6次)。它确实正确地设置了所选项目,但仍然很慢,所以我决定使用第二个项目。

但是,如果我使用第二个命令,则执行第二个命令时aComboBox中的Items数组尚未设置,因此所选项目是索引1处的项目,而不是指定的项目。“ / p>

问题是,如何使用第一个功能获得第二个的性能?

编辑:

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。 如果您设置了一个,则另一个将为空(DataSourceItems)。 ComboBox似乎会查看Items以检查列表中是否存在字符串,以及DataSource方法失败的原因。

奖金问题:为什么所有ComboBoxes都作为一个工作(尝试更改值)?

2 个答案:

答案 0 :(得分:2)

  

问题是,如何获得第二个的表现   第一个的功能?

如果您希望它正常工作,您可以在向面板添加框后将行box.SelectedItem = 5.ToString();移动到该行。

当您对组合框使用DataSource时,只有在表单中存在组合框时才设置SelectedItem

我不确定性能,但确定功能。

  

奖金问题:为什么所有ComboBox都作为一个工作(尝试改变   价值)?

因为它们绑定到相同的DataSource。实际上他们使用的是单BindingManagerBase

您可以为它们使用不同的BindingSource。您也可以将它们绑定到list.ToList()

答案 1 :(得分:0)

使用数据源方法并使用FindString方法查找所需选定文本的索引:

string[] arrString = {"hello", "how r u", "fine" };
comboBox1.DataSource = arrString;
comboBox1.SelectedIndex=comboBox1.FindString("fine");
MessageBox.Show(comboBox1.SelectedIndex.ToString());