无法从崩溃中删除ComboBox中的项目

时间:2014-01-12 16:30:43

标签: c# combobox crash

在我的应用程序中,我想通过按下ComboBox按钮向用户提供从Del控件中删除项目的选项。我已经设法有效地完成了第一部分,但我似乎无法实现的实际上是从控件中删除一个项目(特别是当它是剩下的最后一个项目时),而整个应用程序都没有崩溃。这是为什么?这是我的代码。当删除最后一项并且包含消息 InvalidArgument ='0'的值对'index'无效时,它总是抛出 ArgumentOutOfRange 异常。

private void cboSource_KeyDown(object sender, KeyEventArgs e)
{
    deleteItem(cboSource, e);
}

private void cboTarget_KeyDown(object sender, KeyEventArgs e)
{
    deleteItem(cboTarget, e);
}

private void deleteItem(ComboBox comboBox, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Delete)
    {
        comboBox.Items.Remove(comboBox.SelectedItem);
    }
}

我有两个ComboBox和一个删除项目的功能,但我想现在不会有太大问题,对吧?

编辑:当没有任何物品离开且控制失去焦点时,通常会发生崩溃。

4 个答案:

答案 0 :(得分:1)

我通过关闭下拉列表解决了这个问题,然后删除了最后一个元素。

private void cmbUserLogin_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Delete && cmbUserLogin.DroppedDown)
    {
        if (cmbUserLogin.Items.Count > 0)
        {
            int currentItem = cmbUserLogin.SelectedIndex;
            if (currentItem >= 0)
            {
                // todo

                if (cmbUserLogin.Items.Count == 1)
                    cmbUserLogin.DroppedDown = false;
                cmbUserLogin.Items.RemoveAt(currentItem);
            }
        }

        e.Handled = true;
    }
}

答案 1 :(得分:0)

您可以在组合框中添加一个默认项目,该项目永远不会被删除,也可能会添加到第一个项目中,或者您可以初始化空项目列表以避免崩溃。

答案 2 :(得分:0)

我使用您的代码在WPF中创建了一个小样本,它不会崩溃。从我看到你没有使用WPF。尽管如此,为了让您感觉更好 - 您的代码应该是开箱即用的。但是我从你的帖子中看到了一些事情:

1.当您尝试使用无法获取该项目的索引操作列表中的项目时,会出现错误ArgumentOutOfRange。因此,如果列表中有3个项目并且您尝试访问list.Items [3],那么您将收到该错误。

2. InvalidArgument=Value of '0' is not valid for 'index'告诉我,您不仅要访问不存在的索引,而且还要访问索引为零的元素,假设组合框列表中至少包含一个元素。所以发生的事情是,当组合框已经为空时,你以某种方式试图删除组合框中的最后一项。因此错误。 要解决这个问题:

 //before delete, check if combo box has items
    if(comobBox.Items.Count > 0)      
    {
         comboBox.Items.Remove(comboBox.SelectedItem);
         //edit: this might help with that last crash (from comments)
         if(comboBox.Items.Count == 0)
             comboBox.SelectedItem = null;
    }

如果有相同代码的多个入口点,甚至没有提到多线程可能性,那么检查并不是一种不好的做法。
此外,检查所选项目是否也为空也可能不是一个坏主意。

答案 3 :(得分:0)

这是我通过搞乱代码而弄清楚的一个修复。我不完全确定它为什么有效,但它确实有效。对我来说,这绝不是一个可行的解决方案,因为它仍然是一个“解决方案”,因为我正在解决这个问题并且实际上并没有解决它。直到有人找到更好的方式,我想我会坚持这一点。这是代码:

private void deleteItem(ComboBox comboBox, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Delete)
    {
        if (comboBox.Items.Count == 1)
        {
            comboBox.Items.Clear();

            return;
        }

        comboBox.Items.Remove(comboBox.SelectedItem);

        e.Handled = true; // I do not think this really contributes anything in this case.
    }
}