在运行时我将datagridview的一些列更改为组合框列。现在我如何获得组合框项目中现有的不同值?我使用实体模型作为数据源。我的代码是:
dgvLoadTable.DataSource = null;
var context = new AdminEntities();
var TableName = cboSelectTable.Text.ToString();
var rawData = context.GetType().GetProperty(TableName)
.GetValue(context, null);
var truncatedData = ((IQueryable<object>)rawData).Take(0);
var source = new BindingSource { DataSource = truncatedData };
dgvLoadTable.DataSource = source;
dgvLoadTable.ReadOnly = false;
dgvLoadTable.AllowUserToAddRows = true;
for (int row= 0; row < dgvLoadTable.Rows.Count; row++
{
for (int col = 0; col < dgvLoadTable.Columns.Count; col++)
{
if (col == 2 || col == 4)
{
this.dgvLoadTable[col, row] = new DataGridViewComboBoxCell();
var item = dgvLoadTable.Rows.Cast<DataGridViewRow>()
.Where(r => r.Cells[0].Value != null)
.Select(r => r.Cells[col].Value)
.Distinct();
((DataGridViewComboBoxCell)dgvLoadTable[col,row]).Items
.AddRange(item
.ToArray());
dgvLoadTable[col, row].ValueType = typeof(var);
}
}
}
dgvLoadTable.Refresh();
但这不起作用,有什么建议吗?
答案 0 :(得分:0)
dgvLoadTable[col, row].ValueType = typeof(var);
这是错误的。请将其保留或将其作为数据类型,而不是其集合!第2列和第2列中的数据类型是什么。 4?
您可以编写的字符串或整数
dgvLoadTable[col, row].ValueType = typeof(string);
或
dgvLoadTable[col, row].ValueType = typeof(int);
但是:您可能不需要控制数据类型,因为它是使用列生成的,并且您有onyl更改列类型,而不是值类型。
然而我发现更改单元格后需要恢复值;所以整段代码应该是这样的:
for (int row= 0; row < dgvLoadTable.Rows.Count; row++)
{
for (int col = 0; col < dgvLoadTable.Columns.Count; col++)
{
if (col == 2 || col == 4)
{
var temp = dgvLoadTable[col, row].Value;
this.dgvLoadTable[col, row] = new DataGridViewComboBoxCell();
dgvLoadTable[col, row].Value = temp;
var items = dgvLoadTable.Rows.Cast<DataGridViewRow>()
.Where(r => r.Cells[0].Value != null)
.Where(r => r.Cells[col].Value != null)
.Select(r => r.Cells[col].Value)
.OrderBy(r => r).Distinct();
((DataGridViewComboBoxCell) dgvLoadTable[col, row])
.Items.AddRange(items.ToArray());
}
}
}
dgvLoadTable.Refresh();
除此之外我们的代码工作正常,前提是您有item
中的数据。
如果列中有数据,它将包含所有这些不同的值。我添加了一个可选的排序和一个额外的where子句,以确保没有空值爬行..
请注意事项的顺序:首先我们存储值,然后更改单元格,然后恢复值,最后我们填充组合框项目!