如何访问DataRow中单元格后面的“真实”对象

时间:2011-02-13 22:02:22

标签: c# datagridview datarow

我想将自定义对象关联到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()。有没有办法解决?如何访问“真实”对象?

4 个答案:

答案 0 :(得分:2)

由于您使用的是对象模型,因此似乎无需在{strong>全部使用DataTable - 只需将DataSource设置为List<T> (或更好:BindingList<T>)然后离开你! DataGridView非常乐意绑定到对象,而每个行的底层对象只有.DataBoundItem

注意 - 对于双向数据绑定(即如果您希望在直接通过代码编辑对象时更新网格),您可能希望使用BindingList<T> 实现{ {1}} - 但如果您只想显示列表并通过网格编辑项目,则不需要这样做。

答案 1 :(得分:1)

这里有几个选项:

  • 从您自己的DataTable对象创建DataColumn,并将每个列对象类型指定为ClsCelula。在这种情况下,您将无法为网格格式化它。
  • 为每个创建的对象创建第二个不可见的阴影列,然后在其中将对象的索引放在某些Dictionary<int, ClsCelula>等中,其中index将是您必须创建和维护的某种自动增量数。
  • 做Marc在评论中说的话。这是你能在这里做的最好的事情。

答案 2 :(得分:0)

我在代码中找到了这样的东西:dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value。您可能必须将其强制转换为特定类型。

答案 3 :(得分:0)

老问题,但无论如何:

DataGridRecord obj = (DataGridRecord)Rows[args.RowIndex].DataBoundItem;