2011-02-13 49 views
1

我想将自定义对象与DataTableDataRow中的每个单元相关联,以便从DataGridView获取的事件上可以自定义着色和其他行为。所以,当我添加一个新行,我做到以下几点:如何访问DataRow中单元格后面的“真实”对象

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。有没有办法解决?我怎样才能访问“真实”的对象?

+0

如果您有对象表示,为什么使用DataTable?你可以直接绑定到对象模型... – 2011-02-13 22:10:21

+0

真的吗?不知道我可以用DataGridView做到这一点。我怎样才能做到这一点? – Pascal 2011-02-13 22:14:07

回答

2

因为你是从一个对象模型的工作,似乎没有必要使用DataTable这里所有 - 刚刚成立的DataSourceList<T>(或更好:BindingList<T>)和远离你去! DataGridView完美地绑定到对象,并且每个行上的底层对象只是.DataBoundItem

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

0

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

1

几个选择这里:

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