将DataGridViewComboBoxColumn绑定到嵌套列表

时间:2016-03-29 10:21:16

标签: c# winforms datagridview

我有一个具有以下属性的类:

Public string Name { get; set; }
Public string LastName { get; set; }
Public List<string> Jobs{ get; set; }

属性NameLastName绑定到DataGridView,而我需要将Jobs绑定到ComboBox内的DataGridView

  • 如果此人在ComboBox中有一个作业,则应该只显示数字1。
  • 如果此人有2个工作,则在点击ComboBox时应显示1和2。

例如:

John Smith 1
Paul Mayer 1
           2

以下是我添加ComboBoxColumn

的方法
private void AddComboBox()
{
    DataGridViewComboBoxColumn Jobs = new DataGridViewComboBoxColumn();
    foreach (var item in People)
    {
        for (int i = 0; i < item.Jobs.Count; i++)
        {
            Jobs.Items.Add(item.Jobs[i]);
        }
    }
}

但是这段代码使每个ComboBox都相同,所以我不是在第一个ComboBox中有1而在第二个ComboBox中有1-2,而是每个{{1}得到1-1-2 }。

有没有办法让当前ComboBox添加项目?不幸的是,由于它是ComboBoxColumn,我不会像细胞一样拥有Rows[i]属性。

我也尝试过数据绑定,但Jobs是一个列表,因此DataPropertyName因列表转换为字符串而引发错误。

感谢所有人。

1 个答案:

答案 0 :(得分:0)

ComboBox完成自己的源绑定后,您可以通过寻找每个DataGridView来使用数据绑定。

  1. 完全删除AddComboBox,您不会需要它。
  2. 添加以下事件处理程序dataGridViewJobs.DataBindingComplete += DataGridViewJobs_DataBindingComplete;,并在其中为每个DataGridViewComboBoxCell提供源代码:

    private void DataGridViewJobs_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        string colName = "Jobs";
    
        if (dataGridViewJobs.Columns.Contains(colName))
        {
            dataGridViewJobs.Columns.Remove(colName);
        }
    
        DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
        column.Name = colName;
        dataGridViewJobs.Columns.Add(column);
    
        foreach (DataGridViewRow row in dataGridViewJobs.Rows)
        {
            var person = (Person)row.DataBoundItem;
            var cell = row.Cells[colName] as DataGridViewComboBoxCell;
    
            cell.DataSource = person.Jobs;
            cell.Value = person.Jobs[0];
        }
    }