组合框。选择物品

时间:2019-06-24 07:36:52

标签: c# winforms entity-framework combobox indexof

将项目加载到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";

如何选择项目?如果我分别拥有IdFullNameId包含在contract中,而名称在另一个实体中)。我这样尝试过:

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

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

enter image description here

enter image description here

更新

DisplayMember“全名”可以重复。但是“ id”永远不会。

2 个答案:

答案 0 :(得分:1)

ComboBox.SelectedIndex与组合框数据源中的列表 有关,查找项目结果的方式是另一个对象。该代码段中的内容是创建一个新对象ItemWorker),然后尝试“在数据源中查找它”,但实际上并没有有效地不同。

如果用于“设置项目的”的列表与数据源相同,则使用SelectedItem会更容易,请参考:

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

我将保留在model.Workers.Select...步骤中生成的列表的副本,并使用该副本“查找对象”。

答案 1 :(得分:0)

说明

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);