无法删除第二个或第三个选定的索引

Can't delete second or third selected index

我有 3 个列表框,当我选择了三个内容并单击删除按钮时,它删除了第一个列表框中的文本,但随后出现异常,指出值 -1 对索引无效。这是我当前的代码:

lstBoxOne.Items.RemoveAt(lstBoxOne.SelectedIndex);
lstBoxTwo.Items.RemoveAt(lstBoxTwo.SelectedIndex);
lstBoxThree.Items.RemoveAt(lstBoxThree.SelectedIndex); 

想知道他们是否有一种方法可以通过单击按钮删除所有三个选定的文本

编辑:我现在放了满满期待的图片 Full exception

编辑 2:这是一个包含完整代码的示例

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void LstBoxOne_SelectedIndexChanged(object sender, EventArgs e)
        {
            var deleteD = lstBoxOne.SelectedIndex;
            lstBoxTwo.SelectedIndex = deleteD;
            lstBoxThree.SelectedIndex = deleteD;
    }


    private void BtnInsert_Click(object sender, EventArgs e)
    {
        lstBoxOne.Items.Add(this.txtOne.Text);
        lstBoxTwo.Items.Add(this.txtTwo.Text);
        lstBoxThree.Items.Add(this.txtThree.Text);
        this.txtOne.Focus();
        this.txtOne.Clear();
        this.txtTwo.Focus();
        this.txtTwo.Clear();
        this.txtThree.Focus();
        this.txtThree.Clear();
    }

    private void BtnDelete_Click(object sender, EventArgs e)
    {
        lstBoxOne.Items.RemoveAt(lstBoxOne.SelectedIndex);
        lstBoxTwo.Items.RemoveAt(lstBoxTwo.SelectedIndex);
        lstBoxThree.Items.RemoveAt(lstBoxThree.SelectedIndex);


    }
private void LstBoxTwo_SelectedIndexChanged(object sender, EventArgs e)
        {
            var deleteD = lstBoxTwo.SelectedIndex;
            lstBoxOne.SelectedIndex = deleteD;
            lstBoxThree.SelectedIndex = deleteD;
        }

        private void LstBoxThree_SelectedIndexChanged(object sender, EventArgs e)
        {
            var deleteD = lstBoxThree.SelectedIndex;
            lstBoxOne.SelectedIndex = deleteD;
            lstBoxTwo.SelectedIndex = deleteD;
        } 
    }


    }
    }

问题是由于 lstBoxOne 上的 SelectedIndexChanged 事件引起的。

BtnDelete_Click 中,当您从 lstBoxOne 中删除所选项目时,这会导致 lstBoxOne.SelectedIndex 发生变化。这会导致 LstBoxOne_SelectedIndexChanged 之前 将项目从 lstBoxTwolstBoxThree 中删除。当LstBoxOne_SelectedIndexChanged完成并且returns到BtnDelete_Click时,lstBoxTwo.SelectedIndexlstBoxThree.SelectedIndex都是-1并且由于传递而发生Exception -1RemoveAt.

private void LstBoxOne_SelectedIndexChanged(object sender, EventArgs e)
{
   var deleteD = lstBoxOne.SelectedIndex;
   lstBoxTwo.SelectedIndex = deleteD;
   lstBoxThree.SelecteIndex = deleteD;
}

private void DeleteBtn_Click(object sender, EventArgs e)
{
   lstBoxOne.Items.RemoveAt(lstBoxOne.SelectedIndex); //This line triggers the SelectedIndexChanged event on lstBoxOne.
   // By the time we get back to this function, lstBoxTwo and lstBoxThree have had 
   // their SelectedIndex set to -1. That is what is causing the exception to occur.

   lstBoxTwo.Items.RemoveAt(lstBoxTwo.SelectedIndex); //Ooops! lstBoxTwo.SelectedIndex was set to -1 in LstBoxOne_SelectedIndexChanged.
}

纠正此问题的一个简单方法是在尝试删除任何项目之前存储每个 ListBox 的选定索引。另外,通过检查 -1.

来保护自己
private void DeleteBtn_Click(object sender, EventArgs e)
{
   int lstBoxOneIdx = lstBoxOne.SelectedIndex;
   int lstBoxTwoIdx = lstBoxTwo.SelectedIndex;
   int lstBoxthreeIdx = lstBoxThree.SelectedIndex;

   if (lstBoxOneIdx > -1)
   {
      lstBoxOne.Items.RemoveAt(lstBoxOneIdx);
   }

   if (lstBoxTwoIdx > -1)
   {
      lstBoxTwo.Items.RemoveAt(lstBoxTwoIdx);
   }

   if (lstBoxThreeIdx > -1)
   {
      lstBoxThree.Items.RemoveAt(lstBoxThreeIdx);
   }
}