Сдвиг при удалении предмета из коллекции предметов заставляет предметы менять свой индекс. Таким образом, это вызывает событие «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;
}
}