如何将DataGridViewComboBoxColumn绑定到父行绑定对象的list属性?

时间:2015-03-16 21:36:14

标签: c# .net datagridview

鉴于以下类别:

public class Shirt
{
    public string Description { get; set; }
    public List<Color> ColorOptions { get; set; }
    public int SelectedColorId { get; set; }
}

public class Color
{
    public int Id { get; set; }
    public string Label { get; set; }
}

为什么我无法使用以下代码将组合框显示在DataGridView中?

        List<Shirt> foundShirts = _dbShirtRepo.GetShirts();

        var nameColumn = new DataGridViewTextBoxColumn();
        nameColumn.DataPropertyName = "Description";
        nameColumn.HeaderText = "Description";

        var colorSelectColumn = new DataGridViewComboBoxColumn();
        colorSelectColumn.DataPropertyName = "ColorOptions";
        colorSelectColumn.DisplayMember = "Label";
        colorSelectColumn.ValueMember = "Id";


        dataGridView1.Columns.Add(nameColumn);
        dataGridView1.Columns.Add(colorSelectColumn);

        dataGridView1.DataSource = foundShirts;

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 1)
    {
        DataGridViewComboBoxCell combo = this.dataGridView1[1, e.RowIndex] as DataGridViewComboBoxCell;
        combo.DataSource = ((Shirt)dataGridView1.Rows[e.RowIndex].DataBoundItem).ColorOptions;
    }
} 

如您所见,您必须为每个请求提供DataSource ,因为您一次只能拥有一个。没有办法为每行中的每个组合预设不同的数据源。

您可以改进上述解决方案,但概念是相同的:

  • 用户点击,悬停或以其他方式激活&#34;细胞
  • 在用户有机会打开之前设置列组合的DataSource

这样用户就不会知道任何恶作剧,你可以为每一行提供不同的选择。

注意:我不能100%确定DataGridViewComboBoxCell的运作方式,它完全可能会缓存并保留其数据源,但之前会进行一些实验依靠它。

答案 1 :(得分:0)

您尚未为DataSource设置DataGridViewComboBoxColumn属性。有不同的方法可以解决您的问题。

DataSource的{​​{1}}设置为DataGridViewComboBoxColumn。有了这个,您只能看到foundShirts.ColorOptions列表中的可用颜色。

foundShirts

如果您想查看所有可能的颜色,请准备一份单独的所有颜色列表,并将其设置为var colorSelectColumn = new DataGridViewComboBoxColumn(); colorSelectColumn.DataPropertyName = "ColorOptions"; colorSelectColumn.DisplayMember = "Label"; colorSelectColumn.ValueMember = "Id"; colorSelectColumn.DataSource = foundShirts.ColorOptions; DataGridViewComboBoxColumn

DataSource