ASP.Net GridView 和 TemplateField 可见性 - false 但 ItemTemplate 仍在执行
Posted
技术标签:
【中文标题】ASP.Net GridView 和 TemplateField 可见性 - false 但 ItemTemplate 仍在执行【英文标题】:ASP.Net GridView and TemplateField visibility - false but ItemTemplate still executing 【发布时间】:2012-09-04 20:52:33 【问题描述】:我从一个早已离去的人那里继承了一些疯狂的代码。他实现了一个自定义控件来实现大量松散相关的查询。
该控件有一堆不同的面板,都设置为 Visible='false' 以反映不同的过滤器输入集。然后有一个用于结果的 GridView。 GridView 有 <asp:TemplateFields Visible='false'>
表示从他想要运行的所有不同查询返回的所有可能列的超集。
控件的代码隐藏在初始化时运行,为过滤器面板和当前想要的特定查询的列翻转 Visible='true'。
更疯狂的是,我只是注意到拥有<asp:TemplateField Visible="false">
并不会阻止构建内部的
举个例子:
<asp:TemplateField HeaderText="Expiration Date" SortExpression="ExpirationDate" Visible="false"><br />
<itemtemplate><br />
<asp:HyperLink runat="server" ID="FormLink" Target="_blank" NavigateURL="<%# CreateFormLink() %>" Text='<%# DateUtil.getFormattedDate(Eval("ExpireDate")) %>' ><br />
</asp:HyperLink><br />
</itemtemplate><br />
</asp:TemplateField><br />
即使 Visible 为假,代码隐藏方法 CreateFormLink()
也会被调用...
它之前没有崩溃的唯一原因是该方法使用 StringBuilder 来拼凑 href,而 StringBuilder.Append(Eval("foo"))
没有崩溃。
我尝试用串联替换 StringBuilder 的使用,以提高内存效率,并在列不在当前结果集中时获得了繁荣。
由于Visible='false'
没有阻止工作的完成(即使它停止了显示),有没有更规范的方法来做到这一点?还是我应该重新开始?
【问题讨论】:
您几乎在这里写了一本书,这让您很难理解您的确切问题。你需要具体 【参考方案1】:您可能希望在ItemDataBound 事件中实现显示/隐藏逻辑。
如果您这样做,您可以完全控制调用CreateFormLink()
【讨论】:
感谢您的建议...我实现了一个变体;在摆弄 Visible 的 GridView OnInit() 函数中,我在最后添加了一些内容以继续从 GridView.Columns 集合中删除 Visible=false 的列。以上是关于ASP.Net GridView 和 TemplateField 可见性 - false 但 ItemTemplate 仍在执行的主要内容,如果未能解决你的问题,请参考以下文章
asp.net中GridView怎样进行分页,编辑,删除操作
Twitter Bootstrap 和 ASP.NET GridView
ASP.net .FindControl() 和 GridView 返回 null