Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将DataGridViewComboBoxColumn绑定到父行绑定对象的list属性?_C#_.net_Datagridview - Fatal编程技术网

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

C# 如何将DataGridViewComboBoxColumn绑定到父行绑定对象的list属性?,c#,.net,datagridview,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 La

鉴于以下类别:

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; }
}
为什么我不能使用下面的代码让combobox显示在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;

试着这样做:

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;
    }
} 
如您所见,您必须为每个请求提供数据源,因为一次只能有一个数据源。无法为每行中的每个组合预先设置不同的数据源

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

用户单击、悬停或以其他方式激活单元格 在用户有机会打开该列的组合之前设置该列的数据源 这样,用户就不知道有什么恶作剧在进行,您可以为每一行提供不同的选择

注意:我不是100%确定DataGridViewComboBoxCell是如何工作的,它完全可能缓存并持久化其数据源,但在依赖它之前先进行一些实验。

您尚未为DataGridViewComboxColumn设置DataSource属性。有不同的方法来解决你的问题

将DataGridViewComboBoxColumn的数据源设置为foundShirts.ColorOptions。这样,您就可以在foundShirts列表中只看到可用的颜色

如果要查看所有可能的颜色,请准备一个单独的所有可能颜色列表,并将其设置为DataGridViewComboBoxColumn数据源


使用调试器时,在分配datagridview1之前单步执行代码时,foundShirts中的值是什么。数据源还说明这是winforms应用还是webforms appWinForms。foundShirts实际上包含Shirt对象的列表。在分配datagridview1.DataSource后,我出现以下错误:DataGridView中发生以下异常:System.ArgumentException:DataGridViewComboBoxCell值无效。。。我的解决方案:将数据源绑定到整个DataGridView之后。我只是遍历DataGridView.Rows集合,获取组合框列,并根据绑定到该行的对象的属性显式地向DataGridViewComboxCell添加项。希望能帮助别人。
var colorSelectColumn = new DataGridViewComboBoxColumn();
colorSelectColumn.DataPropertyName = "ColorOptions";
colorSelectColumn.DisplayMember = "Label";
colorSelectColumn.ValueMember = "Id";
colorSelectColumn.DataSource = foundShirts.ColorOptions;
List<Color> allAvailableColorOptions = new List<Color>();
// add all the possible colors to this list.

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