如何在GridView中获取单元格值(不使用单元格索引)

如何在不使用单元格索引的情况下从gridview获取单元格值? 假设我表中的第一列名称是“RowNumber”。

而不是使用

string name = GridView1.Rows[0].Cells[0].Text; 

就像是

 string name = GridView1.Rows[0].Cells["RowNumber"].Text; 

您可以将GridViewRow的DataItem属性转换为DataRowView,然后引用列名:

 DataRowView rowView = (DataRowView)GridView1.Rows[0].DataItem; string name = rowView["RowNumber"].ToString(); 

你不能从Cells集合中做到这一点,因为它们只是TableCell对象,并且它们对底层数据一无所知。

DataItem属性表示来自基础数据源的该行中的值,因此这是您要处理的内容。

您可以使用数据键从行索引访问所需的任何数据。

在gridview的标记中,添加您希望能够访问gridview的所有字段。

  

可以使用行索引在后面的代码中访问这些数据键

  var id = gvTransactionHistory.DataKeys[rowIndex].Values["ID"]; var AnyField = gvTransactionHistory.DataKeys[rowIndex].Values["AnyField"]; 

这是我写的一个函数。 因为我们通常一遍又一遍地获得相同的字段列表,所以我缓存了索引查找。

  private static readonly HybridDictionary cache = new HybridDictionary(); public static object[] GetColumnValues( this GridView g, int rownumber, string columnNamesCommaSeparated) { var dataView = g.DataSource as DataView; if (dataView != null) { DataRow dataRow = dataView[rownumber].Row; object[] items = dataRow.ItemArray; DataColumnCollection columns = dataRow.Table.Columns; string lookupkey = g.ID + columnNamesCommaSeparated; var colids = cache[lookupkey] as int[]; int columnCount; if (colids == null) { string[] columnNames = columnNamesCommaSeparated.Split(','); columnCount = columnNames.Count(); colids = new int[columnCount]; for (int i = 0; i < columnCount; i++) { colids[i] = columns.IndexOf(columnNames[i]); } cache.Add(lookupkey, colids); } columnCount = colids.Length; var values = new object[columnCount]; for (int i = 0; i < columnCount; i++) { values[i] = items[colids[i]] ?? ""; } return values; } return null; } 

使用它做类似的事情

  object[] values = g.GetColumnValues(e.Row.DataItemIndex, "Firstname,Lastname,CompanyName"); if (values != null) { string header = Server.HtmlEncode(values[0] + " " + values[1] + " @ " + values[2]); } // do whatever you want with this value