如何在不使用单元格索引的情况下从gridview获取单元格值? 假设我的表中的第一个列名是" RowNumber"。
而不是使用
string name = GridView1.Rows[0].Cells[0].Text;
像
这样的东西string name = GridView1.Rows[0].Cells["RowNumber"].Text;
答案 0 :(得分:5)
您可以将GridViewRow's DataItem property转换为DataRowView,然后引用列名称:
DataRowView rowView = (DataRowView)GridView1.Rows[0].DataItem;
string name = rowView["RowNumber"].ToString();
您无法从Cells
集合执行此操作,因为它们只是TableCell对象,并且它们对底层数据一无所知。
DataItem属性表示基础数据源中该行的值,因此这就是您要处理的内容。
答案 1 :(得分:1)
您可以使用datakeys从行索引中访问所需的任何数据。
在gridview的标记中,添加您希望能够访问gridview的所有字段。
<asp:GridView ID="gvTransactionHistory" runat="server"
AutoGenerateColumns="false"
onselectedindexchanging="gvTransactionHistory_SelectedIndexChanging"
DataKeyNames="ID, AnyField">
可以使用行索引
在后面的代码中访问这些数据键 var id = gvTransactionHistory.DataKeys[rowIndex].Values["ID"];
var AnyField = gvTransactionHistory.DataKeys[rowIndex].Values["AnyField"];
答案 2 :(得分:0)
这是我写的一个函数。因为我们通常会一遍又一遍地获得相同的字段列表,所以我缓存了索引查找。
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