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

本文关键字:单元格 索引 GridView 获取 | 更新日期: 2023-09-27 18:36:25

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

而不是使用

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

类似的东西

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

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

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

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

不能从 Cells 集合执行此操作,因为它们只是 TableCell 对象,并且它们对基础数据一无所知。

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

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

在网格视图

的标记中,添加您希望能够访问网格视图的所有字段。

<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"];
这是我

写的一个函数。 由于我们通常会一遍又一遍地获得相同的字段列表,因此我缓存了索引查找。

    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