【问题标题】:Can't delete second or third selected index无法删除第二个或第三个选定索引
【发布时间】:2019-12-05 13:50:17
【问题描述】:

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


    }
    }

【问题讨论】:

  • 因为您删除了该项目然后尝试获取引用,所以 selectedindex 将更改为 -1 如果它只有 1.... 您需要记住数字,或者从末尾开始做 lisbox3,然后 2,然后 1
  • @BugFinder 你是什么意思从最后开始?像这样放代码?对不起,如果我问简单的问题' lstBoxThree.Items.RemoveAt(lstBoxThree.SelectedIndex) lstBoxTwo.Items.RemoveAt(lstBoxTwo.SelectedIndex); lstBoxOne.Items.RemoveAt(lstBoxOne.SelectedIndex);'
  • 是的,正如我所说.. listbox3 然后 2 然后 1
  • @BugFinder 这不起作用,我仍然遇到同样的错误。如果您能帮助我更多,将不胜感激。谢谢!
  • 只要您在三个ListBoxes 中分别选择了一个项目,您发布的代码就会按预期工作。这意味着异常发生在您没有向我们展示的代码中。如果我是一个赌徒,我会说你可能有一个 SelectedIndexChanged 事件正在触发,而不是检查 SelectedIndex 是否大于 -1,但你需要向我们展示你所有的代码,最好是可以肯定的是整个例外。

标签: c# winforms listbox


【解决方案1】:

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

BtnDelete_Click 内部,当您从lstBoxOne 中删除所选项目时,这会导致lstBoxOne.SelectedIndex 发生更改。这会导致LstBoxOne_SelectedIndexChanged 触发lstBoxTwolstBoxThree 中删除项目。当LstBoxOne_SelectedIndexChanged 完成并返回到BtnDelete_Click 时,lstBoxTwo.SelectedIndexlstBoxThree.SelectedIndex 都是-1 并且由于将-1 传递给RemoveAt 而发生Exception

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

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2022-10-15
    • 2011-02-14
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多