使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误

(2) 2024-05-16 16:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误,希望能够帮助你!!!。

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

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

 1
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第1张
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第2张
    
/**/
''' <summary>
 2使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    ''' 将控件转换为对应的 HTML 程序代码。
 3使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    ''' </summary>
 4使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第5张    ''' <param name="Control">控件。</param>



 5
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第1张
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第2张
    
Public
 
Shared
 
Function ControlToHTML()
Function ControlToHTML(ByVal Control As System.Web.UI.Control) As String
 6使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Dim sHTML As String = String.Empty
 7使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Dim oTextWriter As New System.IO.StringWriter()
 8使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Dim oHTMLWriter As New System.Web.UI.HtmlTextWriter(oTextWriter)
 9使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张
10使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Control.RenderControl(oHTMLWriter)
11使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        sHTML = oTextWriter.ToString()
12使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Return sHTML
13使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第5张    End Function

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

Dim sHTML As String = ControlToHTML(GridView1)

会产生错误讯息

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

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

1
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第1张
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第2张
Public
 
Overrides
 
Sub VerifyRenderingInServerForm()
Sub VerifyRenderingInServerForm(ByVal Control As System.Web.UI.Control)
2使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张     '覆写,不执行 MyBase.VerifyRenderingInServerForm 方法,解决执行 RenderControl 产生的错误
3使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第5张End 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
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第1张
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第2张
/**/
''' <summary>
 2使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张''' 页面基础类别。
 3使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第5张''' </summary>



 4
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第1张
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第2张
Public
 
Class TBBasePage
Class TBBasePage
 5使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    Inherits System.Web.UI.Page
 6使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张
 7使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    Private FIsVerifyRender As Boolean = True
 8使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张
 9使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第30张使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第31张    /**/''' <summary>
10使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    ''' 是否执行 VerifyRenderingInServerForm 方法。
11使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第33张    ''' </summary>

12使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第30张使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第31张    Public Property IsVerifyRender()Property IsVerifyRender() As Boolean
13使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Get
14使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            Return FIsVerifyRender
15使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        End Get
16使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Set(ByVal value As Boolean)
17使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            FIsVerifyRender = value
18使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        End Set
19使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第33张    End Property

20使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张
21使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第30张使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第31张    /**/''' <summary>
22使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    ''' 覆写。
23使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    ''' </summary>
24使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    ''' <param name="Control"></param>
25使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第33张    ''' <remarks></remarks>

26使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第30张使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第31张    Public Overrides Sub VerifyRenderingInServerForm()Sub VerifyRenderingInServerForm(ByVal Control As System.Web.UI.Control)
27使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        If Me.IsVerifyRender Then
28使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            MyBase.VerifyRenderingInServerForm(Control)
29使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        End If
30使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第33张    End Sub

31使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张
32使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第30张使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第31张    /**/''' <summary>
33使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    ''' 覆写。启用事件验证动作。
34使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第33张    ''' </summary>

35使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第30张使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第31张    Public Overrides Property EnableEventValidation()Property EnableEventValidation() As Boolean
36使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Get
37使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            If Me.IsVerifyRender Then
38使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张                Return MyBase.EnableEventValidation
39使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            Else
40使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张                Return False
41使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            End If
42使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        End Get
43使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Set(ByVal value As Boolean)
44使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            MyBase.EnableEventValidation = value
45使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        End Set
46使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第33张    End Property

47使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张
48使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第5张End Class


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

 1
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第1张
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第2张
    
/**/
'''
 
<summary>


 2
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    
'''
 将控件转换为对应的 HTML 程序代码。

 3
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张    
'''
 
</summary>


 4
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第5张    
'''
 
<param name="Control">
控件。
</param>


 5
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第1张
使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第2张
    
Public
 
Shared
 
Function ControlToHTML()
Function ControlToHTML(ByVal Control As System.Web.UI.Control) As String
 6使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Dim sHTML As String = String.Empty
 7使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Dim oTextWriter As New System.IO.StringWriter()
 8使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Dim oHTMLWriter As New System.Web.UI.HtmlTextWriter(oTextWriter)
 9使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张
10使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        If Control.Page IsNot Nothing Then
11使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            If TypeOf Control.Page Is TBBasePage Then
12使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张                DirectCast(Control.Page, TBActionPage).IsVerifyRender = False
13使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张            End If
14使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        End If
15使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张
16使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Control.RenderControl(oHTMLWriter)
17使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        sHTML = oTextWriter.ToString()
18使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第3张        Return sHTML
19使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误_https://bianchenghao6.com/blog__第5张    End Function

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复