MessageBox.Show导致在ComboBox.SelectionChangeCommitted期间还原所选值

时间:2013-02-07 20:09:44

标签: c# winforms .net-3.5

我在ComboBox.SelectionChangeCommitted事件中遇到了一些奇怪的行为,我想知道是否有人对此有解释。

在我的事件处理程序中,我调用了MessageBox.Show。如果我在ComboBox中选择了一个新值,并且我的代码会导致MessageBox弹出,我会看到我的selceted值恢复为原始值。

调试时,我发现在MessageBox.Show之前所选值是正确的。 MessageBox.Show将控制权交还给用户,直到我点击“是”或“否”。单击其中一个选项后,控件将返回调试器,并且在更改之前,ComboBox的值将恢复为原始值。

我没有以编程方式在其他位置设置所选值,所以我不知道为什么值会被还原。如果事件处理程序未弹出MessageBox,则不会恢复所选的。

在我处理事件之前,我是否有可能将控制权交还给UI,这与它有关。如果是这样,有没有一个干净的方式绕过它?目前我在弹出MessageBox然后重置之前我正在捕捉我选择的值,但我宁愿不必诉诸“黑客”来解决问题。

3 个答案:

答案 0 :(得分:3)

问题可能是显示消息框的行为导致组合框下拉菜单关闭,从而放弃了用户可能做出的任何未提交的选择。

与下拉组合框,突出显示列表中的项目,然后按 Esc 键基本相同。请注意,突出显示的项目不会成为所选项目,因为您在解除组合框之前从未选择它。 (您可以在“运行”对话框中轻松尝试。)

这是为什么在整个地方抛出消息框是一个坏主意的众多原因之一(其他原因包括如何在视觉上将消息框用于用户,以及most of them don't even bother to read them anyway)。喜欢使用消息框作为调试辅助工具的程序员在尝试调试UI代码时经常被这种情况所困扰。

解决方案是:

  1. 推迟验证,直到提交/提交整个表单,此时您可以显示一个消息框,而不会有放弃任何当前下拉组合框的风险。

  2. 找到显示验证错误的替代方法(即非模态)。 WinForms提供了一个ErrorProvider控件,您可以将其用于此目的。典型用法是在控件旁边显示一个带有无效值的警告或错误图标;用户可以将鼠标悬停在该图标上以显示工具提示,其中包含有关确切错误的更多信息。

  3. 或者两种方法的结合,允许用户获得即时反馈,同时确保您不必在输入表单之外处理格式错误的输入。

答案 1 :(得分:1)

我假设我使用的ComboBox的子类没有添加任何相关功能,这是不正确的。该问题最终归因于我不知道的LostFocus事件处理程序导致ComboBox恢复其值。

答案 2 :(得分:0)

我无法使用下面的代码重新创建您的问题,这正是您所说的正在做的事情。组合框中的值会更新。您可以通过发布SelectionChangeCommitted代码获得更好的解决方案。

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
        {
            try
            {
                ComboBox cb = (ComboBox)sender;
                string check1 = cb.Text;
                MessageBox.Show("Messagebox check");
                string check2 = cb.Text;
                MessageBox.Show(check1 + "\n\n" + check2);
                //check 1 and 2 show the old value.  Once the method leaves then the value in the combobox is updated.
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }