鉴于以下类别:
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;
答案 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
,因为您一次只能拥有一个。没有办法为每行中的每个组合预设不同的数据源。
您可以改进上述解决方案,但概念是相同的:
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