ASPX+VB.NET中GridView隐藏列:RowDataBound事件未触发
解决方案
1. 解决ID和LinkAUX列自动显示的问题
GridView默认AutoGenerateColumns="True",会自动生成数据源(DataTable)中所有字段对应的列。要只显示指定列,需做两处修改:
步骤1:关闭自动生成列
在GridView标签中添加AutoGenerateColumns="False":
<asp:GridView ID="gridViewArtifacts" runat="server" AutoGenerateColumns="False" <%-- 新增这一行 --%> CssClass="grid-margin" Style="margin-top: 4px; text-align: Justify; max-height: 200px;" Width="100%" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3" OnRowDataBound="gridViewArtifacts_RowDataBound" OnRowCreated="gridViewArtifacts_RowCreated" OnRowCommand="gridViewArtifacts_RowCommand">
步骤2:手动添加需要显示的列
在<Columns>节点中,补充Title、Category、Status的绑定列:
<Columns> <%-- 原有的复选框列 --%> <asp:TemplateField> <HeaderTemplate> <asp:CheckBox ID="chkAll" runat="server" onclick="checkAll(this);" /> </HeaderTemplate> <ItemTemplate> <asp:CheckBox ID="chkSelect" runat="server" OnCheckedChanged="gridViewArtifacts_CheckedChanged" AutoPostBack="true" /> </ItemTemplate> </asp:TemplateField> <%-- 原有的Identifier列 --%> <asp:TemplateField HeaderText="Identifier"> <ItemTemplate> <asp:HyperLink ID="hyperLinkID" runat="server" NavigateUrl='<%# Eval("LinkAUX") %>' <%-- 修正大小写匹配DataTable列名 --%> Text='<%# Eval("ID") %>' Target="_blank" /> </ItemTemplate> </asp:TemplateField> <%-- 新增以下三个绑定列 --%> <asp:BoundField DataField="Title" HeaderText="Title" /> <asp:BoundField DataField="Category" HeaderText="Category" /> <asp:BoundField DataField="Status" HeaderText="Status" /> </Columns>
2. 解决RowDataBound事件未触发的问题
步骤1:确保数据绑定只在首次加载时执行
在Page_Load事件中添加IsPostBack判断,避免回发时重复绑定导致事件异常:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load If Not IsPostBack Then ' 原有的DataTable创建和绑定代码 Dim artifactTable As New DataTable() artifactTable.Columns.Add("Title") artifactTable.Columns.Add("Category") artifactTable.Columns.Add("Status") artifactTable.Columns.Add("ID") artifactTable.Columns.Add("LinkAUX") artifactTable.Rows.Add(title, Category, hwStatusFinal, artifactId, artifactLink) gridViewArtifacts.DataSource = artifactTable gridViewArtifacts.DataBind() End If End Sub
步骤2:修正RowDataBound事件中的字段名错误
原代码中使用了不存在的LinkURL字段,需改为DataTable中的LinkAUX,同时优化代码逻辑:
Protected Sub gridViewArtifacts_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles gridViewArtifacts.RowDataBound If e.Row.RowType = DataControlRowType.DataRow Then ' 处理复选框点击事件 Dim chk As CheckBox = CType(e.Row.FindControl("chkSelect"), CheckBox) chk?.Attributes.Add("onclick", "checkBoxClicked()") ' 处理超链接 Dim hyperLinkID As HyperLink = CType(e.Row.FindControl("hyperLinkID"), HyperLink) If hyperLinkID IsNot Nothing Then hyperLinkID.NavigateUrl = DataBinder.Eval(e.Row.DataItem, "LinkAUX").ToString() hyperLinkID.Text = DataBinder.Eval(e.Row.DataItem, "ID").ToString() End If End If gridViewArtifacts.EnablePersistedSelection = True End Sub
额外说明
- 字段名大小写需严格匹配:DataTable中的列名是
LinkAUX,所以Eval时要保持一致,避免找不到字段导致的错误。 - 若RowDataBound仍未触发,可检查GridView的
OnRowDataBound属性是否与后台方法名完全一致,确保没有拼写错误。
内容的提问来源于stack exchange,提问作者Rui Soares
相关产品推荐
相关产品推荐

