我正在检索包含自定义 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 可以在它的项目集合中找到它。如果您不这样做,则将使用对象引用来完成相等性比较。
我想要稍后可以调用的项目和隐藏值,所以我使用这个 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 可以在它的项目集合中找到它。如果您不这样做,则将使用对象引用来完成相等性比较。