如何使用C#/ WinForms在运行时从ComboBox中删除项目

时间:2016-06-17 16:43:48

标签: c# winforms combobox

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

以下是我现在使用的代码。

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

当我点击组合框并开始输入然后按回车键时,我会听到一个窗口声音(不确定是哪一个),然后该项目被添加到列表中。 当我点击下拉按钮时,我看到那里的项目,上面是我输入的文字。当我点击删除时,项目消失(至少我认为它会消失)然后当我点击其他地方时我得到了这个异常

  

System.ArgumentOutOfRangeException:InvalidArgument =值'0'对'index'无效。
  参数名称:index

当我点击下拉按钮时,我仍然看到空格

所以我的问题是如何正确删除ComboBox中的项目:)

此外,如果有更好的东西,那么这个东西的组合框也会提到它们,TY

2 个答案:

答案 0 :(得分:1)

您听到的Windows声音实际上是一声错误。组合框不接受按键输入,所以它会向你发出“不!”的嘟嘟声。当然,您的代码也会运行,添加项目,但这并不会改变组合框认为您将焦点设置为错误时按Enter键这一事实。如果你想要当前的设计,你需要在收到后按Enter键,这样组合框就不会继续尝试处理它。为此,请将e.SuppressKeyPress设置为true。

您获得的异常是因为您删除了组合框中的所有项目,但代码的其他部分会尝试获取项目#0(第一项)的文本。没有第一个项目,因为您删除了它,因此抛出异常。我不确定是什么代码负责这个,因为我看不到它,但我猜你已经为像SelectedIndexChanged事件编写了一个处理程序。

确实,这是一个非常不寻常的界面。组合框的目的是向用户显示选项列表,而不是允许他们键入多个选项。如果需要,请使用多行文本框。至少就是这样,他们将能够看到他们输入的所有内容。

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

  

当我点击下拉按钮时,我仍然看到空格

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

答案 1 :(得分:0)

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