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

ASP.net GridView 的小问题

ASP.NET:Internet Explorer 和 Firefox 之间的 Gridview 图像问题

如何以编程方式在 ASP.NET 4.0 GridView 上启用分页和排序?