如何将datagridview绑定到其对象包含list属性的集合?

时间:2012-03-09 17:55:36

标签: .net data-binding datagridview

像往常一样,我觉得我似乎错过了一些显而易见的东西,但我无法弄清楚这一点并且无法在网上找到任何东西(尽管我找到了几篇几乎描述我之后的帖子)虽然我确定我要做的事情很常见。

说我有一个清单:

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

并且只想绑定到datagridview并在组合框列中显示每个Person的昵称。这是怎么做到的?我可以手动,逐行加载它们,但无法弄清楚如何将它们分配为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 :(得分:0)

不要在额头上拍打自己,我担心你不得不一个接一个地手动加载它们。我将这样的代码放在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"];