所以,我有两个选择:
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
。
如果您设置了一个,则另一个将为空(DataSource
与Items
)。 ComboBox
似乎会查看Items
以检查列表中是否存在字符串,以及DataSource
方法失败的原因。
奖金问题:为什么所有ComboBoxes
都作为一个工作(尝试更改值)?
答案 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());