我正在使用 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();

    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top