获取ComboBox的当前索引?

4

假设我有一个带有以下选项的 ComboBox:

Black
Red
Blue

我当前选择了红色。如果用户按下退格键并按下回车键,那么我会捕获ComboBox的KeyDown事件。
在此事件中,我想从ComboBox的项目列表中删除红色。
但是,由于在调用KeyDown时ComboBox的文本为空,所以SelectedIndex为-1。
目前我有一个解决方法,如下所示:
private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    currentMyComboBoxIndex = myComboBox.FindStringExact(myComboBox.Text);
}

这个方法是可行的...但我在想是否有更好的方法。这种方式似乎容易出错,而且有些凌乱。有没有不需要使用成员变量来跟踪索引并在索引更改时更新它的方法来获取ComboBox的当前索引?

谢谢。


大约有0.01%的几率用户能够在没有手册的情况下自己发现这个问题。不要创建难以使用的用户界面。 - Hans Passant
3个回答

10
你的方法是正确的。你需要将选定的索引保留在内存中,因为当文本被删除时,它会返回-1作为SelectedIndex。你也可以按照这种方式获取索引。
private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    currentMyComboBoxIndex = myComboBox.SelectedIndex;
}

1
啊,是的,我想那很有道理。还感谢你进行了小重构! - Tahmid Meridda

2
您可以使用以下代码获取组合框中选择的项目作为对象:
ComboBox comboBox = new ComboBox();
// Initialize combo box
comboBox.Items.Add("Black");
comboBox.Items.Add("Red");
comboBox.Items.Add("Blue");
// Get selected one
string current = (string)comboBox.SelectedItem;

此外,可以使用以下代码之一轻松删除所选项目:
// By item
comboBox.Items.Remove(comboBox.SelectedItem);
// By Index
comboBox.Items.RemoveAt(comboBox.SelectedIndex);

0

没有内置函数可以获取给定值的索引,但是您可以通过此函数找到索引。

用法

int cmbindex  = CmbIdxFindByValue("YourValue", cmbYourComboBox);

功能:

private int CmbIdxFindByValue(string text, ComboBox cmbCd)
    {
        int c = 0; ;
        DataTable dtx = (DataTable)cmbCd.DataSource;
        if (dtx != null)
        {
            foreach (DataRow dx in dtx.Rows)
            {
                if (dx[cmbCd.ValueMember.ToString()].ToString() == text)
                    return c;
                c++;
            }
            return -1;
        }else
            return -1;
    }

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