【问题标题】:How do bind a datagridview to a collection whose objects contain a list property?如何将 datagridview 绑定到其对象包含列表属性的集合?
【发布时间】:2012-03-27 04:18:46
【问题描述】:

像往常一样,我感觉好像遗漏了一些明显的东西,但我无法弄清楚这一点,也无法在网上找到任何东西(尽管我发现了一些几乎描述了我所追求的帖子) ,尽管我确信我正在尝试做的事情很常见。

假设我有一个列表:

 public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<string> Nicknames { 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;          
    }

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

【问题讨论】:

    标签: .net data-binding datagridview


    【解决方案1】:

    不要打自己的额头,恐怕您将不得不手动逐行加载它们。我会将这样的代码放在 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 加载时没有选定项目的事实。我发现我通常如何设置选定的 Combobox 项不起作用(SelectedIndex、SelectedItem 等),所以我最终使用了 DataGridViewComboBoxCell Value 属性。您可以将这样的(危险的)代码添加到 DataBindingComplete:

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

    【讨论】:

    • 感谢 Jay,您回复我。这基本上是我前进的方向,你的回应让我更有信心。我很感激。