Окно сообщения появляется дважды C # - PullRequest
3 голосов
/ 08 сентября 2011

У меня есть выпадающий список с именем cmbSubjects.Его цель в моем проекте - сменить тему в конкурсе викторины.Я хочу, чтобы, когда выбранный элемент был изменен, в окне сообщения должен был быть задан вопрос к мастеру проверки, хотят ли они продолжить, если в поле со списком остались вопросы без ответа до изменения.Если они ответят «НЕТ», то в выпадающем списке должен быть выбран ранее выбранный пункт.Я получил этот код, чтобы сделать это, но проблема в том, что окно сообщений появляется дважды, если мастер quix выбирает НЕТ в окне сообщений.Я выяснил причину (после входа в код с точки останова) в том, что, когда окно сообщения возвращает NO, мой код изменяет выбранное значение комбинированного списка на его предыдущее значение, что вызывает событие cmbSubjects_SelectedIndexChanged.Я попытался изменить код, добавив переменную, чтобы подсчитать, сколько раз появилось окно сообщения, чтобы предотвратить это.Проблема в том, что он появляется только после первого изменения значения в выпадающем списке.Код ниже на самом деле модифицированный.Кто-нибудь может мне с этим помочь?Заранее спасибо.(Я использую C #)

private void cmbSubjects_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (pnlAvailable.Controls.Count != 0)
        {
            if (countMsg < 1)
            {
                DialogResult res = MessageBox.Show("There are still available questions. Are you sure you want to change the subject?", "Changing subject...", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                if (res == DialogResult.Yes)
                {
                    cmbIndex = cmbSubjects.SelectedIndex;
                    countMsg = 0;
                    switch (cmbSubjects.SelectedIndex)
                    {
                        case 0:
                            subject = "life";
                            break;
                        case 1:
                            subject = "math";
                            break;
                        case 2:
                            subject = "physical";
                            break;
                        case 3:
                            subject = "technology";
                            break;
                        case 4:
                            subject = "vocational";
                            break;
                    }

                    GenQstBtns();
                }
                else if (res == DialogResult.No)
                {
                    countMsg = 1;
                    cmbSubjects.SelectedIndex = cmbIndex;
                }
            }
        }
    }

Ответы [ 5 ]

4 голосов
/ 08 сентября 2011

Вы можете использовать SelectionChangeCommitted событие.

Не используйте SelectedIndexChanged или SelectedValueChanged для захвата пользовательских изменений, поскольку эти события также возникают, когда выбор изменяется программно.

Таким образом, если вы используете это событие после программного изменения выбранного элемента, это событие не будет запущено снова

1 голос
/ 08 сентября 2011

Просто сравните новый индекс с текущим сохраненным индексом:

private void cmbSubjects_SelectedIndexChanged(object sender, EventArgs e)
{
    if (pnlAvailable.Controls.Count != 0)
    {
        if (cmbSubjects.SelectedIndex != cmbIndex)
        {
            DialogResult res = MessageBox.Show("There are still available questions. Are you sure you want to change the subject?", "Changing subject...", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            if (res == DialogResult.Yes)
            {
                cmbIndex = cmbSubjects.SelectedIndex;
                switch (cmbSubjects.SelectedIndex)
                {
                    case 0:
                        subject = "life";
                        break;
                    case 1:
                        subject = "math";
                        break;
                    case 2:
                        subject = "physical";
                        break;
                    case 3:
                        subject = "technology";
                        break;
                    case 4:
                        subject = "vocational";
                        break;
                }

                GenQstBtns();
            }
            else if (res == DialogResult.No)
            {
                cmbSubjects.SelectedIndex = cmbIndex;
            }
        }
    }
}
1 голос
/ 08 сентября 2011

Вам нужно запретить запуск события IndexChanged при его ручном изменении.

Вы можете отключить событие:

            else if (res == DialogResult.No)
            {
                countMsg = 1;

                cmbSubjects.SelectedIndexChanged -= cmbSubjects_SelectedIndexChanged;
                cmbSubjects.SelectedIndex = cmbIndex;
                cmbSubjects.SelectedIndexChanged += cmbSubjects_SelectedIndexChanged;

                fireEvent = true;
            }
1 голос
/ 08 сентября 2011

Возможно, у вас есть несколько обработчиков, подключенных к событию SelectedIndexChanged?Вы можете просмотреть все обработчики, прикрепленные к событию, в отладчике.

0 голосов
/ 08 сентября 2011

Если я правильно понимаю, что вы пытаетесь сделать, возможно, проще всего было бы добавить переменную bool executingSelectedIndexChanged, инициализированную в false.В вашем методе вы можете затем проверить это bool, и если оно ложно, установите его в true и откройте свой MessageBox.Затем снова установите значение false, если ответ «да».Если bool был yes в начале вашего метода, просто установите его в false и верните:

private bool executingSelectedIndexChanged  = false;
private void cmbSubjects_SelectedIndexChanged(object sender, EventArgs e)
{
    // NEW CODE HERE
    if (executingSelectedIndexChanged)
    {
        executingSelectedIndexChanged = false;
        return;
    }

    if (pnlAvailable.Controls.Count != 0)
    {
        if (countMsg < 1)
        {

            // NEW CODE HERE
            executingSelectedIndexChanged  = true;

            DialogResult res = MessageBox.Show("There are still available questions. Are you sure you want to change the subject?", "Changing subject...", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            if (res == DialogResult.Yes)
            {
                // NEW CODE HERE
                executingSelectedIndexChanged = false;

                cmbIndex = cmbSubjects.SelectedIndex;
                countMsg = 0;
                switch (cmbSubjects.SelectedIndex)
                {
                    case 0:
                        subject = "life";
                        break;
                    case 1:
                        subject = "math";
                        break;
                    case 2:
                        subject = "physical";
                        break;
                    case 3:
                        subject = "technology";
                        break;
                    case 4:
                        subject = "vocational";
                        break;
                }

                GenQstBtns();
            }
            else if (res == DialogResult.No)
            {
                countMsg = 1;
                cmbSubjects.SelectedIndex = cmbIndex;
            }
        }
    }
}
...