ASPX网页中如何根据dataField值隐藏GridView内的ImageButton
问题原因
你无法在GridView的<Columns>节点内直接使用<%# if(...) %>服务端代码块动态生成TemplateField列。GridView的列集合要求是静态声明的服务端控件,这种内联if写法会打断服务端控件的解析流程,直接触发编译错误,无法正常运行。
可行实现方案
以下两种方案都可以实现按行条件控制ImageButton显示/隐藏的需求:
方案1:固定声明列,通过RowDataBound事件控制按钮显隐(稳定性更高,推荐)
首先移除包裹TemplateField的if判断块,将操作列固定声明在Columns集合中,同时为GridView绑定RowDataBound行绑定事件,在事件中根据每行的字段值动态控制按钮是否可见。
前端页面代码修改如下:
<asp:GridView ID="GridView1" runat="server" Width="100%" CssClass="grid" AutoGenerateColumns="False" EnableModelValidation="True" DataKeyNames="T_ID" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging" OnRowCommand="GridView1_RowCommand" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" OnRowDataBound="GridView1_RowDataBound"> <Columns> <asp:BoundField DataField="TEMPL_TITLE" HeaderText="Title"> <HeaderStyle Width="200px" /> </asp:BoundField> <asp:BoundField DataField="TEMPL_DESC" HeaderText="Description"> <HeaderStyle Width="200px" /> </asp:BoundField> <asp:BoundField HeaderText="Category" DataField="CAT_NAME" /> <asp:BoundField HeaderText="Workflow Type" DataField="WFTYPE_DESCRIPTION" /> <asp:BoundField HeaderText="Owner" DataField="EMP_CALLING_NAME" /> <asp:TemplateField> <ItemTemplate> <asp:ImageButton ID="ViewImageButton1" runat="server" CommandArgument='<%# Eval("TEMPL_ID") %>' ImageUrl="Images/jdAttView.gif" OnCommand="btnViewTemplate_Click" ToolTip="View and download template" /> </ItemTemplate> </asp:TemplateField> </Columns> <EmptyDataTemplate> No templates have been assigned to you security capabilites, Please contact your local administrator for more information. </EmptyDataTemplate> <HeaderStyle HorizontalAlign="Left" /> </asp:GridView>
后端.cs文件中添加行绑定事件的处理逻辑:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { // 仅处理数据行,跳过表头、表尾、分页行等非数据行 if (e.Row.RowType == DataControlRowType.DataRow) { // 获取当前行绑定的数据源 DataRowView currentRow = (DataRowView)e.Row.DataItem; // 查找行内的ImageButton控件 ImageButton viewBtn = (ImageButton)e.Row.FindControl("ViewImageButton1"); // 根据EXP_PENDING_APPR字段值控制按钮显隐 viewBtn.Visible = currentRow["EXP_PENDING_APPR"].ToString() == "0"; } }
方案2:前端直接绑定Visible属性(无需写后端逻辑,写法更简洁)
不需要额外加后端事件,直接给ImageButton的Visible属性写内联绑定表达式,直接返回判断的布尔结果即可:
<asp:TemplateField> <ItemTemplate> <asp:ImageButton ID="ViewImageButton1" runat="server" CommandArgument='<%# Eval("TEMPL_ID") %>' ImageUrl="Images/jdAttView.gif" OnCommand="btnViewTemplate_Click" ToolTip="View and download template" Visible='<%# Eval("EXP_PENDING_APPR").ToString() == "0" %>' /> </ItemTemplate> </asp:TemplateField>
注意:以上两种方案中,操作列会始终存在于GridView中,仅不满足条件的行隐藏按钮。如果需要实现「所有行都不满足条件时整列完全不渲染」的效果,可以在GridView完成数据绑定后,遍历所有数据行判断
EXP_PENDING_APPR字段的值,再手动设置对应TemplateField的Visible属性为false即可。
内容的提问来源于stack exchange,提问作者hotflix
相关产品推荐
相关产品推荐

