0

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

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

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

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

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

4

3 回答 3

3

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

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

这就是为什么到处乱扔消息框是个坏主意的众多原因之一(其他原因包括消息框对用户的视觉冲击,而且他们中的大多数人甚至都懒得去阅读它们) . 喜欢使用消息框作为调试辅助工具的程序员在尝试调试 UI 代码时经常被这种情况所困扰。

解决方案是:

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

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

或者可能是这两种方法的组合,允许用户获得即时反馈,同时确保您永远不必在输入表单之外处理格式错误的输入。

于 2013-02-07T20:28:03.093 回答
1

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

于 2013-02-08T13:27:32.163 回答
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);
            }
        }
于 2013-02-07T21:32:50.450 回答