如何使用C#将comboBox中选定的项目设置为与我的字符串匹配?

236

我有一个字符串 "test1",我的组合框包含 test1test2test3。如何将选定的项目设置为 "test1"?也就是说,如何将我的字符串与组合框中的一个项目匹配?

我想到了下面这行代码,但它不起作用。

comboBox1.SelectedText = "test1"; 

它为什么不工作?当这行代码运行时会发生什么? - Kate Gregory
@KateGregory 它只是将“test1”字符串连接到现有文本中。 - solujic
如果您知道该项的值,可以使用以下方法:comboBox1.SelectedValue = 您的字符串的值; - César León
SelectedText 将“选定”的文本更改为 test1。如果没有进行“选择”(标记的文本),则文本将插入插入符号位置。 - AaA
27个回答

330

这应该能解决问题:

Combox1.SelectedIndex = Combox1.FindStringExact("test1")

我认为这是一个更好的答案,因为你有一个返回值,可以将其暂时保存在变量中,并使用它来测试是否已找到你要查找的值。 - Áxel Costas Pena
如果combox1中有多个“test1”值,该怎么办? - thoitbk
1
根据MSDN上的https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.findstringexact%28v=vs.110%29.aspx,方法`FindStringExact()` “查找与指定字符串匹配的组合框中的第一项。” - dub stylee

222

您尝试过使用Text属性吗?这对我有效。

ComboBox1.Text = "test1";

SelectedText属性是combo box文本框中可编辑文本的选定部分。


8
这是否只是将文本放置在ComboBox可编辑区域内,而不是从列表中选择相关项目?如果列表项集合包含对象而不仅仅是字符串,那么我怀疑这不会选择适当的ListItem对象,而只是在ComboBox上设置Text属性。 - TabbyCool
9
它确实设置了控件的SelectedValue属性。 - Henryk
4
注意:在填充下拉框后才能设置此参数。 - Antoine Rodriguez
1
当 ComboBox.DropDownStyle = ComboBoxStyle.DropDownList 时,它无法工作。 - Jayant Varshney
14
下拉框的下拉样式是DropDownList,且.Text = "some text"无效。这个解决方案对我很有效:Combox1.SelectedIndex = Combox1.FindStringExact("test1")。 - Mayank
显示剩余4条评论

53

假设你的组合框不是数据绑定的,你需要在表单的“items”集合中找到该对象的索引,然后将“selectedindex”属性设置为相应的索引。

comboBox1.SelectedIndex = comboBox1.Items.IndexOf("test1");

请记住,IndexOf函数如果未找到该项可能会抛出ArgumentException异常。


1
请记住,应该使用SelectedINDEX而不是SelectedITEM...编译器不会提示错误,只是无法设置组合框的值。 - Rob
你不喜欢那些没有抛出任何异常,但却无法正常工作的逻辑错误吗? - Spence
这是选择项目,但不调用组合框的onChange事件。 - mrid
只有在将 null 传递给 IndexOf 方法时,它才会抛出异常。如果未找到该项,则仅返回 -1(这恰好是 SelectedIndex 的有效值)。 - Ben Voigt

44

如果ComboBox中的项目是字符串,您可以尝试:

comboBox1.SelectedItem = "test1";

20
不是。 - Frederik Gheysels
1
救了我的一天!所选项目必须匹配类型 - 对我来说就是这样!我一直在想为什么所选项目没有设置,即使该项目明显存在 - 结果是类型不匹配! - Sudhanshu Mishra
为了完整起见,最好从上面的链接中获取描述,特别是因为此答案执行了匹配检查,建议使用其他答案,包括@norbertB的首选答案:当您将SelectedItem属性设置为对象时,ComboBox会尝试使该对象成为列表中当前选择的对象。如果在列表中找到该对象,则它将显示在ComboBox的编辑部分中,并将SelectedIndex属性设置为相应的索引。如果列表中不存在该对象,则SelectedIndex属性保持其当前值。 - DanG

17
ComboBox1.SelectedIndex= ComboBox1.FindString("Matching String");

尝试在Windows窗体中执行此操作。


14

对我而言,只有这个方法可行:

foreach (ComboBoxItem cbi in someComboBox.Items)
{
    if (cbi.Content as String == "sometextIntheComboBox")
    {
        someComboBox.SelectedItem = cbi;
        break;
    }
}

如果您在ComboBox中设置了自己的对象作为项目,那么请将ComboBoxItem替换为其中之一,例如:

foreach (Debitor d in debitorCombo.Items)
{
    if (d.Name == "Chuck Norris")
    {
        debitorCombo.SelectedItem = d;
        break;
    }
}

2
这对我有用,但是你需要小心,确保你的ComboBox中的项实际上是ComboBoxItems,因为也有可能放入其他项。 - Grant
这在WinRT 8.1中运行得很好。我实际上像Dave在他的SelectItemByValue()解决方案中写的那样,在一个扩展方法中包装了顶层的foreach,这确实是完美的解决方案。 - Speednet

10

SelectedText用于获取或设置组合框中所选项目的字符串编辑器中的实际文本,如此处所述。如果设置以下内容,则无法进行编辑:

comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;

使用:

comboBox1.SelectedItem = "test1";

或者:

comboBox1.SelectedIndex = comboBox1.Items.IndexOf("test1");

1
如果comboBox1的Items为空,comboBox1.Items.IndexOf...会产生NullReferenceException异常风险。 - Gary
@Gary:不,它不会,即使集合中没有任何项(Items.Count == 0),Items也始终是一个非空集合。 - Ben Voigt

10

我使用了一个扩展方法:

public static void SelectItemByValue(this ComboBox cbo, string value)
{
    for(int i=0; i < cbo.Items.Count; i++)
    {
        var prop = cbo.Items[i].GetType().GetProperty(cbo.ValueMember);
        if (prop!=null && prop.GetValue(cbo.Items[i], null).ToString() == value)
        {
             cbo.SelectedIndex = i;
             break;
        }
    } 
}

然后只需调用该方法:

ddl.SelectItemByValue(value);

6
comboBox1.SelectedItem.Text = "test1";

5

这个解决方案基于我所做的一些修改,而原本是基于MSDN

  • It finds exact or PART of string and sets it.

    private int lastMatch = 0;
    private void textBoxSearch_TextChanged(object sender, EventArgs e)
    {
        // Set our intial index variable to -1.
        int x = 0;
        string match = textBoxSearch.Text;
        // If the search string is empty set to begining of textBox
        if (textBoxSearch.Text.Length != 0)
        {
            bool found = true;
            while (found)
            {
                if (comboBoxSelect.Items.Count == x)
                {
                    comboBoxSelect.SelectedIndex = lastMatch;
                    found = false;
                }
                else
                {
                    comboBoxSelect.SelectedIndex = x;
                    match = comboBoxSelect.SelectedValue.ToString();
                    if (match.Contains(textBoxSearch.Text))
                    {
                        lastMatch = x;
                        found = false;
                    }
                    x++;
                }
            }
        }
        else
            comboBoxSelect.SelectedIndex = 0;
    }
    

我希望我能帮到您!


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