摘要
GridView 控件常有需要汇出 Excel 的需求,一般都是将 GridView 使用 RenderControl 来输出其 HTML 程序代码。本文即在讨论 RenderControl 所产生的问题及解决方式,不过本文是透过 BasePage 的方式,让 RenderControl 的相关处理动作更简化。

手动解决 RenderControl 所产生的问题
下面的 ControlToHTML 函式,主要是将控件转换为对应的 HTML 程序代码。

 1    /**/''' <summary>
 2    ''' 将控件转换为对应的 HTML 程序代码。
 3    ''' </summary>
 4    ''' <param name="Control">控件。</param>
 5    Public Shared Function ControlToHTML()Function ControlToHTML(ByVal Control As System.Web.UI.Control) As String
 6        Dim sHTML As String = String.Empty
 7        Dim oTextWriter As New System.IO.StringWriter()
 8        Dim oHTMLWriter As New System.Web.UI.HtmlTextWriter(oTextWriter)
 9
10        Control.RenderControl(oHTMLWriter)
11        sHTML = oTextWriter.ToString()
12        Return sHTML
13    End Function

你可以整个 GridView 控件传入 ControlToHTML 来取得它的 HTML 程序代码,不过当执行此方法时,会遇到由 Page.VerifyRenderingInServerForm 方法释出的错误讯息。
当执行下面的程序代码时

Dim sHTML As String = ControlToHTML(GridView1)

会产生错误讯息

型别 'GridView' 的控件 'GridView1' 必须置于有 runat=server 的窗体标记之中。

要解决这个问题就是让 Page 不要执行 VerifyRenderingInServerForm 方法,所以 Page 要覆写 VerifyRenderingInServerForm 方法,而不做任何事。

1Public Overrides Sub VerifyRenderingInServerForm()Sub VerifyRenderingInServerForm(ByVal Control As System.Web.UI.Control)
2     '覆写,不执行 MyBase.VerifyRenderingInServerForm 方法,解决执行 RenderControl 产生的错误
3End Sub

接下来继续执行程序,若 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" 即可。

 1/**/''' <summary>
 2''' 页面基础类别。
 3''' </summary>
 4Public Class TBBasePageClass TBBasePage
 5    Inherits System.Web.UI.Page
 6
 7    Private FIsVerifyRender As Boolean = True
 8
 9    /**/''' <summary>
10    ''' 是否执行 VerifyRenderingInServerForm 方法。
11    ''' </summary>
12    Public Property IsVerifyRender()Property IsVerifyRender() As Boolean
13        Get
14            Return FIsVerifyRender
15        End Get
16        Set(ByVal value As Boolean)
17            FIsVerifyRender = value
18        End Set
19    End Property
20
21    /**/''' <summary>
22    ''' 覆写。
23    ''' </summary>
24    ''' <param name="Control"></param>
25    ''' <remarks></remarks>
26    Public Overrides Sub VerifyRenderingInServerForm()Sub VerifyRenderingInServerForm(ByVal Control As System.Web.UI.Control)
27        If Me.IsVerifyRender Then
28            MyBase.VerifyRenderingInServerForm(Control)
29        End If
30    End Sub
31
32    /**/''' <summary>
33    ''' 覆写。启用事件验证动作。
34    ''' </summary>
35    Public Overrides Property EnableEventValidation()Property EnableEventValidation() As Boolean
36        Get
37            If Me.IsVerifyRender Then
38                Return MyBase.EnableEventValidation
39            Else
40                Return False
41            End If
42        End Get
43        Set(ByVal value As Boolean)
44            MyBase.EnableEventValidation = value
45        End Set
46    End Property
47
48End Class

有了 TBBasePage 的 IsVerifyRender 属性后,我们就可以将上述的 ControlToHTML 函式,改写如下。当 GridView 控件置放在 TBBasePage 时,执行 ControlToHTML 函式时,不需另行设定即能正常执行。

 1    /**/''' <summary>
 2    ''' 将控件转换为对应的 HTML 程序代码。
 3    ''' </summary>
 4    ''' <param name="Control">控件。</param>
 5    Public Shared Function ControlToHTML()Function ControlToHTML(ByVal Control As System.Web.UI.Control) As String
 6        Dim sHTML As String = String.Empty
 7        Dim oTextWriter As New System.IO.StringWriter()
 8        Dim oHTMLWriter As New System.Web.UI.HtmlTextWriter(oTextWriter)
 9
10        If Control.Page IsNot Nothing Then
11            If TypeOf Control.Page Is TBBasePage Then
12                DirectCast(Control.Page, TBActionPage).IsVerifyRender = False
13            End If
14        End If
15
16        Control.RenderControl(oHTMLWriter)
17        sHTML = oTextWriter.ToString()
18        Return sHTML
19    End Function

使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误相关推荐

  1. python-如何解决python执行pip install 命令的时候出现 File“<stdin>“,line 1 pip install XXX的问题

    python-如何解决python执行pip install 命令的时候出现 File"",line 1 pip install XXX的问题 参考文章: (1)python-如何 ...

  2. python运行非常慢的解决-python执行太慢

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 假如 load 完成还没计算,这时候线程切换了,其他线程修改了 a 的值,然后切换 ...

  3. PHP无法执行MySQL语句,解决PHP执行批量MySQL语句的问题

    这篇文章主要为大家详细介绍了解决PHP执行批量MySQL语句的问题,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! 当有多条mysql语句连起来需要执行 ...

  4. 如何解决testng执行用例失败自动重跑问题

    如何解决testng执行用例失败自动重跑问题 参考文章: (1)如何解决testng执行用例失败自动重跑问题 (2)https://www.cnblogs.com/cheese320/p/847864 ...

  5. 解决Hibernate4执行update操作,不更新数据的问题

    解决Hibernate4执行update操作,不更新数据的问题 参考文章: (1)解决Hibernate4执行update操作,不更新数据的问题 (2)https://www.cnblogs.com/ ...

  6. python虚拟环境解决不能执行脚本的问题

    python虚拟环境解决不能执行脚本的问题 参考文章: (1)python虚拟环境解决不能执行脚本的问题 (2)https://www.cnblogs.com/tnyleyon/p/11222926. ...

  7. MacOS~jenkins里解决docker执行权限问题

    MacOS~jenkins里解决docker执行权限问题 参考文章: (1)MacOS~jenkins里解决docker执行权限问题 (2)https://www.cnblogs.com/lori/p ...

  8. 解决Ubuntu执行sudo命令后提示无法解析主机

    解决Ubuntu执行sudo命令后提示无法解析主机 异常现象 异常原因 查看修改主机名 普通用户与管理员间的切换 异常现象 异常原因 /etc/hostname和/etc/hosts文件中主机名称不一 ...

  9. android gridview 不显示,android解决gridview只显示一半

    gridview在ScrollView中使用 android:layout_height="wrap_content" 发现并没有显示全部,而只是显示了一半.为了解决这个问题,打算 ...

最新文章

  1. 交换机知识--集群管理
  2. oracle服务器内存建议,Oracle内存分配建议
  3. [转]面试官,不要再问我三次握手和四次挥手
  4. 用置换破坏您的JUnit5测试
  5. 现代软件工程系列 学生精彩文章(7) 宝贵的教训
  6. Quest Recovery Manager for Active Directory的使用(一)
  7. SpringBoot-EnvironmentPostProcessor
  8. Python数据结构与算法(3.5)——双端队列
  9. python网页教程_python 查询 网页Python基础教程01 Hello World!
  10. Apache服务器+Tomcat服务器配置
  11. 用按键精灵2014怎么开发后台自动喊话的游戏脚本
  12. 五款免费pdf转换成word转换器软件下载
  13. Python爬虫爬取淘宝天猫,处理url正确的解码方法
  14. kpi绩效考核流程图_XX公司KPI绩效考核案例.doc
  15. Android破解游戏内购心得
  16. 您能不能也宽容一点??
  17. Android Interpolator属性 设置动画速度
  18. 基于JAVA江西婺源旅游文化推广系统计算机毕业设计源码+数据库+lw文档+系统+部署
  19. android多媒体(十五)
  20. 一个二维码通吃 android , ios 下载

热门文章

  1. F5 LC多链路负载,重庆移动DNS不能正常解析故障处理
  2. 16通道24位分辨率x8 PCIE 3U PXIE采集卡
  3. Easyswoole 令牌桶IP限流实现(企业实用)
  4. I.MX 启动方式 - DCD数据详解
  5. Solr-Solrj简单使用
  6. AXI总线代码详细整理(一)
  7. 韩信的死主要问题出在哪?
  8. OAuth2.0简介
  9. Hadoop生态系统:用于处理大数据的Hadoop工具
  10. 《Linux就那么学》虚拟机安装配置及系统和配置的全过程