从DataTable填充下拉框后选择一个值

3

我有一个下拉框,由下面显示的DataTable填充。我想能够设置显示哪个项目。要设置的值是在“Id”列中找到的字符串。

public DataTable list = new DataTable();
public ComboBox cbRates = new ComboBox();

//prepare rates combo data source
this.list.Columns.Add(new DataColumn("Display", typeof(string)));
this.list.Columns.Add(new DataColumn("Id", typeof(string)));

//populate the rates combo
int counter = 0;

foreach (string item in dropdownItems)
{
    this.list.Rows.Add(list.NewRow());
    if (counter == 0)
    {
    this.list.Rows[counter][0] = "Select Rate..";
    this.list.Rows[counter][1] = "";
}
else
{
string[] itemSplit = item.Split('`');
if (itemSplit.Length == 2)
{
    this.list.Rows[counter]["Display"] = itemSplit[0];
    this.list.Rows[counter]["Id"] = itemSplit[1];
}
else
{
    this.list.Rows[counter]["Display"] = item;
    this.list.Rows[counter]["Id"] = item;
}
}
counter++;
}
this.cbRates.DataSource = list;
this.cbRates.DisplayMember = "Display";
this.cbRates.ValueMember = "Id";

//now.. how to set the selected value?

int rowCount = 0;
foreach (DataRow cbrow in this.list.Rows)
{
    if (DB.GetString(cbrow["Id"]) == answerSplit[1])
    {
        //attempting to set the SelectedIndex throws an exception
        //on another combobox populated NOT from a DataTable - this does work fine.
        this.cbRates.SelectedIndex = rowCount;
    }
    rowCount++;
}

//this doesn't seem to do anything.
foreach (DataRow dr in this.list.Rows)
{
    if ((string)dr["Id"] == answerSplit[1]) this.cbRates.SelectedItem = dr;
}

//nor this
foreach(DataRow dr in this.cbRates.Items)
{
   try
   {
     if ((string)dr["Id"] == answerSplit[1]) this.cbRates.SelectedItem = dr;
   }
    catch
    {
      MessageBox.Show("Ooops");
    }
}

由于在紧凑框架中没有FindExactString、FindString和FindByValue,我已经尝试了所有可能的方法。

如果尝试使用

this.cbRates.SelectedIndex = 2;

我收到了以下错误信息:

;

System.Exception: Exception
at Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar)
at System.Windows.Forms.ComboBox.set_SelectedIndex(Int32 value)

然而,如果我将相关代码放入其自己的表单进行测试,我可以设置selectedIndex而没有错误。我认为这些问题有关联。
4个回答

4
您是否知道您可以直接使用Datatable作为数据源吗?
        cbo.DataSource = table;
        cbo.DisplayMember = "Display";
        cbo.ValueMember = "Id";

我是,“list”是我的数据表 - this.cbRates.DataSource = list; this.cbRates.DisplayMember = "Display"; this.cbRates.ValueMember = "Id"; - Mark
然后,使用SelectedValue属性:cbo.SelectedValue="234"(前提是“234”是表中的一个ID之一) - Morten
我已经尝试过了,但似乎没有任何作用。我尝试使用包含字符串“Id”的变量,然后将其硬编码以确保它使用了正确的值。 - Mark
我的代码中肯定还有其他奇怪的问题,因为我刚刚随意拼凑了一个只包含相关部分的表单,它可以正常工作。 - Mark
我有类似的经历。我认为没有父控件,组合框无法正常工作(????)。我在一个单独的类中创建了一个组合框。我试图对其进行单元测试,但是除非我实例化一个窗体并将组合框添加到其中,否则我无法让它正常工作。 - Morten
我认为(从我在开头帖子中发布的错误来看)这可能是某种线程问题。 - Mark

2

您是否尝试设置SelectedValue?您有一个Id,并且声明ValueMember是Id,那么请使用它。


我尝试了这个:this.cbRates.SelectedValue = answerSplit[1]; 但那也没用。 - Mark

1

你可以这样做,它是可行的,但如果你有大量的项目,速度不会太快:

foreach (object item in comboBox1.Items)
{
    DataRowView row = item as DataRowView;
    if ((String)row["YourDisplayMemberColumn"] == "ValueYouWantToSelect")
    {
        comboBox1.SelectedItem = item;
    }
}

0
您可以通过查找与指定字符串完全匹配的项目来设置SelectedIndex,使用ComboBox.FindStringExact方法。
cbRates.SelectedIndex = cbRates.FindStringExact("Value_need_to_Select") ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接