如何将数据网格视图绑定到对象包含列表属性的集合



和往常一样,我觉得自己错过了一些显而易见的东西,但我无法理解,也无法在网上找到任何东西(尽管我发现了一些帖子,几乎描述了我想要做的事情),尽管我确信我想做的事情很常见。

假设我有一个列表:

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

谢谢你对此有任何想法。我有一种感觉,当这个问题得到回答时,我会想打自己的额头。

不要打自己的额头,恐怕你必须手动逐行加载它们。我会把这样的代码放在DataGridView的DataBindingComplete事件处理程序中:

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加载时没有选择任何项。我发现我通常如何设置选定的组合框项不起作用(SelectedIndex、SelectedItem等),所以我最终使用了DataGridViewComboBoxCell Value属性。您可以向DataBindingComplete:添加这样的(容易发生危险的)代码

combo.Value = combo.Items["Big Joe"];

最新更新