Как связать представление данных с коллекцией, чьи объекты содержат свойство списка? - PullRequest
2 голосов
/ 09 марта 2012

Как обычно, я чувствую, что упускаю что-то очевидное, но я не могу понять это и не могу найти что-нибудь в Интернете (хотя я нашел несколько сообщений, которые ПОЧТИ описывают то, что я ищу) Хотя я уверен, что то, что я пытаюсь сделать, распространено.

Скажем, у меня есть список этих:

 public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<string> Nicknames { get; set; }
}

и просто хотите привязать к представлению данных и отобразить псевдонимы каждого человека в столбце комбинированного списка. Как это сделать? Я могу загрузить их вручную, строка за строкой, но не могу понять, как назначить их в качестве источника данных DGV.

Я пробовал подобные вещи без удачи:

private void CreateColumns()
    {
        BindingList<Person> people = GetAllPeople();

        DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
        col.HeaderText = "ID";
        col.DataPropertyName = "ID";
        dataGridView1.Columns.Add(col);

        col = new DataGridViewTextBoxColumn();
        col.HeaderText = "Name";
        col.DataPropertyName = "Name";
        dataGridView1.Columns.Add(col);

        DataGridViewComboBoxColumn colCombo = new DataGridViewComboBoxColumn();
        //colCombo.DataPropertyName = "Nicknames";
        colCombo.DataSource = (from p in people select p.Nicknames.ToString()).ToList();
        colCombo.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        colCombo.HeaderText = "Nicknames";
        dataGridView1.Columns.Add(colCombo);


        dataGridView1.DataSource = people;          
    }

Спасибо за любые идеи по этому поводу. У меня такое чувство, что я захочу ударить себя по лбу, когда на это ответят.

1 Ответ

0 голосов
/ 10 марта 2012

Не бейте себя по лбу, боюсь, вам придется загружать их вручную строка за строкой. Я бы поместил такой код в обработчик событий DataBindingComplete объекта DataGridView:

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) {
    foreach (DataGridViewRow row in dataGridView1.Rows) {
        var person = row.DataBoundItem as Person;
        if (person != null) { 
            var combo = row.Cells["NicknameDropdown"] as DataGridViewComboBoxCell;
            combo.DataSource = person.Nicknames;
        }
    }
}

Этот подход упрощает ваш код построения для DataGridViewComboBoxColumn. Это становится (обратите внимание, нет явной привязки данных):

DataGridViewComboBoxColumn colCombo = new DataGridViewComboBoxColumn();
colCombo.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
colCombo.HeaderText = "Nicknames";
colCombo.Name = "NicknameDropdown";
dataGridView1.Columns.Add(colCombo);

Примечание:
Когда мне первоначально приходилось делать нечто подобное, мне не нравился тот факт, что DataGridViewComboBoxCell загружен без выбранного элемента. Я обнаружил, что как обычно установить выбранный элемент Combobox не работает (SelectedIndex, SelectedItem и т. Д.), Поэтому я в итоге использовал свойство DataGridViewComboBoxCell Value. Вы можете добавить (подверженный опасности) код, подобный этому, в DataBindingComplete:

combo.Value = combo.Items["Big Joe"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...