我有一个例程,它打开一个记录集并构建一个组合框的Items集合。在谷歌搜索后,我找到了使用ComboboxItem类的方法。
public class ComboboxItem
{
public string Text { get; set; }
public object Value { get; set; }
public override string ToString()
{
return Display;
}
}
我的代码使用此类将项添加到ComboBox。当我运行应用程序并单击Combobox时,列表中的正确值...很棒!我的问题是,当表单从数据库加载记录时,它会查找与数据库值对应的相应列表值,而只是显示数据库中的值:例如英国而不是英国。当我尝试保存记录时,它会尝试保存“英国”而不是“英国”。所以我认为DisplayMember和ValueMember属性需要分配。我假设我需要将它们分配为“Text”和“Value”,但是当我这样做时,Combobox会显示相同值的列表。我做错了什么?
编辑:这是我放入ComboBox类的简化版本:
public class StandardComboBox : ComboBox
{
protected List<ComboboxItem> DataSourceList = new List<ComboboxItem>();
public bool SetRecordSource(string Criteria)
{
ADODB.Recordset RS = new ADODB.Recordset();
try
{
DataSourceList.Clear();
// Open ADDOB.Recordset RS with the records specified in Criteria
while (RS.EOF == false)
{
ComboboxItem MyComboboxItem = new ComboboxItem();
MyComboboxItem.Value = RS.Fields[0].Value.ToString();
MyComboboxItem.Display = RS.Fields[1].Value.ToString();
DataSourceList.Add(MyComboboxItem);
RS.MoveNext();
}
this.DataSource = DataSourceList;
this.ValueMember = "Value";
this.DisplayMember = "Display";
return true;
}
}
}
答案 0 :(得分:1)
首先,我认为你应该更好地命名你的班级(例如国家)。然后设置属性的名称。使用字符串作为数据类型。
public class Country
{
public string ID { get; set; }
public string Name { get; set; }
}
然后绑定组合框并设置DisplayMember和DisplayValue。
comboBox1.DataSource = listCountry;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "ID";
如果您想获取该值,只需使用SelectedValue。
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(comboBox1.SelectedValue.ToString());
}
完整的源代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var listCountry = new List<Country>() {
new Country() {ID = "UK", Name = "United Kingdom"},
new Country() {ID = "US", Name = "United States of America"},
};
comboBox1.DataSource = listCountry;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "ID";
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(comboBox1.SelectedValue.ToString());
}
}
public class Country
{
public string ID { get; set; }
public string Name { get; set; }
}
}
答案 1 :(得分:0)
我现在设法解决了这个问题。我来自MsAccess背景,例如你只需指定一个带有'UK'的组合框,并且组合框显示'United Kingdom'。在C#中它更复杂。如果要为组合框指定值,则必须使用FindString()方法来定位要显示的值,然后分配SelectedIndex属性以使其显示该值。这是一个球疼,但我可以将这个逻辑构建到我的班级,而不必再考虑它。感谢您的输入。 -