消息框出现两次c#

本文关键字:两次 消息 | 更新日期: 2023-09-27 18:07:53

我有一个名为cmbSubjects的组合框。在我的项目中,它的目的是在智力竞赛中改变主题。我希望当所选项目被更改时,一个消息框应该询问测试管理员,如果在更改之前组合框中有关于该主题的未回答的问题,他们是否愿意继续。如果他们回答NO,组合框应该选择它之前选择的项目。我得到了这个代码做到这一点,但问题是消息框出现两次,如果quix主选择NO在消息框上。我发现原因(在从断点进入代码之后)是,当消息框返回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;
                }
            }
        }
    }

消息框出现两次c#

你可以使用selectionchangecomcommitted事件。

不要使用SelectedIndexChanged或SelectedValueChanged来捕获用户更改,因为当选择以编程方式更改时也会引发这些事件。

因此,如果您在以编程方式更改所选项目后使用此事件,则此事件将不会再次触发

是否可能有多个处理程序连接到SelectedIndexChanged事件?您可以在调试器中查看附加到事件的所有处理程序。

只需对照当前保存的索引检查新索引:

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

您需要在手动更改时抑制IndexChanged事件的触发

您可以禁用该事件:

            else if (res == DialogResult.No)
            {
                countMsg = 1;
                cmbSubjects.SelectedIndexChanged -= cmbSubjects_SelectedIndexChanged;
                cmbSubjects.SelectedIndex = cmbIndex;
                cmbSubjects.SelectedIndexChanged += cmbSubjects_SelectedIndexChanged;
                fireEvent = true;
            }

如果我正确理解了您要做的事情,那么最简单的事情可能是添加一个初始化为false的bool变量executingSelectedIndexChanged。在你的方法中,你可以检查这个bool值,如果它是false,将它设置为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;
            }
        }
    }
}