none
怎样保存用户控件(复合控件)中定义的属性 RRS feed

  • 问题

  • 我想在用户控件中写保存状态逻辑,而不是引用页中用视图状态和session之类的东西,以下代码count属性的值不能累加。     之所以这么做因为这更复合OO编程的标准。

    用户控件代码==================================

    Partial Class WebUserControl
        Inherits System.Web.UI.UserControl

        Private intCount As Integer

        Public Property count() As Integer
            Get
                Return intCount
            End Get
            Set(ByVal value As Integer)
                intCount = value
            End Set
        End Property

        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            intCount += 1
        End Sub
    End Class

     

    引用页代码===================================================

    Partial Class _Default
        Inherits System.Web.UI.Page

       Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete
            Label1.Text = WebUserControl1.count
        End Sub
    End Class

    2010年5月10日 14:40

答案

  • 终于搞定了。 在用户控件中用视图状态也是可以的,呵呵。

    Partial Class WebUserControl
        Inherits System.Web.UI.UserControl


        Public Property count() As String
            Get
                Return CInt(ViewState("test"))
            End Get
            Set(ByVal value As String)
                ViewState("test") = value
            End Set
        End Property

        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim a As String = CInt(ViewState("test"))
            a += 1
            ViewState("test") = a
        End Sub
    End Class

    2010年5月11日 12:33
  •  

    问题彻底解决,我用重写了用户控件的 SaveControlState和LoadControlState,这种情况是是完美的,呵呵。


        Private intCount As Integer

        Public Property count() As Integer
            Get
                Return intCount
            End Get
            Set(ByVal value As Integer)
                intCount = value
            End Set
        End Property

        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            intCount += 1
        End Sub


        Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
            Page.RegisterRequiresControlState(Me)
            MyBase.OnInit(e)
        End Sub

        Protected Overrides Function SaveControlState() As Object
            Return CType(intCount, Object)
        End Function

        Protected Overrides Sub LoadControlState(ByVal savedState As Object)
            intCount = CInt(savedState)
        End Sub

    2010年5月11日 13:12

全部回复

  • 你好,你的问题不是因为没有赋值,而是永远都等于1。也就是 1 = 0 + 1;这主要是intCount每Click一次,与你上一次Click不是同一个,而是新的。如果想看到效果,可以 Private Static intCount As Integer(不知道有没有写对,VB语法不是很熟)


    邹俊才
    2010年5月10日 16:16
    版主
  • 那这样话,垃圾回收怎么办啊,那它不是永远都停留在内存里的,有没有可能,在用户控件中保存视图状态啊。就象自定义服务器控件时使用的方法 。

    2010年5月11日 0:54
  • 试了没用啊。
    2010年5月11日 12:12
  • 最后我用了个HiddenField控件来保存变量值,成功是成功了,但感觉特别扭。
    2010年5月11日 12:21
  • 终于搞定了。 在用户控件中用视图状态也是可以的,呵呵。

    Partial Class WebUserControl
        Inherits System.Web.UI.UserControl


        Public Property count() As String
            Get
                Return CInt(ViewState("test"))
            End Get
            Set(ByVal value As String)
                ViewState("test") = value
            End Set
        End Property

        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim a As String = CInt(ViewState("test"))
            a += 1
            ViewState("test") = a
        End Sub
    End Class

    2010年5月11日 12:33
  •  

    问题彻底解决,我用重写了用户控件的 SaveControlState和LoadControlState,这种情况是是完美的,呵呵。


        Private intCount As Integer

        Public Property count() As Integer
            Get
                Return intCount
            End Get
            Set(ByVal value As Integer)
                intCount = value
            End Set
        End Property

        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            intCount += 1
        End Sub


        Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
            Page.RegisterRequiresControlState(Me)
            MyBase.OnInit(e)
        End Sub

        Protected Overrides Function SaveControlState() As Object
            Return CType(intCount, Object)
        End Function

        Protected Overrides Sub LoadControlState(ByVal savedState As Object)
            intCount = CInt(savedState)
        End Sub

    2010年5月11日 13:12