Действительно ли возможно отменить событие SelectedIndexChange для поля списка на приложении winforms? Это походит на такую логическую вещь иметь это, я должен пропускать некоторую легкую функцию. В основном я открывался окно сообщения, спрашивающее, хочет ли пользователь действительно переместиться в другой объект, поскольку это изменит UI, и я не хочу, чтобы их изменения были потеряны. Я хотел бы смочь отменить событие в случае, если пользователь не сохранил то, что они продолжают работать. Существует ли лучший способ сделать это?
Вы не можете отменить его.
Всего пару дней назад я создал переменную с последним выбранным индексом. Затем, когда событие срабатывает, вы спрашиваете пользователя, хочет ли он сохранить, это делается в обработчике событий. Если пользователь выбрал «Отмена», вы снова измените идентификатор.
Проблема в том, что это приведет к повторному срабатыванию события. Так что я использовал bool, просто говоря «Inhibit». И в верхней части обработчика событий у меня есть:
if(Inhibit)
return;
Затем ниже, где вы задаете вопрос, вы делаете что-то вроде этого:
DialogResult result = MessageBox.Show("yadadadad", yadada cancel etc);
if(result == DialogResult.Cancel){
Inhibit = true; //Make sure that the event does not fire again
list.SelectedIndex = LastSelectedIndex; //your variable
Inhibit = false; //Enable the event again
}
LastSelectedIndex = list.SelectedIndex; // Save latest index.
SelectedIndexChanged нельзя отменить. Таким образом, у вас есть только один реальный вариант:
private int? currentIndex;
public void ListBox_SelectedIndexChanged(sender, EventArgs args) {
if (currentIndex.HasValue && currentIndex.Value != listBox1.SelectedIndex) {
var res = MessageBox.Show("Do you want to cancel edits?", "Cancel Edits", MessageBoxButtons.YesNo);
if (res == DialogResult.Yes) {
currentIndex = (listBox1.SelectedIndex == -1 ? null : (int?) listBox1.SelectedIndex);
} else {
listBox1.SelectedIndex = currentIndex.Value;
}
}
}