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;