摘要 GridView 控件常有需要汇出 Excel 的需求,一般都是将 GridView 使用 RenderControl 来输出其 HTML 程序代码。本文即在讨论 RenderControl 所产生的问题及解决方式,不过本文是透过 BasePage 的方式,让 RenderControl 的相关处理动作更简化。 手动解决 RenderControl 所产生的问题 下面的 ControlToHTML 函式,主要是将控件转换为对应的 HTML 程序代码。
你可以整个 GridView 控件传入 ControlToHTML 来取得它的 HTML 程序代码,不过当执行此方法时,会遇到由 Page.VerifyRenderingInServerForm 方法释出的错误讯息。 当执行下面的程序代码时 Dim sHTML As String = ControlToHTML(GridView1) 会产生错误讯息 型别 'GridView' 的控件 'GridView1' 必须置于有 runat=server 的窗体标记之中。 要解决这个问题就是让 Page 不要执行 VerifyRenderingInServerForm 方法,所以 Page 要覆写 VerifyRenderingInServerForm 方法,而不做任何事。
接下来继续执行程序,若 GridView 有 CommandFIeld 或分页时,它会去做事件验证的动作,而会引发另一个错误讯息 RegisterForEventValidation 只能在 Render(); 期间呼叫 要解决这个问题,可以切换到 aspx 程序代码中,在 <%@ Page %> 中加入 EnableEventValidation="false" 即可。 <%@ Page Language="VB" AutoEventWireup="false" EnableEventValidation="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> 使用 BasePage 解决 RenderControl 所产生的问题 虽然上述的方式可以解决 RenderControl 产生的问题,可是似乎有点太麻烦,有没有更简单的方式呢?我们用 BasePage 来处理这个问题,不用当有这类需求时还要去手动故这些设定。 TBBasePage 继承 Page,新增一个 IsVerifyRender 属性(预设为 True),来决定是否执行 MyBase.VerifyRenderingInServerForm 方法。首先覆写 VerifyRenderingInServerForm 方法,当 IsVerifyRender="False" 时,不会去执行 MyBase.VerifyRenderingInServerForm 方法;另外覆写 EnableEventValidation 方法,当 IsVerifyRender="False" 则传回 False。当我们要用 RenderControl 来输出控件的 HTML 码时,只需先设定 IsVerifyRender = "False" 即可。
Powered by: 博客园 Copyright © jeff377