我正在检索包含自定义 class 项目的组合框的值,但我无法让它显示该项目

I'm retrieving a value for a combobox with custom class items but I can't make it show the item

我想要稍后可以调用的项目和隐藏值,所以我使用这个 Article 来创建我的自定义项目。

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

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

这是我添加到组合框中的内容,以及我想根据从 reader

中获得的值显示的内容
 private void editcust_Load(object sender, EventArgs e)
        {
            genderbox.Items.Add(new ComboBoxItem("male", "1"));
            genderbox.Items.Add(new ComboBoxItem("female", "0"));
        }

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

同意问题不清楚,但如果您的意思是此调用失败:

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

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

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

的实例

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

即。您的数据 Class:

     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;

首先,覆盖 class 中的 Equals and GetHashCode 方法:

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" 字段比较项目,因此当您分配一个带有它的 hiddenValue 集的新项目时,combobox 可以在它的项目集合中找到它。如果您不这样做,则将使用对象引用来完成相等性比较。