组合框。 Select 项

ComboBox. Select item

将项目加载到 ComboBox

private class ItemWorker
{
    public int Id { get; set; }
    public string FullName { get; set; }
}


bindingWorker.DataSource = model.Workers
    .Select(x => new ItemWorker
    {
        Id = x.Id,
        FullName = x.FullName
    })
    .ToList();
cbWorker.DataSource = bindingWorker;
cbWorker.DisplayMember = "FullName";
cbWorker.ValueMember = "Id";

我怎样才能 select 项目?如果我分别有 IdFullNameId 包含在 contract 中,名称包含在另一个实体中)。我试过这样:

ItemWorker item = new ItemWorker 
{ Id = contract.Worker, FullName = contract.WorkerNavigation.FullName };
cbWorker.SelectedIndex = cbWorker.Items.IndexOf(item);

但是 IndexOf 返回了 -1。我的 item 和现有的

的值相同

更新

DisplayMember "FullName" 可以重复。但是"id"从来没有。

说明

IndexOf() 正在其项目中寻找。创建新项目时:

ItemWorker item = new ItemWorker 
{ Id = contract.Worker, FullName = contract.WorkerNavigation.FullName };

两个值相同,只是内存地址不同。一个属于 ComboBox.DataSource,另一个不属于。因此返回-1.

解决方案

就我而言,我做了下一个:

    public static string GlueTogether(int id, string fullName)
    {
        return String.Format("{0} - id: {1}", fullName, id);
    }

    public static string Parse(string fullName)
    {
        return fullName.Substring(0, fullName.IndexOf(" - id:"));
    }

DisplayMember 类似于文本 "Name - id: 10"。并找到:

cbWorker.FindString(cbWorker.SelectedText);

ComboBox.SelectedIndex是关于组合框数据源中的列表,您查找项目结果的方式是不同的对象。您在该代码片段中创建了一个 新对象 (ItemWorker),然后您尝试 "find it in the data source",但它并不存在有效不同。

如果您"set the item of"使用的列表与您的数据源相同,您可能会发现使用起来更方便SelectedItem,参考:

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.combobox.selecteditem?view=netframework-4.8

我会保留在 model.Workers.Select... 步骤中生成的列表的副本,并将其用于 "find objects in"。