将DataRow设置为ComboBox的值成员

时间:2009-05-04 14:02:40

标签: c# combobox datatable

我正在使用DataTable从XML文件向我的ComboBox填充项目。目前我设置它使得一列是ComboBox的显示成员,另一列是它的值成员。但是这对我来说可能并不总是有用,因为我必须设置selectedItem参数,而value成员可能不是唯一的。

我不知道表中是否有值成员的副本,所以我的想法是我将整个DataRow作为ComboBox的值成员然后使用ComboBox.SelectedITem =(DataRow) some_data_row;用于选择,它总是选择正确的ComboBox对象。

我将如何做到这一点?有更好的方法吗?我愿意接受建议,但是我能够同时展示会员和价值会员是非常重要的。

感谢您的帮助!

编辑:也许我以前不够清楚,但是当我问这是否是最好的方法时,我也问如何这样做。如果我没有设置valuemember参数,则SelectedItem属于DataRowView类型...请注意,我想使用selectedValue参数从ComboBox中选择项目,如果我尝试这样做而没有明确设置值成员抛出异常。

3 个答案:

答案 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值属性)。它还覆盖了方法:

  • String ToString()
  • bool Equals(object obj)
  • int GetHashCode() - 在我的情况下不需要,但是Visual Studio
    警告你它应该被覆盖。

我的想法是,我可以使用我自己的类的对象填充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();

    }