Выбор значения в выпадающем списке, который заполняется из DataTable - PullRequest
3 голосов
/ 23 марта 2011

У меня есть комбинированный список, заполняемый таблицей данных, как показано ниже.Я хочу иметь возможность установить, какой элемент отображается.Значение, которое должно быть установлено, является строкой, которая будет найдена в столбце «Идентификатор».

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 не присутствует в компактной среде, которой у меня не хватаетtry.

Если попытаться использовать

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 без ошибок.

Я думаю, что эти проблемы связаны.

Ответы [ 3 ]

3 голосов
/ 23 марта 2011

Знаете ли вы, что вы можете использовать данные непосредственно в качестве источника данных?

        cbo.DataSource = table;
        cbo.DisplayMember = "Display";
        cbo.ValueMember = "Id";
2 голосов
/ 23 марта 2011

Вы пытались установить SelectedValue? У вас есть Id, и вы утверждаете, что ValueMember - это Id, а затем используете его.

1 голос
/ 01 сентября 2013

Вы можете сделать это, это работает, но не слишком быстро, если у вас есть тонны предметов:

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