【问题标题】:Setting the start value of an enum ComboBox设置枚举 ComboBox 的起始值
【发布时间】:2016-08-20 17:07:32
【问题描述】:

一直在寻找这个问题的解决方案,找到了很多解决方案,但没有任何改变我的代码的行为。这是在 WinForms 中。

我正在加载一个带有 ComboBox 的表单,其中包含此枚举的值和名称,位于名为“Node”的类中。

class Node
{
    public enum NodeType { Yield, Home, Parking, Light, None, Inbound, Outbound }
    public NodeType Type;
}

然后在我的表单中,我有一个名为“Type”的 ComboBox,它是这样设置的(来自构造函数):

Node node = new Node();
node.Type = Node.NodeType.Home;

Type = new ComboBox();
Type.Location = new Point(77, 41);
Type.Size = new Size(121, 24);
Type.DropDownStyle = ComboBoxStyle.DropDownList;
Type.DisplayMember = "Name";
Type.ValueMember = "Value";
Type.DataSource = Enum.GetValues(typeof(Node.NodeType));
Type.SelectedValue = node.Type;
Controls.Add(Type);

当程序运行时,列表会显示所有名称,并且在关闭表单时,我可以通过检索选定的值。类型。选定值。 我的问题是 ComboBox 不是从 Node 已经设置的值开始的。本质上是一行

Type.SelectedValue = node.Type;

什么都不做。我试过使用没有改变任何东西的 SelectedItem,并且

Type.SelectedIndex = (int)node.Type;

这导致了 ArgumentOutOfRangeException。

那么,我的问题是:如何设置 ComboBox 的起始值?

【问题讨论】:

标签: c# winforms combobox


【解决方案1】:

Type.SelectedIndex = 枚举中的索引,例如枚举为 {"apple", "pear", "pineapple"},并且您希望默认为 pear,因此 Type.SelectedIndex = 1

【讨论】:

  • 这是我尝试做的 Type.SelectedIndex = (int)node.Type;这会导致 ArgumentOutOfRangeException,即使我只输入 2 而不是 (int)node.Type,也会发生同样的事情。
  • 如果你想选择Light,试试Type.SelectedValue = node.Type.Light
  • 试过:Type.SelectedValue = Node.NodeType.Light; ComboBox 仍然从枚举器中的第一个值“Yield”开始。
【解决方案2】:

该代码中有几个错误。

首先,enum 没有NameValue 属性(实际上它没有任何属性),所以DisplayMemberValueMember 不能使用,应该留空(默认)。这反过来意味着不能使用SelectedValue,您需要使用SelectedItem

其次,您通过设置DataSource 属性而不是填充Items,对ComboBox 的列表部分使用列表数据绑定 模式,这很好,但数据绑定稍后发生在此过程中,因此在构造函数内部 Items 属性为空,SelectedItem 无效。为了解决这个问题,您需要将数据初始化部分移动到您的表单Load 事件中。

因此,在您的表单构造函数中,您将拥有:

Type = new ComboBox();
Type.Location = new Point(77, 41);
Type.Size = new Size(121, 24);
Type.DropDownStyle = ComboBoxStyle.DropDownList;
Controls.Add(Type);

并以您的形式 Load 事件 - 这个:

Node node = new Node();
node.Type = Node.NodeType.Home;

Type.DataSource = Enum.GetValues(typeof(Node.NodeType));
Type.SelectedItem = node.Type;

【讨论】:

  • 已解决问题,也感谢您解释错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2013-05-17
  • 2014-05-18
  • 2023-04-01
相关资源
最近更新 更多