【问题标题】:How to get cell value in GridView (WITHOUT using cell index)如何在 GridView 中获取单元格值(不使用单元格索引)
【发布时间】:2013-10-30 01:04:08
【问题描述】:

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

而不是使用

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

类似

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

【问题讨论】:

标签: c# asp.net gridview


【解决方案1】:

您可以将GridViewRow's DataItem property 转换为DataRowView,然后引用列名:

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

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

DataItem 属性表示来自底层数据源的该行中的值,这就是您要处理的内容。

【讨论】:

  • @Adrian 在该代码周围,确保您正在检查的行实际上是一个数据行 (if (GridView1.Rows[0].RowType == DataControlRowType.DataRow))。第 0 行可能是标题行,没有与之关联的数据(另外,仅供参考 - 您不能在 cmets 中进行换行)。
【解决方案2】:

您可以使用数据键从行索引中访问您想要的任何数据。

在 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"];

【讨论】:

    【解决方案3】:

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

        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
    

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      相关资源
      最近更新 更多