【问题标题】:How to delete items from a ComboBox at runtime using C# / WinForms如何在运行时使用 C#/WinForms 从 ComboBox 中删除项目
【发布时间】:2016-06-17 16:43:47
【问题描述】:

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

这是我现在使用的代码。

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

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

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

另外,如果有比 ComboBox 更好的东西,请提一下,TY

【问题讨论】:

  • 有些奇怪。您如何将myComboBox.Text 添加到自身?该错误似乎意味着您正在尝试访问组合框的索引 0,但如果组合框为空,则索引 0 将不存在。
  • 哪一行会导致该错误?你有 SelectedIndexChanged 事件做些什么吗?
  • 只是为了澄清我的代码中没有对组合框的任何其他引用,这是我为组合框设置的唯一事件处理程序
  • 顺便说一句,谢谢 Cody 编辑我的问题 :) 这种格式还是新手
  • 关键是请将图片上传到我们的托管网站 imgur.com。使用工具栏上的链接来执行此操作。这确保了图像永远不会“过期”,并且这个问题在未来很长一段时间内总是有意义的。 (当您发布此内容时,您可能无法上传图片。我不确定。为了阻止垃圾邮件,发布图片需要一定的最低声望。凭借您现在拥有的 10-15 声望,您将能够发布图片。所以,要记住一些事情。)否则:好问题,有据可查,欢迎来到 Stack Overflow!

标签: c# winforms combobox


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 他也在做myComboBox.Items.Add(myComboBox.Text);。您是否可以在组合框中键入然后将其添加到组合框中?无论如何,带有单独添加/删除按钮的单独文本框是更好的方法
  • @user 是的,这(令人困惑)很好。组合框实际上是文本框和列表框的组合。因此,您可以在文本框中键入并使用.Text 检索该文本。您可以在列表框中拥有值并以不同的方式检索这些值。令人困惑的是,当您在列表框中选择一个项目时,它的文本会出现在文本框中,从而变成.Text。但是用户可以独立于列表框中的项目编辑文本框中的文本,这就是您键入新文本时发生的情况。
  • 感谢您解释我的代码发生了什么以及为什么它没有按预期工作。 (猜猜这就是当你尝试制作你的第一个 Windows 窗体应用程序时发生的事情:P)
【解决方案2】:

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

【讨论】:

  • 非常好 - 优雅地解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多