第二次单击时 ListViewItem 的 ArgumentOutOfRangeException

ArgumentOutOfRangeException for ListViewItem when clicking 2nd time

下面的方法在我第二次单击时出现 ArgumentOutOfRangeException 错误,并说索引 0 不是有效索引。

第一次点击就可以了!?

ListView FullRowSelect 设置为真。

我看到在按下 ALT 和 CONTROL 键时发生了这种情况。如果我在不按下这些键的情况下单击,则不会出现错误,或者如果在单击第二次之前单击空行,则不会出现错误。

有没有办法使用这些组合键并多次点击?

    private void MultipleToText(object sender, MouseEventArgs e)
    {
        if (li.SelectedItems.Count <0)
            return;
        int SetIndex = li.FocusedItem.Index;
        if (Control.ModifierKeys == (Keys.Alt|Keys.Control))
        {
            ListViewItem lvi = li.SelectedItems[0];   // Error happens there 
            DialogResult res = MessageBox.Show( lvi.SubItems[0].Text + " will be deleted. Continue ?", "", MessageBoxButtons.YesNo);
            if (res == DialogResult.No)
                return;
            li.Items.Remove(li.SelectedItems[0]);
            RemoveThisItem(SetIndex);
        }
        else if (Control.ModifierKeys == Keys.None)
        {
            ListViewItem lvi = li.SelectedItems[0];
            DialogResult res = MessageBox.Show("Change the entry " +  lvi.SubItems[0].Text + " ?", "", MessageBoxButtons.YesNo);
            if (res == DialogResult.No)
                return;
            li.Items.Remove(li.SelectedItems[0]);
            for (int i = 0; i < 17; ++i)
                _textBox[i].Text = lvi.SubItems[i].Text;
            RemoveThisItem(SetIndex);
        }
    }

你得到一个错误,因为你的第一个 if 语句永远不会评估为真(和 return),因为计数永远不会低于 0。因此,即使你的列表是空的,它仍然会尝试删除第一个元素,抛出 ArgumentOutOfRangeException。

您的 if 语句应该检查它是否等于 0,例如:

 if (li.SelectedItems.Count == 0)

当您按下除 Alt/Control 以外的任何按键时,什么都不会发生,因为您没有处理除这些之外的任何按键事件,

 Control.ModifierKeys == Keys.None

意味着没有按键被按下,而不是除了 Alt/Control 被按下之外的任何东西。