2011-12-29 20 views
2

我的窗体上有一个组合框。它处于DropDown模式,并具有自动完成功能。首次显示时,其文字为"Choose part..."。我希望在选择完成后重置文本。我已经试过这(假设该组合框被命名为comboBox1):在选择后重置组合框中的文本

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     // [omitted] 

     comboBox1.Text = "Choose part..."; 
    } 

它只有当选择使用键盘(例如,键入一个值,然后按[Enter]开始打字,使用箭头做工作选择一个自动更正值,然后按[Enter])。当使用鼠标进行选择时,文本保持选定的值。

我以前用键盘&鼠标做了与comboboxes不同的事情,但这与某些事件没有触发有关。我确信这个事件正在触发(不管使用哪种方法,上面省略的代码都会运行)。

有没有人见过这个?任何解决方案

+0

试图隐藏用户实际做出选择的事实使UI非常难以使用。我想你可以使用Leave事件来恢复文本。请考虑只使用标签。你甚至可以把它放在文本框部分的顶部。 – 2011-12-29 19:45:51

+0

@HansPassant选择被“复制”到另一个位置(所以用户知道他们做了选择)。问题是我想向用户指出组合框可以再次用于其他选择,*不影响第一个选择。 – NickAldwin 2011-12-29 19:51:54

回答

3

尝试使用代理来代替:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { 
    // [omitted] 

    this.BeginInvoke((MethodInvoker)delegate { comboBox1.Text = "Choose part..."; }); 
} 

正如汉斯评论说,这可能是不被认为是与用户如何开始期待一个ComboBox最好的工作UI实现。

+0

太棒了,工作!重新期望,看到我对汉斯的评论回应。 – NickAldwin 2011-12-29 19:53:19

0

另一种方法是在索引0添加项目:

ComboBox1.Items.Insert(0, new ListItem("Choose Part...", "Choose Part...")); 

然后重新组合框项0这里处理ComboBox1.SelectedListItemChanged()事件

ComboBox1._SelectedIndexChanged = 0;  

用户体验问题后有点含糊不清:有时候你想重置列表到“已知的良好状态”。例如,如果列表保留在先前的选择上,则用户可能会感到困惑。重置列表框确实给用户一些感觉,即他们打算实际发生的任何动作。

+0

使用该额外项目的问题是它会出现在自动更正中,这是不希望的;此外,必须在所选项目更改事件中明确忽略它。 – NickAldwin 2011-12-31 21:18:55