2009-05-04 61 views
1

我正在使用DataTable从XML文件将项目填充到我的ComboBox。目前,我已经设置了一列是ComboBox的显示成员,另一列是值成员。然而这可能并不总是适用于我,因为我必须设置selectedItem参数,并且value成员可能不是唯一的。将DataRow设置为ComboBox的值成员

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

我该如何做到这一点?有没有更好的方法来做到这一点?我愿意接受建议,但是我可以同时接触这两个人,显示会员和贵宾会员,这一点非常重要。

谢谢你的帮助!

编辑:也许我之前没有足够清楚,但是当我问,如果这是这里最好的方法,我也问如何做到这一点。如果我没有设置valuemember参数,SelectedItem是DataRowView类型的...请注意,我想使用selectedValue参数从ComboBox中选择项目,如果我尝试在没有明确设置值成员的情况下做到这一点,抛出异常。

回答

0

首先感谢亚当罗宾逊,我相信你的回答是正确的,但这不是我想听到的。我以不同的方式解决了我的问题,我认为这对其他人可能有用,所以我在这里发布。

我做的是我创建了一个新类,在我的例子中,我将它命名为ListObject,它有一个DataRow属性(稍后您会看到它也适用于其他类型,我只是使用它,因为这是我实际上作为我的Item值属性)。还重写方法:

  • 字符串的ToString()
  • 布尔等于(obj对象)
  • INT GetHashCode()方法--is不需要在我的情况,但是Visual Studio的
    警告你应该覆盖。

的想法是,我可以填补我自己的类的对象ComboBox.Items集合,显示自定义字符串(如果我没有算出来这个样子,我的堆栈溢出的下一个问题可能会是有关自定义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语句:

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方法来确定相等性。

1

如果您绑定ListBoxDataTable,你实际上绑定到DataView,表示DataTableDataTable实现IListSource,并返回一个DataView)。您不能直接将SelectedItem设置为DataRow实例,必须将其设置为DataRowView实例。不幸的是,从DataRow获得DataRowView并不容易。

只需通过DataRowView来完成所有的交互操作就可以做得更好。这将允许您明确设置SelectedItem

您不能使用SelectedValue属性,您必须使用SelectedItem

0

这是最简单的方式来获得数据表的组合框

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(); 

    }