根据 ValueMember 从 Combobox 获取索引

Get index from Combobox based on ValueMember

我有一个组合框,它存储一个 name 作为 DisplayMember 和一个 id 作为 ValueMember。在我的数据库中,我只存储 id.

如何通过 id 将其设置为正确的索引?

示例代码:

Combobox.SelectedIndex = Combobox.FindByValueMember("10");

我能找到的最好的问题是 this 个问题,但投票最多的答案并没有弄明白问题是什么。

int index = comboref.Items.IndexOf("string");

不起作用,因为它不按 ValueMember 搜索。

This 回答了它,但我想知道是否有更好的方法。

不需要根据选择的值查找索引,设置SelectedValue即可。

示例 1 - 设置 SelectedValue

private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DataSource = Enumerable.Range(1, 5)
        .Select(x => new { Name = $"Product {x}", Id = x }).ToList();
    comboBox1.DisplayMember = "Name";
    comboBox1.ValueMember = "Id";
}
private void button1_Click(object sender, EventArgs e)
{
    comboBox1.SelectedValue = 3;
}

虽然上面的示例显示了如何使用所选值设置选择,但如果出于任何原因您希望根据该值查找项目或所选索引,则需要使用此 GetItemValue 扩展方法并以此为基础找到项目。

示例 2 - 按值获取项目 → 设置 SelectedItem

private void button1_Click(object sender, EventArgs e)
{
    var value = 3;
    var item = comboBox1.Items.Cast<Object>()
        .Where(x => comboBox1.GetItemValue(x).Equals(value))
        .FirstOrDefault();
    comboBox1.SelectedItem = item;
}

示例 3- 按值获取索引 → 设置 SelectdIndex

private void button1_Click(object sender, EventArgs e)
{
    var value = 3;
    var item = comboBox1.Items.Cast<Object>()
        .Where(x => comboBox1.GetItemValue(x).Equals(value))
        .FirstOrDefault();
    var index = comboBox1.Items.IndexOf(item);
    comboBox1.SelectedIndex = index;
}