我正在使用DataTable从XML文件向我的ComboBox填充项目。目前我设置它使得一列是ComboBox的显示成员,另一列是它的值成员。但是这对我来说可能并不总是有用,因为我必须设置selectedItem参数,而value成员可能不是唯一的。
我不知道表中是否有值成员的副本,所以我的想法是我将整个DataRow作为ComboBox的值成员然后使用ComboBox.SelectedITem =(DataRow) some_data_row;用于选择,它总是选择正确的ComboBox对象。
我将如何做到这一点?有更好的方法吗?我愿意接受建议,但是我能够同时展示会员和价值会员是非常重要的。
感谢您的帮助!
编辑:也许我以前不够清楚,但是当我问这是否是最好的方法时,我也问如何这样做。如果我没有设置valuemember参数,则SelectedItem属于DataRowView类型...请注意,我想使用selectedValue参数从ComboBox中选择项目,如果我尝试这样做而没有明确设置值成员抛出异常。
答案 0 :(得分:1)
如果您将ListBox
绑定到DataTable
,则实际上是将其绑定到代表DataView
的{{1}}(DataTable
实现{{ 1}},然后返回DataTable
)。您无法直接将IListSource
设置为DataView
实例,您必须将其设置为SelectedItem
实例。不幸的是,从DataRow
获取DataRowView
并不容易。
您最好通过DataRowView
完成所有互动。这样您就可以明确设置DataRow
。
您无法使用DataRowView
属性,因此必须使用SelectedItem
。
答案 1 :(得分:0)
首先,谢谢Adam Robinson,我确定你的回答是正确的,但这不是我想听到的。我以不同的方式解决了我的问题,我认为这可能对其他人有用,所以我在这里发帖。
我做的是我创建了一个新类,在我的例子中,我将其命名为ListObject,它具有属性DataRow(稍后您将看到它也适用于其他类型,我只是使用它,因为这是我真正想要的作为我的Item值属性)。它还覆盖了方法:
我的想法是,我可以使用我自己的类的对象填充ComboBox.Items集合,显示一个自定义字符串(如果我没有这样做,我关于Stack溢出的下一个问题可能是关于在阅读时自定义DisplayMembers来自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方法被覆盖,您可以真正自定义输出。
只有在 ComboBox.SelectedItem Property 中的msdn文章中才能创建此类,因为SelectedItem属性使用IndexOf方法。此方法使用Equals方法确定相等性。
答案 2 :(得分:0)
这是将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();
}