.net 如何将datagridview绑定到对象包含列表属性的集合?

.net 如何将datagridview绑定到对象包含列表属性的集合?,.net,data-binding,datagridview,.net,Data Binding,Datagridview,像往常一样,我觉得好像我错过了一些明显的东西,但我无法弄明白这一点,也无法在网上找到任何东西(尽管我找到了一些几乎描述了我所追求的东西的帖子),尽管我确信我尝试做的事情很普遍 假设我有一个清单: public class Person { public int ID { get; set; } public string Name { get; set; } public List<string> Nicknames { get; set; } } 公共类

像往常一样,我觉得好像我错过了一些明显的东西,但我无法弄明白这一点,也无法在网上找到任何东西(尽管我找到了一些几乎描述了我所追求的东西的帖子),尽管我确信我尝试做的事情很普遍

假设我有一个清单:

 public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<string> Nicknames { get; set; }
}
公共类人物
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共列表昵称{get;set;}
}
只需绑定到datagridview并在组合框列中显示每个人的昵称。这是怎么做到的?我可以一行一行地手动加载它们,但无法确定如何将它们指定为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;          
    }
private void CreateColumns()
{
BindingList-people=GetAllPeople();
DataGridViewTextBoxColumn=新DataGridViewTextBoxColumn();
col.HeaderText=“ID”;
col.DataPropertyName=“ID”;
dataGridView1.Columns.Add(col);
col=新的DataGridViewTextBoxColumn();
col.HeaderText=“Name”;
col.DataPropertyName=“Name”;
dataGridView1.Columns.Add(col);
DataGridViewComboxColumn colCombo=新DataGridViewComboxColumn();
//colCombo.DataPropertyName=“昵称”;
colCombo.DataSource=(从people中的p选择p.昵称.ToString()).ToList();
colCombo.AutoSizeMode=DataGridViewAutoSizeColumnMode.Fill;
colCombo.HeaderText=“昵称”;
dataGridView1.Columns.Add(colCombo);
dataGridView1.DataSource=人;
}

谢谢你在这方面的任何想法。我有一种感觉,当这个问题得到回答时,我会想拍自己的前额。

不要拍自己的前额,恐怕你必须手动一行一行地加载它们。我将这样的代码放在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的构造代码。它变成(请注意,没有明确的数据绑定):

旁注:
当我最初不得不做一些类似的事情时,我不喜欢DataGridViewComboxCell加载时没有选择项的事实。我发现我通常如何设置选定的Combobox项不起作用(SelectedIndex、SelectedItem等),因此我最终使用了DataGridViewComboBoxCell属性。您可以在DataBindingComplete中添加(容易发生危险的)如下代码:

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

别拍自己的额头,恐怕你得一行一行地手动加载。我将这样的代码放在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的构造代码。它变成(请注意,没有明确的数据绑定):

旁注:
当我最初不得不做一些类似的事情时,我不喜欢DataGridViewComboxCell加载时没有选择项的事实。我发现我通常如何设置选定的Combobox项不起作用(SelectedIndex、SelectedItem等),因此我最终使用了DataGridViewComboBoxCell属性。您可以在DataBindingComplete中添加(容易发生危险的)如下代码:

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

谢谢你,杰,给我回电话。这基本上就是我的方向,你的回答让我更有信心。谢谢你,杰伊,谢谢你回复我。这基本上就是我的方向,你的回答让我更有信心。我很感激。