简体   繁体   English

从列表中删除项目后如何防止SelectedIndexChanged事件在ListBox中触发

[英]How to prevent SelectedIndexChanged event from firing in ListBox after removing an item from it

I am working on selecting an item which will cause deletion of selected item. 我正在选择一个项目,这将导致所选项目的删除。 The problem is that when I delete an item I am selecting additional item which cause another deletion... 问题是,当我删除一个项目时,我正在选择会导致另一个删除的其他项目...

How do I unselest/deselect after deleting selected item? 删除所选项目后如何取消/取消选择?

This causes my problem: 这导致我的问题:

    void lbMessage_SelectedIndexChanged(object sender, EventArgs e)
    {
        DialogResult result = new DialogResult();

        result = MessageBox.Show("Are you sure you want to remove this item?", "Removal Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

        if (result == DialogResult.Yes)
        {
            lbMessage.Items.Remove(lbMessage.SelectedItem); 
            lbMessage.SelectedIndex = -1;
        }
        else
        {
        }
    }

    private void btnAddMessage_Click(object sender, EventArgs e)
    {
        lbMessage.Items.Add(txtMessage.Text);
        txtMessage.Text = string.Empty;
    }

Try removing the SelectedIndexChanged event before removing the item, then add it back in: 在删除项目之前,请尝试删除SelectedIndexChanged事件,然后将其重新添加到:

private void lbMessage_SelectedIndexChanged(object sender, EventArgs e) {
  if (MessageBox.Show("Are you sure you want to remove this item?", 
                      "Remove Confirmation", 
                      MessageBoxButtons.YesNo,
                      MessageBoxIcon.Question) == DialogResult.Yes) {
    lbMessage.SelectedIndexChanged -= lbMessage_SelectedIndexChanged;
    lbMessage.Items.Remove(lbMessage.SelectedItem);
    lbMessage.SelectedIndexChanged += lbMessage_SelectedIndexChanged;
  }
}

Setting SelectedIndex = -1 is raising the SelectedIndexChanged event. 设置SelectedIndex = -1会引发SelectedIndexChanged事件。 Check if there is nothing selected at the start of the event. 检查事件开始时是否未选择任何内容。

void lbMessage_SelectedIndexChanged(object sender, EventArgs e) 
{
    if (lbMessage.SelectedIndex == -1) return;
    ...
}

If you like it that way without a delete button then just do this: 如果您喜欢这种方式而没有删除按钮,则只需执行以下操作:

bool isAfterDelete = false;
void lbMessage_SelectedIndexChanged(object sender, EventArgs e)
{
    if (isAfterDelete)
    {
        isAfterDelete = false;
        return;
    }
    DialogResult result = new DialogResult();

    result = MessageBox.Show("Are you sure you want to remove this item?", 
                             "Removal Confirmation", 
                             MessageBoxButtons.YesNo, 
                             MessageBoxIcon.Information);

    if (result == DialogResult.Yes)
    {
        lbMessage.Items.Remove(lbMessage.SelectedItem); 
        isAfterDelete = true;
        lbMessage.SelectedIndex = -1;
    }
    else
    {
    }
}

What if you just either wrap your code an in if() that checks for lbMessage.SelectedIndex == -1, or write a check for it at the beginning and return if it's true: 如果只是将代码包装在if()中以检查lbMessage.SelectedIndex == -1,或者在开始时对其进行写检查并返回true,该怎么办:

void lbMessage_SelectedIndexChanged(object sender, EventArgs e)
{
  if(lbMessage.SelectedIndex == -1)
    return;

    DialogResult result = new DialogResult();

    result = MessageBox.Show("Are you sure you want to remove this item?", "Removal Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

    if (result == DialogResult.Yes)
    {
        lbMessage.Items.Remove(lbMessage.SelectedItem); 
        lbMessage.SelectedIndex = -1;
    }
}

The shear act of removing the item from the Items collection causes the items to change their index. 从Items集合中删除项目的剪切动作导致项目更改其索引。 This thus calls the "SelectedIndexChanged" event again on the list box. 因此,这将再次在列表框中调用“ SelectedIndexChanged”事件。 To prevent this, you would need to set a flag before the remove function to indicate that the SelectedIndexChange is being called after the remove and prevent the event from occuring. 为防止这种情况,您需要在remove函数之前设置一个标志,以指示在remove之后调用SelectedIndexChange并防止事件发生。 You can do that by the following. 您可以按照以下步骤进行操作。

    private bool afterRemove = false;
    void lbMessage_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (afterRemove)
        {
            afterRemove = false;
            return;
        }

        DialogResult result = new DialogResult();

        result = MessageBox.Show("Are you sure you want to remove this item?", "Removal Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

        if (result == DialogResult.Yes)
        {
            afterRemove = true;
            lbMessage.Items.Remove(lbMessage.SelectedItem); 
            // Another call to "lbMessage_SelectedIndexChanged" is made right here.
       }
    }

    private void btnAddMessage_Click(object sender, EventArgs e)
    {
        lbMessage.Items.Add(txtMessage.Text);
        txtMessage.Text = string.Empty;
    }

An alternative that might be easier to understand could be the following. 可能更容易理解的替代方法如下。

    private bool afterRemove = false;
    void lbMessage_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (afterRemove)
            return;

        DialogResult result = new DialogResult();

        result = MessageBox.Show("Are you sure you want to remove this item?", "Removal Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

        if (result == DialogResult.Yes)
        {
            afterRemove = true;
            lbMessage.Items.Remove(lbMessage.SelectedItem); 
            // Another call to "lbMessage_SelectedIndexChanged" is made right here.
            afterRemove = false;
       }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 填充时如何防止ComboBox触发另一个ComboBox的SelectedIndexChanged事件 - How to prevent a ComboBox from firing another ComboBox's SelectedIndexChanged event when filling it 如何防止ListBox.SelectedIndexChanged事件? - How to prevent ListBox.SelectedIndexChanged event? 如何在 selectedindexchanged 事件中从列表视图中选择项目? - How to select item from listview in selectedindexchanged event? SelectedIndexChanged事件未针对1个列表项触发 - SelectedIndexChanged event not firing for 1 list item 从列表框中删除项目后如何删除和扣除总费用? - How to remove and deduct total cost after removing an item from listbox? asp.net c#在从服务器端代码更改索引时阻止触发selectedindexchanged事件 - asp.net c# prevent firing selectedindexchanged event while changing index from serverside code “SelectedIndexChanged”在ListBox中的“Items.Clear()”之后没有触发 - “SelectedIndexChanged” not firing after “Items.Clear()” in ListBox 如何从另一个类中获取listBox1_SelectedIndexChanged事件的值? - How to get the value from a listBox1_SelectedIndexChanged event from another class? 从列表中选择项目时,列表框selectedIndexChanged不会触发 - Listbox selectedIndexChanged doesn't fire when selecting an item from the list ListBox1_SelectedIndexChanged 未触发 - ListBox1_SelectedIndexChanged not firing
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM