Как предотвратить запуск события SelectedIndexChanged в ListBox после удаления из него элемента - PullRequest
1 голос
/ 12 января 2012

Я работаю над выбором элемента, который приведет к удалению выбранного элемента.Проблема в том, что когда я удаляю элемент, я выбираю дополнительный элемент, который вызывает другое удаление ...

Как отменить выбор / отменить выбор после удаления выбранного элемента?

Это вызывает мою проблему:

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

Ответы [ 5 ]

10 голосов
/ 12 января 2012

Попробуйте удалить событие 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;
  }
}
4 голосов
/ 12 января 2012

Установка SelectedIndex = -1 вызывает событие SelectedIndexChanged.Убедитесь, что в начале события ничего не выбрано.

void lbMessage_SelectedIndexChanged(object sender, EventArgs e) 
{
    if (lbMessage.SelectedIndex == -1) return;
    ...
}
1 голос
/ 12 января 2012

Если вам так нравится без кнопки удаления, просто сделайте это:

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
    {
    }
}
0 голосов
/ 12 января 2012

Сдвиг при удалении предмета из коллекции предметов заставляет предметы менять свой индекс. Таким образом, это вызывает событие «SelectedIndexChanged» снова в списке. Чтобы предотвратить это, вам нужно установить флаг перед функцией удаления, чтобы указать, что SelectedIndexChange вызывается после удалить и предотвратить событие. Вы можете сделать это следующим образом.

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

Альтернативой, которая может быть проще для понимания, может быть следующая.

    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;
       }
    }
0 голосов
/ 12 января 2012

Что делать, если вы просто либо оберните свой код в if (), который проверяет lbMessage.SelectedIndex == -1, либо напишите проверку для него в начале и вернитесь, если это правда:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...