通过asp.net中的数据表在asp gridview中添加按钮列

Posted

技术标签:

【中文标题】通过asp.net中的数据表在asp gridview中添加按钮列【英文标题】:Add column of button in asp gridview by datatable in asp.net 【发布时间】:2021-11-29 02:58:38 【问题描述】:

我想通过asp.net中的数据表在asp gridview中添加按钮

这是我的 gridview 代码,

  <asp:GridView ID="gv_productdetail" runat="server" AutoGenerateColumns="false" CssClass="table table-bordered table-condensed">
    <columns>                        
        <asp:BoundField DataField="MortageID" HeaderText="Id"  />
        <asp:BoundField DataField="Type" HeaderText="Type" />           
    </columns>
</asp:GridView>

现在,这个 gridview 是通过 ajax 方法绑定的。这是代码,

//Fill Product Grid
function FillProductGrid()             

    //Display Product
    var AcNo = document.getElementById('<%= txt_acno.ClientID%>').value;    
    var Data = JSON.stringify( mortgageNo: MortgageNo, acNo: AcNo );            
    $.ajax(
        url: "CustomerMortgage.aspx/GetProductList",
        async: true,
        type: "POST",
        dataType: "json",
        data: Data,
        contentType: "application/json; charset=utf-8",
        success: OnSuccess,
        failure: function (response) 
            alert(response.d);
        ,
        error: function (response) 
            alert(response.d);
        
    );


function OnSuccess(response)             
    $('#<%=gv_productdetail.ClientID%>').DataTable(
    
        paging: false,
        destroy: true,
        bLengthChange: true,
        lengthMenu: [[5, 10, -1], [5, 10, "All"]],
        bFilter: true,
        bSort: true,
        bPaginate: true,
        data: response.d,
        columns: [ 'data': 'ProductId' ,
             'data': 'ProductType' 
    );
;

整个数据被完美绑定。但是现在我想在每一列中添加按钮,我尝试了 asp:TemplateField 但它不起作用。

【问题讨论】:

【参考方案1】:

你应该可以只放一个按钮。

您的标记将如下所示:

    <asp:GridView ID="gv_productdetail" runat="server" AutoGenerateColumns="false" CssClass="table table-bordered table-condensed">
       <columns>                        
          <asp:BoundField DataField="MortageID" HeaderText="Id"  />
          <asp:BoundField DataField="Type" HeaderText="Type" />
           
          <asp:TemplateField HeaderText="View">
              <ItemTemplate>
                  <asp:Button ID="cmdRowSel" runat="server" Text="Row Sel" />
              </ItemTemplate>
          </asp:TemplateField>

       </columns>
   </asp:GridView>

但是,作为一般规则,我不会在结果网格中公开数据库 PK“id”。

对于使用 ajax 调用填充此网格而不是隐藏代码的好处,我们完全不清楚。您仍然必须编写 web 方法,但目的是什么?所有这些额外的工作值得吗?您不会获得更好的性能。

但是,通过从客户端代码中提取数据,您将如何防止数据库 PK id 被隐藏?您真的不希望客户端在浏览器中看到或永远拥有这些 PK 数据库行 ID 值。

gv 具有针对上述问题的内置功能。

(数据键)。这意味着 PK 行数据库 ID 可以保持隐藏状态,并且永远不会暴露给客户端浏览器。

假设我有一个这样的酒店列表:

    <asp:GridView ID="gvHotels" runat="server" AutoGenerateColumns="false" 
        CssClass="table table-bordered "
        DataKeyNames="ID" >
       <columns>                        
          <asp:BoundField DataField="HotelName" HeaderText="Hotel"  />
          <asp:BoundField DataField="City" HeaderText="City"  />
          <asp:BoundField DataField="Province" HeaderText="Province"  />
          <asp:BoundField DataField="Description" HeaderText="Description" />
           
          <asp:TemplateField HeaderText="View">
              <ItemTemplate>
                  <asp:Button ID="cmdRowSel" runat="server" Text="Row Sel" CssClass="btn"
                      OnClick="cmdRowSel_Click"/>
              </ItemTemplate>
          </asp:TemplateField>

       </columns>
   </asp:GridView>

好的,代码要填写,但更重要的是按钮点击事件。

所以我们要填写以下代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        LoadGrid
    End If
End Sub

Sub LoadGrid()
    Dim strSQL As String =
       "SELECT ID, HotelName, City, Province, Description FROM tblHotels ORDER BY HotelName"

    Using con As New SqlConnection(My.Settings.TEST3)
        Using cmdSQL As New SqlCommand(strSQL, con)

            con.Open()
            gvHotels.DataSource = cmdSQL.ExecuteReader
            gvHotels.DataBind()

        End Using
    End Using
End Sub

我们现在有了这个;

看看那是多么少的代码 - 超级简单。

到目前为止还没有什么可看的,但是那个按钮点击事件?我现在可以获得行点击,更重要的是获得数据库 PK 行 ID,但从未在客户端公开它。我们后面的行点击按钮代码是这样的:

Protected Sub cmdRowSel_Click(sender As Object, e As EventArgs)

    Dim btn As Button = sender
    Dim gRow As GridViewRow = btn.Parent.Parent

    Debug.Print("Row click index = " & gRow.RowIndex)
    Dim PkID As Integer = gvHotels.DataKeys(gRow.RowIndex).Item("ID")

    Debug.Print("Row click PK ID  = " & PkID)

End Sub

输出:

Row click index = 5
Row click PK ID  = 72

现在上面是非常有效的,因为通过使用 DataKeys 设置,PK 行 id 永远不需要也不会暴露客户端。

无论如何,我只是认为您最好使用服务器端代码来填充该网格。您获得零性能优势,但您失去了通过服务器端事件获取行数据的能力,但更重要的是使用 PK 数据库行值,而不必显示它,甚至允许或拥有数据库PK 行 id 暴露或发送给客户端。

无论如何,只需按照上面的方法在模板设置中添加按钮就可以用于您的设置,但是除非您拥有客户端代码的那部分,否则在后面的代码中单击生成的按钮将不会使用数据库 PK id ,这意味着现在正在将数据库 ID 发送到客户端,更糟糕的是,您的按钮代码服务器端无法为由 ajax 填充的网格获取它们(除非您将 PK 数据库 ID 拉到该网格中)。

【讨论】:

根据我所描述的问题,只有 asp:TemplateField 不能在其中工作。还有为什么我们希望看到 web 方法,因为我告诉整个数据显示完美,这意味着 web 方法是完美的,只是我想在每一列中添加一个按钮,这只是设计部分。 如前所述,将 asp.net 按钮简单地拖放到表中即可,但要这样做,您需要使用服务器端代码填充网格,因为它是服务器端 gridview/listview最终生成标准的 html 表格输出。因此,我想您可以编写填充该表的客户端代码并添加按钮。但是,当不需要时,这是很多工作。我没有解决方案,因为我不建议这样做,而且我无法为花费这种钱做一个有效的用例。所以删除 asp.net 服务器控件,并使用一些 js + 客户端网格设置

以上是关于通过asp.net中的数据表在asp gridview中添加按钮列的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.NET 通过 SQL 表显示存储在文本框中的数据

如何通过单击 ASP.NET gridview 中一行中的按钮来获取行数据

如何通过 C# ASP.net 从 SQL Server 中的文本框中存储日期

使用asp.net插入数据时如何避免数据库中的不同记录?

通过asp.net中的代码向网页添加按钮并删除动态数据库条目

CSV 通过 ASP.NET 到 MySQL