【问题标题】:Reset Text in Combobox After Selection选择后重置组合框中的文本
【发布时间】:2011-12-29 19:28:07
【问题描述】:

我的表单上有一个组合框。它处于下拉模式并具有自动完成功能。首次显示时,其文本为"Choose part..."。我希望它在做出选择后将其文本重置为此。我试过这个(假设组合框名为comboBox1):

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

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

仅当使用键盘进行选择时才有效(例如,输入一个值并按[Enter] 开始输入,使用箭头选择一个自动更正值,然后按@987654325 @)。使用鼠标进行选择时,文本仍保持选定的值。

我之前遇到过键盘和鼠标对组合框执行不同操作的问题,但这与某些事件未触发有关。我确定这个事件正在触发(上面省略的代码不管使用什么方法都会运行)。

有人见过这个吗?有什么解决办法吗?

【问题讨论】:

  • 试图隐藏用户实际做出选择的事实会使 UI 很难使用。我想您可以使用 Leave 事件来恢复文本。请考虑只使用标签。你甚至可以把它放在文本框部分的顶部。
  • @HansPassant 选择被“复制”到另一个位置(因此用户知道他们做出了选择)。问题是我想向用户表明组合框可以再次用于另一个选择,而不影响第一个选择。

标签: c# .net winforms combobox


【解决方案1】:

尝试使用委托:

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

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

正如 Hans 评论的那样,这可能不是用户期望 ComboBox 工作的最佳 UI 实现。

【讨论】:

  • 太好了,成功了!重新期望,请参阅我对汉斯的评论回复。
【解决方案2】:

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

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

然后在处理完 ComboBox1.SelectedListItemChanged() 事件后将组合框重置为项目 0

ComboBox1._SelectedIndexChanged = 0;       

这里的用户体验问题有些模糊:有时您可能希望将列表重置为“已知良好状态”。例如,如果列表保留在先前的选择中,用户可能会感到困惑。重置列表框确实让用户感觉到他们想要的任何操作实际上都发生了。

【讨论】:

  • 使用该额外项目的问题是它会出现在自动更正中,这是不希望的;此外,它必须在选定的项目更改事件中被明确忽略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2016-05-15
  • 1970-01-01
  • 2014-03-15
  • 2012-05-15
相关资源
最近更新 更多