我在ComboBox.SelectionChangeCommitted
事件中遇到了一些奇怪的行为,我想知道是否有人对此有解释。
在我的事件处理程序中,我调用了MessageBox.Show
。如果我在ComboBox
中选择了一个新值,并且我的代码会导致MessageBox
弹出,我会看到我的selceted值恢复为原始值。
调试时,我发现在MessageBox.Show
之前所选值是正确的。 MessageBox.Show
将控制权交还给用户,直到我点击“是”或“否”。单击其中一个选项后,控件将返回调试器,并且在更改之前,ComboBox
的值将恢复为原始值。
我没有以编程方式在其他位置设置所选值,所以我不知道为什么值会被还原。如果事件处理程序未弹出MessageBox
,则不会恢复所选的。
在我处理事件之前,我是否有可能将控制权交还给UI,这与它有关。如果是这样,有没有一个干净的方式绕过它?目前我在弹出MessageBox
然后重置之前我正在捕捉我选择的值,但我宁愿不必诉诸“黑客”来解决问题。
答案 0 :(得分:3)
问题可能是显示消息框的行为导致组合框下拉菜单关闭,从而放弃了用户可能做出的任何未提交的选择。
与下拉组合框,突出显示列表中的项目,然后按 Esc 键基本相同。请注意,突出显示的项目不会成为所选项目,因为您在解除组合框之前从未选择它。 (您可以在“运行”对话框中轻松尝试。)
这是为什么在整个地方抛出消息框是一个坏主意的众多原因之一(其他原因包括如何在视觉上将消息框用于用户,以及most of them don't even bother to read them anyway)。喜欢使用消息框作为调试辅助工具的程序员在尝试调试UI代码时经常被这种情况所困扰。
解决方案是:
推迟验证,直到提交/提交整个表单,此时您可以显示一个消息框,而不会有放弃任何当前下拉组合框的风险。
找到显示验证错误的替代方法(即非模态)。 WinForms提供了一个ErrorProvider
控件,您可以将其用于此目的。典型用法是在控件旁边显示一个带有无效值的警告或错误图标;用户可以将鼠标悬停在该图标上以显示工具提示,其中包含有关确切错误的更多信息。
或者两种方法的结合,允许用户获得即时反馈,同时确保您不必在输入表单之外处理格式错误的输入。
答案 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);
}
}