对不起,我今天不能开MSN,所以就不能发给你了,我只能在CSDN上开一张贴,发给你。控件我修正了一点,代码也给你简化了一些,一般做控件你的代码可以了,不过如果你还要加子控件的话,你可以在CREATECHILDCONTROL中加入你要的控件。
在RENDER中要加一个ME。ENSURECHILDCONTROL(),这句话是判断是不是创件了子控件,如果没有的话,它会到CREATECHILDCONTROL这个SUB中执行记住有的控件还要加BUILDER和DESIGN
其他的要你自己摸索,不过你可以看看我的BLOG上的那些控件,那写比较的经典。
定时刷新页面控件(hackate),修正后的代码:
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Collections
Imports System.Text
Imports System.ComponentModel
Imports Microsoft.VisualBasic<DefaultProperty("Text"), DefaultEvent("Timer"), ToolboxData("<{0}:setTimeoutControl runat=server></{0}:setTimeoutControl>")> Public Class setTimeoutControl
    Inherits System.Web.UI.WebControls.WebControl
    Implements IPostBackEventHandler
    Private Shared EventTimer As Object = New Object
    Public Event Timer As EventHandler#Region "Property"
    Public Overrides Property Visible() As Boolean
        Get
            Return MyBase.Visible
        End Get
        Set(ByVal Value As Boolean)
            MyBase.Visible = Value
        End Set
    End Property    Public Overrides Property Width() As System.Web.UI.WebControls.Unit
        Get
            Return MyBase.Width
        End Get
        Set(ByVal Value As System.Web.UI.WebControls.Unit)
            MyBase.Width = Value
        End Set
    End Property    Public Overrides Property Height() As System.Web.UI.WebControls.Unit
        Get
            Return MyBase.Height
        End Get
        Set(ByVal Value As System.Web.UI.WebControls.Unit)
            MyBase.Height = Value
        End Set
    End Property    <DefaultValue(3000), Bindable(False), Description("duration millisecound")> Public Property Interval() As Integer
        Get
            Return viewstate("_interval")
        End Get
        Set(ByVal Value As Integer)
            viewstate("_interval") = Value
        End Set
    End Property    <DefaultValue(False), Bindable(False), Description("Enabled Timer")> Public Overrides Property Enabled() As Boolean
        Get
            Return MyBase.Enabled
        End Get
        Set(ByVal Value As Boolean)
            MyBase.Enabled = Value
        End Set
    End Property
#End Region    Protected Overridable Sub OnTimer(ByVal e As EventArgs)
        RaiseEvent Timer(Me, e)
    End Sub    Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
        If eventArgument = "OnTimer" Then
            OnTimer(EventArgs.Empty)
        End If
    End Sub    Private Function bulidJavaScript() As String
        Dim sb As StringBuilder = New StringBuilder
        sb.Append(Chr(10) & "<script language='javascript'>")
        sb.Append(Chr(10) & " setTimeout(""" & Me.Page.GetPostBackEventReference(Me, "OnTimer") & """," & viewstate("_interval").ToString & ");")
        sb.Append(Chr(10) & "</script>")
        Return sb.ToString
    End Function    Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
        Me.EnsureChildControls()
        If MyBase.Enabled = True Then
            output.Write(bulidJavaScript)
            MyBase.Render(output)
        End If
    End Sub    Public Sub New()
        MyBase.Height = System.Web.UI.WebControls.Unit.Pixel(10)
        MyBase.Width = System.Web.UI.WebControls.Unit.Pixel(120)
        Me.Interval = 3000
    End Sub
End Class

解决方案 »

  1.   

    感谢ricy大哥。哈哈。是这个问题啊!谢谢哦。继续学习ING!
      

  2.   

    继承control这个基类是没有UI支持的,是不是这个原因导致的呢?
    那么用webcontrol是可以达到效果。然后用了webcontrol基类后应该还可以重写onprerender方法。这里为何要用viewstate取代呢?
      

  3.   

    viewstate取代
    我之所以用VIEWSTATE,就是为了你在页面中调用的时候数据不丢失,以前我做的时候也是用变量,不过发现在页面中调用的时候,尤其是在后台代码中改变他的属性时候:例如:setTimeoutControl .Interval=1200你虽然改变了,但是页面一提交,你就会发现你改动的值不见了,还是你在设计阶段设置属性设置的值还有如果你将来用到复合控件的话,记得要对CONTROLS这个属性要重载,不然你也会发现很多的问题,比如数据丢失等等
      

  4.   

    在问一下,这里的
       Public Sub New()
            MyBase.Height = System.Web.UI.WebControls.Unit.Pixel(10)
            MyBase.Width = System.Web.UI.WebControls.Unit.Pixel(120)
            Me.Interval = 3000
        End Sub
    构造函数的执行顺序呢,这个我不知道他的执行顺序是怎么样的,我是说他在控件生命周期里,没见到它的影子,他在这里具体扮演的是什么一个角色呢?
    一般这里new里面的代码都写在页面上面。。能解释下吗?rick大哥,我比较笨
      

  5.   

    一般控件分设计阶段和运行阶段
    在设计阶段包括:你从工具栏中拖控件到页面上,这个时候,它会进NEW这个SUB,把控件的属性等等初始化一下,
    运行的时候它也回进这个SUB我知道一个类都必须实例化
    DIM S AS 类S=NEW 类
    对不对啊??
    而我写的NEW在很大程度上就是为了设计阶段初始化控件
      

  6.   

    那这之间我要是修改了控件的属性,譬如说是在右边的属性器里面修改了控件的某个属性,会不会在你说的运行的时候,这个new构造函数执行了,把其又覆盖过去呢?我是担心这一点?
      

  7.   

    不会的,NEW后还会执行其他的代码,根据HTML代码它还会读实际的值的,所以你不要担心,它会把属性的值读出来的抛到前台的,
      

  8.   

    恩,明白了!
    rick大哥,如果说要给控件样式,比如说控件拉到设计视图后看到的效果那些要如何修改,修改成自己图形的控件或者说如何给我们的控件啊,设置图标啊。这些的,好像在SDK里没找到。。不知道哪有参考教程等,谢谢
      

  9.   

    恩,谢谢RICK大哥,恩,我会一直努力进步。。让你浪费了20分真抱歉。。这分应该是我给才对。。再次感谢,我以后如果有碰到什么问题,我会短信请教,谢谢