Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否获取组合框的当前索引?_C#_.net_Winforms_Indexing_Combobox - Fatal编程技术网

C# 是否获取组合框的当前索引?

C# 是否获取组合框的当前索引?,c#,.net,winforms,indexing,combobox,C#,.net,Winforms,Indexing,Combobox,假设我有一个包含以下值的组合框: Black Red Blue 我现在选择了红色的Red。如果用户然后点击backspace并点击enter,我将捕获组合框的向下键事件 在这种情况下,我想从组合框中的项目列表中删除红色 但是,由于在调用KeyDown时组合框的文本为空,因此SelectedIndex为-1 目前,我有一个如下的解决方案: private void myComboBox_SelectedIndexChanged(object sender, EventArgs e) {

假设我有一个包含以下值的组合框:

Black
Red
Blue
我现在选择了红色的
Red
。如果用户然后点击backspace并点击enter,我将捕获组合框的
向下键
事件

在这种情况下,我想从组合框中的项目列表中删除红色

但是,由于在调用
KeyDown
时组合框的文本为空,因此
SelectedIndex
为-1

目前,我有一个如下的解决方案:

private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    currentMyComboBoxIndex = myComboBox.FindStringExact(myComboBox.Text);
}
哪个有效。。但我只是想知道是否有更好的方法。看起来这条路可能会断裂,看起来有点乱。如果不使用成员变量跟踪组合框的当前索引并在索引更改时进行更新,是否就无法获取组合框的当前索引


谢谢。

您可以使用以下代码将组合框的选定项作为对象获取:

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);

你这样做很好。必须将选定索引保留在内存中,因为删除文本时,它将返回-1作为SelectedIndex。你也可以用这种方法获取索引

private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    currentMyComboBoxIndex = myComboBox.SelectedIndex;
}

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

用法

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;
    }
功能

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;
    }

啊,是的,我想这是有道理的。谢谢你的小重构!用户在没有手册的情况下独自发现这一点的几率约为0.01%。不要创建难以使用的用户界面。