Отмена события ListBox SelectedIndexChange - PullRequest
14 голосов
/ 01 апреля 2010

Можно ли отменить событие SelectedIndexChange для списка в приложении winforms? Это кажется настолько логичным, что я должен упускать из виду некоторую простую функцию. По сути, я выскакивал в окне сообщения с вопросом, действительно ли пользователь хочет перейти к другому элементу, так как это изменит интерфейс, и я не хочу, чтобы его изменения были потеряны. Я хотел бы иметь возможность отменить событие, если пользователь не сохранил то, над чем он работает. Есть ли лучший способ сделать это?

Ответы [ 6 ]

17 голосов
/ 01 апреля 2010

Вы не можете отменить его.

То, что я сделал всего пару дней назад, - это наличие переменной с последним выбранным индексом. Затем, когда событие запускается, вы спрашиваете пользователя, хочет ли он сохранить, это делается в обработчике событий. Если пользователь выбрал «Отмена», вы снова меняете идентификатор.

Проблема в том, что это вызовет повторное событие. Так что я использовал бул, просто говоря «Запретить». И в верхней части обработчика событий у меня есть:

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.
9 голосов
/ 15 июля 2011

Это точно метод @ Оскара Кьеллина, но с изюминкой. То есть на одну переменную меньше и с выбранным событием изменения индекса, которое действительно ведет себя как выбранное событие изменения индекса. Я часто задаюсь вопросом, почему выбранное событие с измененным индексом запускается, даже если я нажимаю на точно такой же выбранный элемент. Здесь это не так. Да, это отклонение, так что будьте уверены, если вы хотите, чтобы это было там.

    int _selIndex = -1;
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex == _selIndex)
            return;

        if (MessageBox.Show("") == DialogResult.Cancel)
        {
            listBox1.SelectedIndex = _selIndex;
            return;
        }

        _selIndex = listBox1.SelectedIndex;
        // and the remaining part of the code, what needs to happen when selected index changed happens
    }
5 голосов
/ 11 ноября 2010

Я только что столкнулся с этой проблемой. Что я сделал, когда пользователь вносит изменения, я устанавливаю ListBox.Enabled = false; Это запрещает им выбирать другой индекс. Как только они сохранят или откажутся от своих изменений, я установлю ListBox.Enabled = true; Вероятно, не так гладко, как подсказка, но она выполняет свою работу.

3 голосов
/ 28 мая 2014

Более элегантно, используйте свойство Tag:

        if ((int)comboBox.Tag == comboBox.SelectedIndex)
        {
            // Do Nothing
        }
        else
        {
            if (MessageBox.Show("") == DialogResult.Cancel)
            {
                comboBox.SelectedIndex = (int)comboBox.Tag;
            }
            else
            {
                // Reset the Tag
                comboBox.Tag = comboBox.SelectedIndex;

                // Do what you have to
            }
        }
2 голосов
/ 01 апреля 2010

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;
        }
    }
}
0 голосов
/ 25 декабря 2014

Это мой способ отменить SelectionChange для ComboBox.Я думаю, что это также может соответствовать ListBox.

private bool comboBox_CancelSelection = false;
private int comboBox_LastSelectedIndex = -1;

private void comboBox_SelectedIndexChanged(object sender, EventArgs e) {
    if (comboBox_CancelSelection) {
        comboBox_CancelSelection = false;
        return ;
    }

    // Handle Event

    if (!comoBox_CancelSelection) {
        comboBox_LastSelectedIndex = comboBox.SelectedIndex; 
    } else {
        comboBox.SelectedIndex = comboBox_LastSelectedIndex;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...