取消选择下拉框项目。

3
我有一个数据绑定的组合框:
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";
}

当表单加载时,两个选项都没有被选中,但当用户选择一个选项后,它就无法被取消选择。我尝试添加,但它并没有解决问题,因为不可能向数据绑定的组合框中添加新项目。
如何允许用户取消选择下拉框中的项目?

1
一个单独的按钮,将SelectedIndex分配为-1。 - paparazzo
我知道这是一个旧的帖子,但任何偶然来到这里的人,主要是一些天真的程序员,应该选择Cody Gray在下面的答案,了解为什么这不是这项工作的正确工具... - Marcelo Scofano Diniz
3个回答

6
您可以通过选择“不同”的项来“取消选择”下拉ComboBox中的项目。
ComboBox没有“取消选择”的选项 - 总是有东西被选择。如果您想模拟未选择任何内容的行为,您需要将一个项(或等效项)添加到ComboBox中。用户可以在需要“取消选择”时选择此选项。
默认情况下,ComboBox出现时没有选择任何项是设计不良的,因为用户永远无法重新创建该状态。 您永远不应允许这种情况发生。在控件的(或父窗体的)初始化器中,始终将ComboBox设置为默认值。
如果您确实需要允许清除当前选择的小部件,则应改用ListView或ListBox控件。

这个深入的UI设计洞察力让人加分;虽然它没有回答问题,但问题在于使用了错误的工具... - Marcelo Scofano Diniz

4

要将项目添加到数据绑定的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在此处的解释:https://dev59.com/GWkw5IYBdhLWcg3w_Pbn - Ramon Araujo
@RamonAraujo,感谢您提供的信息。我之前并不知道这一点。根据您指出答案评论中的精确说明,将数据源设置在最后一行完全是有意义的。 - Will Marcouiller
经过多次尝试避免这种方式,并且创建解决方法去强制应用程序接受不带缺陷的“.SelectedIndex = -1”,并且未能在所有可能的情况下完成,我终于可以承认这是实现该行为的最佳/最简单的方法。另一种方式设计很差(如Cody在下面的答案中所解释的)。更重要的是,人们会最终编写更多的代码来修复由此引起的问题。 - 41686d6564 stands w. Palestine

3
为了取消选择一个项目,假设用户按下Esc键,您可以订阅comboxBox的KeyDown事件并将选定的索引设置为none。
private void cmbbx_Managers_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Escape && !this.cmbbx_Managers.DroppedDown)
  {
    this.cmbbx_Managers.SelectedIndex = -1;
  }
}

2
当用户尝试在不更改选择的情况下关闭下拉菜单时会发生什么?哎呀,现在已经清除了! - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接