控件修正,样式输不出,主要由于Render中MyBase.Render(output)你没写。(hackate确认)
对不起,我今天不能开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
问题点数:20、回复次数:11Top
1 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-07-04 09:53:24 得分 0
感谢ricy大哥。哈哈。是这个问题啊!
谢谢哦。继续学习ING。。。!Top
2 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-07-04 10:26:37 得分 20
继承control这个基类是没有UI支持的,是不是这个原因导致的呢?
那么用webcontrol是可以达到效果。然后用了webcontrol基类后应该还可以重写onprerender方法。
这里为何要用viewstate取代呢?Top
3 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-07-04 10:40:36 得分 0
viewstate取代
我之所以用VIEWSTATE,就是为了你在页面中调用的时候数据不丢失,以前我做的时候也是用变量,不过发现在页面中调用的时候,尤其是在后台代码中改变他的属性时候:例如:setTimeoutControl .Interval=1200
你虽然改变了,但是页面一提交,你就会发现你改动的值不见了,还是你在设计阶段设置属性设置的值
还有如果你将来用到复合控件的话,记得要对CONTROLS这个属性要重载,不然你也会发现很多的问题,比如数据丢失等等Top
4 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-07-04 11:00:18 得分 0
在问一下,这里的
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大哥,我比较笨Top
5 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-07-04 11:14:01 得分 0
一般控件分设计阶段和运行阶段
在设计阶段包括:你从工具栏中拖控件到页面上,这个时候,它会进NEW这个SUB,把控件的属性等等初始化一下,
运行的时候它也回进这个SUB
我知道一个类都必须实例化
DIM S AS 类
S=NEW 类
对不对啊??
而我写的NEW在很大程度上就是为了设计阶段初始化控件Top
6 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-07-04 11:25:27 得分 0
那这之间我要是修改了控件的属性,譬如说是在右边的属性器里面修改了控件的某个属性,会不会在你说的运行的时候,这个new构造函数执行了,把其又覆盖过去呢?我是担心这一点?Top
7 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-07-04 12:07:50 得分 0
不会的,NEW后还会执行其他的代码,根据HTML代码它还会读实际的值的,所以你不要担心,它会把属性的值读出来的抛到前台的,
Top
8 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-07-04 12:41:08 得分 0
恩,明白了!
rick大哥,如果说要给控件样式,比如说控件拉到设计视图后看到的效果那些要如何修改,修改成自己图形的控件或者说如何给我们的控件啊,设置图标啊。这些的,好像在SDK里没找到。。不知道哪有参考教程等,谢谢Top
9 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-07-04 14:19:03 得分 0
首先你要要放一个图片资源:
工程中设置你要的图片就可以了Top
10 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-07-04 14:33:52 得分 0
恩,谢谢RICK大哥,恩,我会一直努力进步。。
让你浪费了20分。。。真抱歉。。这分应该是我给才对。。
再次感谢,我以后如果有碰到什么问题,我会短信请教,谢谢Top
11 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-07-04 14:46:47 得分 0
分就不用了,以前还想要分的,现在不想了,呵呵
不过做控件大家讨论讨论!,共同进步!Top




