我想将自定义对象关联到DataTable
的{{1}}中的每个单元格,这样,就我从DataGridView获取的事件,我可以自定义着色和其他行为。所以,当我添加一个新行时,我会执行以下操作:
DataRow
在DataGridView的CellFormatting事件中,我想让我的ClsCelula对象读取它的属性,如下所示:
DataRow oRow = dtItens.NewRow();
oRow["CodFamilia"] = new ClsCelula(TipoCelula.tcMostrar, "", Color.White);
oRow["Familia"] = new ClsCelula(TipoCelula.tcMostrar, "", Color.White);
oRow["Item"] = new ClsCelula(TipoCelula.tcMostrar, "", Color.White);
oRow["Descricao"] = new ClsCelula(TipoCelula.tcMostrar, "", Color.White);
oRow["Referencia"] = new ClsCelula(TipoCelula.tcMostrar, "Saldo Inicial", Color.Aqua);
dtItens.Rows.Add(oRow);
但是,这不起作用,因为当我读取行/列索引时,代码可能正在调用Object oCelula = dtItens.Rows[e.RowIndex][e.ColumnIndex];
if (oCelula != null)
{
if (oCelula is ClsCelula)
{
ClsCelula oValorCelula = (ClsCelula)oCelula;
e.CellStyle.BackColor = oValorCelula.Cor;
}
}
,因此oCelula始终是ToString()
。有没有办法解决?如何访问“真实”对象?
答案 0 :(得分:2)
由于您使用的是对象模型,因此似乎无需在{strong>全部使用DataTable
- 只需将DataSource
设置为List<T>
(或更好:BindingList<T>
)然后离开你! DataGridView
非常乐意绑定到对象,而每个行的底层对象只有.DataBoundItem
。
注意 - 对于双向数据绑定(即如果您希望在直接通过代码编辑对象时更新网格),您可能希望使用BindingList<T>
和实现{ {1}} - 但如果您只想显示列表并通过网格编辑项目,则不需要这样做。
答案 1 :(得分:1)
这里有几个选项:
DataTable
对象创建DataColumn
,并将每个列对象类型指定为ClsCelula
。在这种情况下,您将无法为网格格式化它。Dictionary<int, ClsCelula>
等中,其中index将是您必须创建和维护的某种自动增量数。 答案 2 :(得分:0)
我在代码中找到了这样的东西:dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value
。您可能必须将其强制转换为特定类型。
答案 3 :(得分:0)
老问题,但无论如何:
DataGridRecord obj = (DataGridRecord)Rows[args.RowIndex].DataBoundItem;