Поле со списком. Выберите предмет - PullRequest
0 голосов
/ 24 июня 2019

Загрузить элементы в 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 и существующего совпадают

enter image description here

enter image description here

Обновление

DisplayMember "FullName" может дублироваться.Но «id» никогда.

Ответы [ 2 ]

1 голос
/ 06 июля 2019

ComboBox.SelectedIndex относится к списку в источнике данных поля со списком , способ поиска результатов элемента - это другой объект.В этом фрагменте кода есть создание нового объекта (ItemWorker), а затем вы пытаетесь «найти его в источнике данных», но его там нет, поскольку он эффективно отличается.

Если список, который вы используете для «установки элемента», совпадает с вашим источником данных, вам может быть проще использовать SelectedItem, ссылка:

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

Я хотел бы сохранить копию списка, созданного на шаге model.Workers.Select..., и использовать его для «поиска объектов».

0 голосов
/ 06 июля 2019

Пояснение

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