【问题标题】:I'm retrieving a value for a combobox with custom class items but I can't make it show the item我正在检索带有自定义类项目的组合框的值,但我无法让它显示该项目
【发布时间】:2015-05-12 09:49:11
【问题描述】:

我想拥有稍后可以调用的项目和隐藏值,因此我使用此 Article 来创建我的自定义项目。

但现在我调用了一个值,我无法让它显示正确的项目。组合框保持为空。

if (reader.HasRows)
{
    reader.Read();
    namebox.Text = reader["c_Name"].ToString();
    lastbox.Text = reader["c_LastName"].ToString();
    genderbox.SelectedItem = reader["c_gender"].ToString();
}

这是我添加到组合框中的内容,以及我想根据从读者那里获得的价值来展示的内容

 private void editcust_Load(object sender, EventArgs e)
        {
            genderbox.Items.Add(new ComboBoxItem("male", "1"));
            genderbox.Items.Add(new ComboBoxItem("female", "0"));
        }

如果我需要添加更多代码或提供更多信息,请告诉我。 我是一名初级开发人员,所以请原谅我的严重错误和糟糕的表述。

【问题讨论】:

  • 您需要发布更多信息,例如:分配给组合框 DataSource 属性的项目的类定义。
  • 请提供更多信息并清楚地说明您想做什么。你给的代码和你提到的文章有什么关系?
  • 最好将这两个功能分开,在一个函数中从读取器读取值,在另一个函数中填充列表框。这样你就可以确定哪里出了问题
  • 好的,因为我实际上不知道是否以及如何编辑我的问题,我将在这里发布。读者带回了一个值,但我想显示为这个值分配的项目。
  • 我使用我提到的文章中的确切代码用项目和隐藏值填充我的组合框。

标签: c# winforms combobox


【解决方案1】:

首先,在您的类中覆盖 EqualsGetHashCode 方法:

public class ComboBoxItem()
{
     string displayValue;
     string hiddenValue;

     //Constructor
     public ComboBoxItem (string d, string h)
     {
          displayValue = d;
          hiddenValue = h;
     }

     //Accessor
     public string HiddenValue
     {
          get
          {
               return hiddenValue;
          }
     }

     public override bool Equals(object obj)
     {
         ComboBoxItem item = obj as ComboBoxItem;
         if (item == null)
         {
            return false;
         }
         return item.hiddenValue == this.hiddenValue;
     }
     public override int GetHashCode()
     {
         if (this.hiddenValue == null)
         {
             return 0;
         }
         return this.hiddenValue.GetHashCode();
     }
     //Override ToString method
     public override string ToString()
     {
          return displayValue;
     }
  }

然后为 SelectedItem 属性分配一个新的 Item:

genderbox.SelectedItem = new ComboBoxItem(string.Empty, reader["c_gender"].ToString());

当您为 ComboBox 的 SelectedItem 属性分配一个值时,它会查看它的项目集合并尝试找到一个等于分配值的项目。如果它找到一个等于该值的项目,则该项目被选中。在这个过程中,通过每个项目的Equals方法进行比较。

通过重写该方法,您可以告诉 ComboBox 使用“hiddenValue”字段比较项目,因此当您分配具有 ite 的 hiddenValue 集的新项目时,组合框可以在其项目集合中找到它。如果您不这样做,则将使用对象引用来完成相等比较。

【讨论】:

  • 我试过了,它把我的项目列表改为 0 和 1,而不是我以前的男性和女性,而且组合框仍然没有选择任何内容。
  • 您确定您没有设置“DisplayMember”而不是“ValueMember”吗?点击您的问题下的“编辑”并发布您的项目类别和数据源分配代码。
  • 我完全按照您输入的方式进行操作。我的项目类别与文章完全相同。我没有数据源,我只是按照我在已编辑问题中显示的方式添加项目。
  • 哇!你是一个真正的大师,我的朋友。这就像一个魅力。我想问你是否可以对“public override bool Equals”是什么以及它是如何工作的,但我肯定没有时间。
  • 我在答案中添加了更多信息。有关更多信息,请参阅 MSDN 中的 Equals 和/或在此处查看 msdn.microsoft.com/en-us/library/dd183752.aspx
【解决方案2】:

使用 ComboBox-Class 的 DisplayMember 和 ValueMember 属性并分配一个数据源。

即。您的数据类:

     private class yourDataClass
    {
        public string DisplayMemberProperty { get; set; }
        public int IDMember { get; set; }
    }

将具有值的数据源分配给组合框

      var dataSource = new ArrayList();

        dataSource.Add(new yourDataClass() { DisplayMemberProperty = "Hello", IDMember = 1 });
        dataSource.Add(new yourDataClass() { DisplayMemberProperty = "Hello2", IDMember = 2 });
        dataSource.Add(new yourDataClass() { DisplayMemberProperty = "Hello3", IDMember = 2 });

        this.comboBox1.DataSource = dataSource;
        this.comboBox1.DisplayMember = "DisplayMemberProperty";
        this.comboBox1.ValueMember = "IDMember";

检索选定的值...

        var value = this.comboBox1.SelectedValue;

【讨论】:

    【解决方案3】:

    同意这个问题不清楚,但如果你的意思是这个电话失败:

    genderbox.SelectedItem = reader["c_gender"].ToString();
    

    这可能是因为您需要使用与最初填充列表相同的值。

    即如果使用 x 类的实例填充它,则需要将 selectedItem 设置为 x 类的实例。

    【讨论】:

    • 是的,这就是失败的原因。读者带回存储在我的数据库中的值,但我希望组合框显示分配给该值的项目。 “如果你用类 x 的实例填充它,你需要将 selectedItem 设置为类 x 的实例”这就是我不知道该怎么做。 ://
    • 为你拥有的任何 clss 创建一个新实例,并尽可能使用数据库中的值对其进行初始化。或者查看组合框中的项目并找到您要选择的项目,如果可能的话,将 SelectedIndex 设置为该项目索引。
    • 我有 2 项“男性”、“女性”,分别具有 1 和 0 值。读者带回一个值 0,因此我希望它在我的组合框中显示项目“女性”
    • 使用 SelectedIndex 代替 SelectedItem 可能是一个简单的技巧
    • 这可能是一种解决方法,但是当我使用 ID 时会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多