在我的应用程序中,我想通过按下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和一个删除项目的功能,但我想现在不会有太大问题,对吧?
编辑:当没有任何物品离开且控制失去焦点时,通常会发生崩溃。
答案 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.
}
}