将项目加载到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";
如何选择项目?如果我分别拥有Id
和FullName
(Id
包含在contract
中,而名称在另一个实体中)。我这样尝试过:
ItemWorker item = new ItemWorker
{ Id = contract.Worker, FullName = contract.WorkerNavigation.FullName };
cbWorker.SelectedIndex = cbWorker.Items.IndexOf(item);
但是IndexOf
返回了-1
。我的item
的值和现有的值相同
更新
DisplayMember“全名”可以重复。但是“ id”永远不会。
答案 0 :(得分:1)
ComboBox.SelectedIndex
与组合框数据源中的列表 有关,查找项目结果的方式是另一个对象。该代码段中的内容是创建一个新对象(ItemWorker
),然后尝试“在数据源中查找它”,但实际上并没有有效地不同。
如果用于“设置项目的”的列表与数据源相同,则使用SelectedItem
会更容易,请参考:
我将保留在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);