将 DataRow 设置为 ComboBox 的值成员
题
我正在使用 DataTable 将 XML 文件中的项目填充到 ComboBox 中。目前我已将其设置为一列是 ComboBox 的显示成员,另一列是它的值成员。然而,这可能并不总是对我有用,因为我必须设置 selectedItem 参数,并且值成员可能不是唯一的。
我不知道表中是否存在重复的值成员,所以我的想法是,我将整个 DataRow 作为 ComboBox 的值成员,然后使用 ComboBox.SelectedITem = (DataRow)some_data_row;用于选择,它总是会选择正确的 ComboBox 对象。
我将如何实现这个目标?有更好的方法吗?我愿意接受建议,但是非常重要的是我可以同时接触显示会员和价值会员。
感谢您的帮助!
编辑:也许我之前还不够清楚,但是当我问这是否是最好的方法时,我也在问 如何 去做这个。如果我不设置 valuemember 参数,则 SelectedItem 是 DataRowView 类型...请注意,我想使用 selectedValue 参数从 ComboBox 中选择项目,如果我尝试在没有显式设置 value 成员的情况下执行此操作,则会引发异常。
解决方案 2
首先谢谢你,亚当·罗宾逊,我确信你的答案是正确的,但这不是我想听到的。我以不同的方式解决了我的问题,我认为这对其他人可能有用,所以我将其发布在这里。
我所做的是创建一个新类,在我的例子中,我将其命名为 ListObject,它有一个属性 DataRow (稍后您将看到它也适用于其他类型,我只是使用它,因为这是我真正想要的项目值属性)。它还重写方法:
- 字符串转字符串()
- bool 等于(对象 obj)
- int GetHashCode()——在我的例子中不需要,但是 Visual Studio
警告您它应该被覆盖。
我的想法是,我可以用我自己的类的对象填充 ComboBox.Items 集合,显示自定义字符串(如果我没有像这样解决问题,我关于堆栈溢出的下一个问题可能是关于在从DataRow)并仅比较一个类的项目(在我的例子中为 DataRow)。
这是代码,它工作得很好(至少对于我想用它做的事情来说)。
public class ListObject
{
public DataRow element;
public String DisplayObject = null;
public ListObject(DataRow dr)
{
element = dr;
}
public ListObject(DataRow dr, String dspObject)
{
element = dr;
DisplayObject = dspObject;
}
public override String ToString()
{
if (DisplayObject == null) throw new Exception("DisplayObject property was not set.");
return element[DisplayObject].ToString();
}
public override bool Equals(object obj)
{
if (obj.GetType() == typeof(ListObject))
return Equals(((ListObject)obj).element, this.element);
else return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
就我而言,它效果很好,因为我可以用 foreach 语句填充 ComboBox:
dtUsers.ReadXml(Program.Settings.xmlInputUsers);
foreach(DataRow dr in dtUsers.Rows)
{
cmbUser.Items.Add(new ListObject(dr, "Name"));
}
当我得到我想要选择的 DataRow 时,我只需这样做:
cmbUser.SelectedItem = new ListObject(dlg.SelectedDataRow);
我不必担心 DisplayMember 等,因为只会比较 DataRow,并且您的显示参数仍将从填充 ComboBox.Items 集合时设置。此外,由于 toString 方法被重写,您可以真正自定义您的输出。
创建这个类是因为 msdn 的文章 ComboBox.SelectedItem 属性 其中指出,SelectedItem 属性使用 IndexOf 方法工作。此方法使用 Equals 方法来确定相等性。
其他提示
如果将 ListBox
绑定到 DataTable
,实际上是将它绑定到代表 DataTable <的
DataView
/ code>( DataTable
实现 IListSource
,并返回 DataView
)。您不能直接将 SelectedItem
设置为 DataRow
实例,您必须将其设置为 DataRowView
实例。不幸的是,从 DataRow
获取 DataRowView
并不容易。
您最好通过 DataRowView
进行所有交互。这将允许您显式设置 SelectedItem
。
您不能使用 SelectedValue
属性,必须使用 SelectedItem
。
这是将DataTable导入组合框的最简单方法
private void load() {
DataTable dt = // get data from DB
comboBox1.ValueMember = null; // allows you to get all fields in the obj to combobox
comboBox1.DisplayMember = "ccType";//label displayed from dt
comboBox1.DataSource = dt;
}
//to test
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
DataRowView current = (DataRowView)comboBox1.SelectedValue;
string drs = current.Row["ID"].ToString();
}