在GridView行中添加ID

9

如何为GridView行添加ID(ID应该被渲染)?

我正在使用.NET(C#)。我有GridView控件。

我有一些JavaScript函数,它们正在操作表格行,但必须为这些行分配ID:

<table>
    <tr id=1> ...  
    <tr id=2> ...  //id should come from database
..

我的GridView是从数据库中获取的数据生成的。重要的是不要有虚假的行ID,而是真正来自于数据库的行ID(有一些ajax JavaScript函数根据这些ID和用户对表格的操作更新数据库)。

我的GridView的一部分如下:

  <asp:GridView ID="grdNews" runat="server" BorderStyle="None" RowStyle-BorderStyle="None"
                GridLines="None" CssClass="table" Style="white-space: nowrap" AutoGenerateColumns="False"
                DataKeyNames="ID" AllowSorting="True" AllowPaging="true" OnSorting="grdNews_Sorting" OnRowDataBound="grdNews_RowDataBound">
                <RowStyle BorderStyle="None" />
                <HeaderStyle CssClass="nodrag" />
                <Columns>
                ....

我已经尝试了以下方法:
 protected void grdNews_RowDataBound(object sender, GridViewRowEventArgs e)
{
     if (e.Row.RowType == DataControlRowType.DataRow)
     {
         e.Row.ID = grdNews.DataKeys[e.Row.RowIndex].Value.ToString();
     }
}

这样做可以给e.Row.ID赋予正确的值,但是这不会呈现出该ID。
那么如何为GridView中的行呈现来自数据库的ID呢?

如果你只是想分配行的索引,为什么需要将其分配为属性?您也可以从客户端访问表格的第n行。 - Tim Schmelter
4个回答

22

请尝试以下步骤:

protected void grdNews_RowDataBound(object sender, GridViewRowEventArgs e)
 {
      if (e.Row.RowType == DataControlRowType.DataRow)
      {
        GridViewRow row = e.Row;
        row.Attributes["id"] =grdNews.DataKeys[e.Row.RowIndex].Value.ToString();


      }
 } 

这很容易在客户端引起ID重复。将DataKey与ClientID结合使用可以解决此问题。或者,可以改用data-xxx-id作为属性。 - Mikael Dúi Bolinder

2
最简单的方法是使用隐藏字段,您可以从客户端和服务器端访问该字段。
<Columns>
      <asp:TemplateField >
           <ItemTemplate>
               <asp:HiddenField ID="HiddenID" runat="server" Value='<%#Eval("ID") %>' />
           </ItemTemplate>
      </asp:TemplateField>
      ....
</Columns>

我不想重新编写现有的 JavaScript 函数,但它们已经使用 <tr id="..."> 而不是隐藏字段进行工作。如果上面的答案无效,这可能是一个选项,但它有效。 - renathy

0

Vb.net 代码

  Private Sub gvPayments_RowDataBound(ByVal sender As Object, ByVal e As     System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvPayments.RowDataBound

    Dim counter As Integer = 0

    For Each oItem As GridViewRow In gvPayments.Rows

        counter += 1
        oItem.Cells(1).Text = counter.ToString()
        oItem.Attributes("id") = "tr_" + counter.ToString

    Next



End Sub

0

请确保:

  1. 在 IsPostBack 事件之外调用数据库绑定函数。

  2. 在网格定义中未提及 RowDataBound 事件签名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接