0

我从一个早已离去的人那里继承了一些疯狂的代码。他实现了一个自定义控件来实现大量松散相关的查询。

该控件有一堆不同的面板,都设置为 Visible='false' 以反映不同的过滤器输入集。然后有一个用于结果的 GridView。GridView 具有<asp:TemplateFields Visible='false'>从他想要运行的所有不同查询返回的所有可能列的超集。

控件的代码隐藏在初始化时运行,为过滤器面板和当前想要的特定查询的列翻转 Visible='true'。

更疯狂的是,我只是注意到<asp:TemplateField Visible="false">没有阻止 <ItemTemplate> 内部的构建,所以他的控制正在做各种永远不会被看到的额外工作。

举一个例子:

 <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 />

CreateFormLink()即使 Visible 为假,代码隐藏方法也会被调用...

它之前没有爆炸的唯一原因是该方法使用 StringBuilder 将 href 拼凑在一起,并且StringBuilder.Append(Eval("foo"))不会爆炸。

我尝试用串联替换 StringBuilder 的使用,以提高内存效率,并在列不在当前结果集中时获得了繁荣。

由于Visible='false'没有停止工作的完成(即使它停止了显示),有没有更规范的方法来做到这一点?还是我应该重新开始?

4

1 回答 1

0

You might want to implement show/hide logic in ItemDataBound event.

If you do so, you have full control over calling of CreateFormLink()

于 2012-09-12T00:18:26.277 回答