繁体   English   中英

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

[英]How to delete items from a ComboBox at runtime using C# / WinForms

我有一个组合框,我已经可以向其中添加项目,并且我希望能够在按下删除键时删除我选择的项目。

这是我现在使用的代码。

    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' 的值对 'index' 无效。
参数名称:索引

此外,当我点击下拉按钮时,我仍然看到空白区域

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

另外,如果有更好的东西,那么这种东西的 ComboBox 也请提及它们,TY

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

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

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

或者,您可以为此使用经典的界面习惯用法,其中有一个文本框可以输入,该文本框与“添加”按钮一起使用以将输入的文本添加到 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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM