Как установить выбранный элемент ComboBox в C# Windows Forms?

Я пытаюсь установить выбранный элемент comboBox при щелчке события DataGrid, но я не мог. Я гуглил и пробовал разные способы, но безуспешно.

для меня SelectedIndex работает, но я не смог найти индекс элементов в ComboBox, поэтому я не мог выбрать элемент.

не работает код:

for (int i = 0; i < cmbVendor.Items.Count; i++)

    if (cmbVendor.Items[i].ToString() == Convert.ToString(gridView1.GetFocusedRowCellValue("vVendor")))
    {
        cmbVendor.SelectedIndex = i;
        break;
    }

8 ответов


вы можете получить индекс элемента по .Items.IndexOf() метод. Попробуйте это:

comboBox1.SelectedIndex = comboBox1.Items.IndexOf(gridView1.GetFocusedRowCellValue("vVendor"));

вам не нужно перебирать.

вы можете найти дополнительную информацию в вопросе переполнения стека Как установить выбранный элемент в поле со списком в соответствии с моей строкой с помощью C#?.


следующее работает для меня отлично. Передать любое значение или текст, который доступен в ComboBox.

comboBox1.SelectedIndex = comboBox1.FindString(<combobox value OR Text in string formate>);

У вас есть это в вашем if:

cmbVendor.SelectedItem = cmbVendor.Items[i];

наконец-то я это понял. Это:

cmbVendor.Text = Convert.ToString(gridView1.GetFocusedRowCellValue("vVendor"));

свойство SelectedText предназначено для выбранной части редактируемого текста в части текстового поля поля со списком.


предполагая, что gridView1.GetFocusedRowCellValue("vVendor") действительно работает, как ожидалось, следующий код должен исправить проблему.

string selected = Convert.ToString(gridView1.GetFocusedRowCellValue("vVendor"));
foreach ( var item in cmbVendor.Items )
{
    if (string.Compare(item.ToString(), selected, StringComparison.OrdinalIgnoreCase) == 0)
    {
        cmbVendor.SelectedItem = item;
        break;
    }
}

исходный код имел несколько вызовов gridView1.GetFocusedRowCellValue("vVendor"), тогда как вам нужен только один.

предложенных "поле combobox1.Предметы.IndexOf ("предполагает слишком много о содержании cmbVendor.Items.


у меня была аналогичная проблема, и я частично решил ее с помощью других ответов здесь. Во-первых, моя конкретная проблема заключалась в том, что

combobox1.SelectedItem = myItem;

не работает, как ожидалось. Основной причиной было то, что myItem был объектом из группы, которая фактически была тем же списком, что и элементы в combobox, но на самом деле это была копия этих элементов. Таким образом, myItem был идентичен допустимой записи, но сам по себе не был допустимым объектом из контейнера combobox1.

В решением было использовать SelectedIndex вместо SelectedItem, например:

combobox1.SelectedIndex = get_combobox_index(myItem);

здесь

    private int get_combobox_index(ItemClass myItem)
    {
        int i = 0;
        var lst = combobox1.Items.Cast<ItemClass >();
        foreach (var s in lst)
        {
            if (s.Id == myItem.Id)
                return i;

            i++;
        }
        return 0;
    }

Если вы установили свойство ValueMember для элемента управления ComboBox, вы можете просто assingn значение SelectedValue свойство в элементе управления ComboBox. Вам не нужно искать индекс явно. Вот пример:

public class Vendor{
    public int VendorId {get; set;}
    public string VendorName {get; set;}
}

// Inside your function
   var comboboxData = new List<Vendor>(){
       new Vendor(){ vendorId = 1, vendorName = "Vendor1" },
       new Vendor(){ vendorId = 2, vendorName = "Vendor2" }
   }

   cmbVendor.DataSource = comboboxData;
   cmbVendor.DisplayMember = "VendorName";
   cmbVendor.ValueMember = "ValueId";

// Now, to change your selected index to the ComboBox item with ValueId of 2, you can simply do:
   cmbVendor.SelectedValue = 2;

это работает для меня.....

string displayMember = ComboBox.DataSource.To<DataTable>().Select("valueMemberColumn = '" + value + "'")[0]["displayMember"].ToString();
ComboBox.FindItemExact(displayMember, true).Selected = true;