繁体   English   中英

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

[英]How to access the “real” object behind cells in DataRow

我想将自定义对象与DataTableDataRow中的每个单元相关联,以便在从DataGridView获得的事件上,我可以自定义颜色和其他行为。 因此,当我添加新行时,请执行以下操作:

  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);

在DataGridView的CellFormatting事件上,我想让我的ClsCelula对象读取其属性,如下所示:

Object oCelula = dtItens.Rows[e.RowIndex][e.ColumnIndex];
if (oCelula != null)
{
  if (oCelula is ClsCelula)
  {
    ClsCelula oValorCelula = (ClsCelula)oCelula;
    e.CellStyle.BackColor = oValorCelula.Cor;
  }
}

但是,这行不通,因为当我读取行/列索引时,代码可能正在调用ToString() ,因此oCelula始终是System.String 有没有办法解决? 如何访问“真实”对象?

因为你是从一个对象模型的工作,似乎没有必要使用DataTable这里所有的 -刚刚成立的DataSource到一个List<T>或者更好BindingList<T>并远离你去! DataGridView非常高兴地绑定到对象,并且基础对象在每一行上都只是.DataBoundItem

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

这里有几种选择:

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

老问题,但无论如何:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM