【问题标题】:Deselect combobox item取消选择组合框项目
【发布时间】:2014-10-09 07:51:29
【问题描述】:

我有一个数据绑定组合框:

using(DataContext db = new DataContext())
{
    var ds = db.Managers.Select(q=> new { q.ManagerName, q.ManagerID});

    cmbbx_Managers.BindingContext = new BindingContext();
    cmbbx_Managers.DataSource = ds;
    cmbbx_Managers.DisplayMember = "ManagerName";
    cmbbx_Managers.ValueMember = "ManagerID";
}

当表单加载时,两个项目都没有被选中,但是当用户选择一个项目时,它不能被取消选择。我尝试添加cmbbx_Managers.items.Insert(0, "none"),但并没有解决问题,因为无法向数据绑定组合框添加新项目。

如何允许用户取消选择 combobox 项目?

【问题讨论】:

  • 一个单独的按钮,将 SelectedIndex 分配给 -1。
  • 我知道这是一个旧线程,但任何在这里绊倒的人,主要是天真的编码人员,可能应该去下面科迪格雷的答案,以了解为什么这是这项工作的错误工具......

标签: c# .net winforms combobox datasource


【解决方案1】:

要将项目添加到数据绑定的 ComboBox,您需要将项目添加到绑定到 ComboBox 的列表中。

var managers = managerRepository.GetAll();

managers.Insert(0, new Manager() { ManagerID = 0, ManagerName = "(None)");

managersComboBox.DisplayMember = "ManagerName";
managersComboBox.ValueMember = "ManagerID";
managersComboBox.DataSource = managers;

因此,要取消选择,您现在只需设置ComboBox.SelectedIndex = 0,否则,使用BindingSource.CurrencyManager

此外,需要根据@RamonAroujo 从他的评论中给我们带来的精度,在最后一行设置 DataSource 属性。我相应地更新了我的答案。

【讨论】:

  • 请始终在最后设置 DataSource 属性。请参考@Visitor在这里的解释:stackoverflow.com/questions/9521980/…
  • @RamonAraujo,感谢您提供此信息。我没有意识到这一点。按照您指出的答案的精确度,在最后一行设置数据源是完全有意义的。
  • 在许多人试图避免这样做之后,创建了变通方法来强制应用程序毫无缺陷地接受.SelectedIndex = -1,并且在所有可能的情况下都未能做到这一点,我终于可以承认这是实现该行为的最佳/最简单方法。另一种方法是真正糟糕的设计正如 Cody 在下面的回答中所解释的那样。更不用说最终会编写更多代码来尝试解决由此引起的问题。
【解决方案2】:

要取消选择一个项目,假设用户按下 Esc 键,您可以订阅comboxBox KeyDown 事件并将选定索引设置为无。

private void cmbbx_Managers_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Escape && !this.cmbbx_Managers.DroppedDown)
  {
    this.cmbbx_Managers.SelectedIndex = -1;
  }
}

【讨论】:

  • 当用户试图关闭下拉菜单而不更改他们的选择时会发生什么?哎呀,它现在被清除了!
【解决方案3】:

在下拉组合框中“取消选择”项目的方法是选择一个不同的项目。

ComboBox 没有“取消选择”选项——总要选择一些东西。如果要模拟未选择任何内容的行为,则需要将 <none> 项目(或等效项)添加到 ComboBox。然后,用户可以在想要“取消选择”时选择此选项。

默认情况下,ComboBox 出现时没有选择任何项目,这是一种糟糕的设计,因为用户永远无法重新创建该状态。你不应该允许这种情况发生。在控件(或父窗体)的初始化程序中,始终将 ComboBox 设置为默认值。

如果您真的需要一个允许清除当前选择的小部件,那么您应该改用 ListView 或 ListBox 控件。

【讨论】:

  • +1 通过这种深入的 UI 设计洞察力;它没有回答问题,但这里的问题是错误的工具......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多