Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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#/WinForms从组合框中删除项_C#_Winforms_Combobox - Fatal编程技术网

如何在运行时使用C#/WinForms从组合框中删除项

如何在运行时使用C#/WinForms从组合框中删除项,c#,winforms,combobox,C#,Winforms,Combobox,我有一个组合框,我已经可以添加项目,我想能够删除我选择的项目时,我点击删除键 这是我现在使用的代码 private void commandComboBox_KeyDown(object sender, KeyEventArgs e) { var myComboBox = (ComboBox)sender; string text = myComboBox.Text; if (e.KeyCode == Keys.Enter)

我有一个组合框,我已经可以添加项目,我想能够删除我选择的项目时,我点击删除键

这是我现在使用的代码

    private void commandComboBox_KeyDown(object sender, KeyEventArgs e)
    {
        var myComboBox = (ComboBox)sender;
        string text = myComboBox.Text;
        if (e.KeyCode == Keys.Enter)
        {
            myComboBox.Items.Add(myComboBox.Text); // Add
        }

        if (e.KeyCode == Keys.Delete)
        {
            myComboBox.Items.Remove(myComboBox.SelectedItem);
        }
    }
当我在组合框中单击并开始键入,然后按enter键时,我听到一个windows声音(不确定是哪个声音),然后该项被添加到列表中。 当我点击下拉按钮时,我看到了上面输入的文本。当我点击“删除”时,该项目会消失(至少我认为是这样),然后当我点击其他地方时,我会得到这个异常

System.ArgumentOutOfRangeException:InvalidArgument=值“0”对“索引”无效。
参数名称:索引

而且,当我按下下拉按钮时,仍然可以看到空白

所以我的问题是如何正确地从组合框中删除项目:)


此外,如果有更好的东西,那么这种东西的组合框也可以提及,TY

您听到的Windows声音实际上是一声错误的蜂鸣音。组合框不接受按enter键,因此它会向您发出“否”的蜂鸣声。当然,您的代码也会运行,添加项目,但这不会改变这样一个事实,即组合框认为您在焦点为错误时按enter键。如果您打算使用当前的设计,则需要在收到回车键后按回车键,这样组合框就不会继续尝试处理它。为此,请将
e.SuppressKeyPress
设置为true

得到的例外情况是,您删除了组合框中的所有项,但代码的其他部分尝试获取项0(第一项)的文本。没有第一项,因为您删除了它,因此引发异常。我不确定是什么代码导致了这种情况,因为我看不到它,但我猜您已经为SelectedIndexChanged事件编写了一个处理程序

事实上,这是一个非常不寻常的界面。组合框的用途是为用户提供一个选项列表,而不是允许他们键入多个选项。如果需要,请使用多行文本框。至少这样,他们就能看到他们输入的所有东西

或者,您可以使用经典的界面习惯用法,其中有一个要键入的文本框,该文本框与Add按钮一起工作,将键入的文本添加到ListBox控件。“删除”按钮删除列表框中当前选定的项目。“清除”按钮将清除列表框中的所有项目。是的,它的使用和解释一样令人困惑。尽可能避免这些。在UI设计糟糕的旧时代,它们更受欢迎

而且,当我按下下拉按钮时,仍然可以看到空白


这些实际上不是空的空间。嗯,是的,但不是真的。:-)我的意思是,它们不是表示单个“空”项的占位符。这正是当整个组合框为空(不包含任何项)时所看到的。由于它不包含任何项目,因此无法自动调整其下拉窗口的高度,因此它使用固定大小

我对ComboBox也有同样的问题。请注意,只有当用户在删除项目但未选择新项目后点击其他位置时,才会发生错误。通过在删除后添加新项目的选择来解决此问题。还将最后一项作为特例处理。见下面的工作代码:

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    ComboBox comboBox = sender as ComboBox;

    switch (e.KeyCode)
    {
        case Keys.Delete:
            if ((comboBox.DroppedDown) && (comboBox.SelectedItem != null))
            {
                if (comboBox.Items.Count == 1)  // Removing Last Item
                {
                    comboBox.DroppedDown = false;
                    comboBox.Text = string.Empty;
                    comboBox.Items.Clear();
                }
                else
                {
                    comboBox.Items.Remove(comboBox.SelectedItem);
                    comboBox.SelectedIndex = comboBox.Items.Count - 1;
                }
                e.Handled = true;
            }
            break;
    }
}

有些事情似乎很奇怪。如何将myComboBox.Text添加到自身?该错误似乎表示您正试图访问组合框的索引0,但如果组合框为空,则索引0将不存在。哪一行导致该错误?你是否让SelectedIndexChanged事件做了些什么?只是想澄清一下,我的代码中没有对组合框的任何其他引用,这是我为组合框设置的唯一事件处理程序。顺便说一句,感谢Cody编辑我的问题:)此格式仍然是新的。关键是请将图像上传到我们的托管网站imgur.com。使用工具栏上的链接执行此操作。这确保了图像永远不会“过期”,而且这个问题在未来很长一段时间内都是有意义的。(当你发布此信息时,你可能无法上传图像。我不确定。发布图像需要一定的最低声誉才能阻止垃圾邮件。现在你拥有10-15的声誉,你将能够发布图像。因此,请记住一些事情。)否则:问得好,有充分的记录,欢迎来到Stack Overflow!他还在做
myComboBox.Items.Add(myComboBox.Text)。您是否能够在组合框中键入内容,然后将其添加到组合框中?在任何情况下,带有单独添加/删除按钮的单独文本框都是更好的方法this@user是的,(令人困惑地)很好。组合框实际上是文本框和列表框的组合。因此,您可以在文本框中键入并使用
.text
检索该文本。您可以在列表框中设置值,并以不同的方式检索这些值。令人困惑的是,当您在列表框中选择一个项目时,它的文本出现在文本框中,从而变成
.text
。但是用户可以独立于列表框中的项目在文本框中编辑该文本,这是您键入新文本时发生的情况。感谢您解释我的代码发生了什么以及为什么它不能按预期工作。(猜这就是您尝试创建第一个windows窗体应用程序时发生的情况:P)