关于自定义控件问题!希望控件高手能进来相助,苯苯感激不尽!

hackate 2005-07-08 03:36:51
最近在学组件开发,买了本<深入剖析组件设计>的书,然后现在边学边做到NumberEditor这个控件这,卡住了。不知道怎么弄,老是不行啊。特郁闷,所以把代码,发过来,大家看看,谢谢,有三个页代码。麻烦耐心看下,谢谢啦!
以下为:HotTrackStyle.vb类代码

Imports System
Imports System.Text
Imports System.ComponentModel
Imports System.Drawing
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace hackate
Public Class HotTrackStyle
Implements IStateManager

Private _enabled As Boolean = False
Private _marked As Boolean = False

Private _color As Color = Color.Black
Private _backgroundcolor As color = color.White
Private _bordercolor As Color = Color.Black
Private _borderstyle As BorderStyle = BorderStyle.NotSet
Private _borderwidth As Unit = Unit.Pixel(1)

Private _nonFocusColor As Color
Private _nonFocusBackgroundColor As Color
Private _nonFocusBorderColor As Color
Private _nonFocusBorderStyle As BorderStyle
Private _nonFocusBorderWidth As Unit

Private Const HT_JS_GUID = "{E4D52305-E153-4e6b-8DBE-A17F2FC991F5}"
Private Const HT_JS_Script = "<script language='javascript' SRC='/aspnet_client/hackate.net/hottrack.js'></script>"
Private Const Script_Begin = "<script language='javascript'>"
Private Const Script_End = "</script>"
Private Const HT_JS_Content = "var {0}_obj = new HotTrackObject(document.all['{0}'],""{1}"",""{2}"",""{3}"",""{4}"",""{5}"");"

<DefaultValue(GetType(color), "Black"), NotifyParentProperty(True)> _
Public Property Color() As color
Get
Return _color
End Get
Set(ByVal Value As color)
_color = Value
End Set
End Property

<DefaultValue(GetType(color), "White"), NotifyParentProperty(True)> _
Public Property BackgroundColor() As color
Get
Return _backgroundcolor
End Get
Set(ByVal Value As color)
_backgroundcolor = Value
End Set
End Property

<DefaultValue(GetType(Color), "Black"), NotifyParentProperty(True)> _
Public Property BorderColor() As Color
Get
Return _bordercolor
End Get
Set(ByVal Value As Color)
_bordercolor = Value
End Set
End Property

<DefaultValue(System.Web.UI.WebControls.BorderStyle.NotSet), NotifyParentProperty(True)> _
Public Property BorderStyle() As BorderStyle
Get
Return _borderstyle
End Get
Set(ByVal Value As BorderStyle)
_borderstyle = Value
End Set
End Property

<DefaultValue(GetType(Unit), "1px"), NotifyParentProperty(True)> _
Public Property BorderWidth() As Unit
Get
Return _borderwidth
End Get
Set(ByVal Value As Unit)
_borderwidth = Value
End Set
End Property

<DefaultValue(False), NotifyParentProperty(True)> _
Public Property Enabled() As Boolean
Get
Return _enabled
End Get
Set(ByVal Value As Boolean)
_enabled = Value
End Set
End Property

Public Overridable Sub AddScriptRender(ByVal htpage As Page)
If Not htpage.IsClientScriptBlockRegistered(HT_JS_GUID) Then
htpage.RegisterClientScriptBlock(HT_JS_GUID, HT_JS_Script)
End If
End Sub

Public Overridable Sub AddAttributesToRender(ByVal writer As HtmlTextWriter, ByVal ClientID As String)
If _enabled Then
writer.AddAttribute("onmousemove", ClientID + "_obj.NotActive(true)")
writer.AddAttribute("onmouseout", ClientID + "_obj.NotActive(false)")

writer.AddAttribute("onfocus", ClientID + "_obj.Active(true)")
writer.AddAttribute("onblur", ClientID + "_obj.Active(false)")
End If
End Sub

Public Overridable Sub Render(ByVal writer As HtmlTextWriter, ByVal htcontrol As Control)
writer.WriteLine(Script_Begin)
writer.WriteLine(HT_JS_Content, htcontrol.ClientID, ColorTranslator.ToHtml(_color), ColorTranslator.ToHtml(_backgroundcolor), ColorTranslator.ToHtml(_bordercolor), _borderstyle.ToString, _borderwidth.ToString)
writer.WriteLine(Script_End)
End Sub

#Region "实现ViewState接口"
Public ReadOnly Property IsTrackingViewState() As Boolean Implements System.Web.UI.IStateManager.IsTrackingViewState
Get
Return _marked
End Get
End Property

Public Sub LoadViewState(ByVal state As Object) Implements System.Web.UI.IStateManager.LoadViewState
Dim o As Object() = CType(state, Object())
_enabled = CType(o(0), Boolean)
_color = CType(o(1), Color)
_backgroundcolor = CType(o(2), Color)
_bordercolor = CType(o(3), Color)
_borderstyle = CType(o(4), BorderStyle)
_borderwidth = CType(o(5), Unit)
_nonFocusColor = CType(o(6), Color)
_nonFocusBackgroundColor = CType(o(7), Color)
_nonFocusBorderColor = CType(o(8), Color)
_nonFocusBorderStyle = CType(o(9), BorderStyle)
_nonFocusBorderWidth = CType(o(10), Unit)
End Sub

Public Function SaveViewState() As Object Implements System.Web.UI.IStateManager.SaveViewState
Dim o(11) As Object
o(0) = _enabled
o(1) = _color
o(2) = _backgroundcolor
o(3) = _bordercolor
o(4) = _borderstyle
o(5) = _borderwidth
o(6) = _nonFocusColor
o(7) = _nonFocusBackgroundColor
o(8) = _nonFocusBorderColor
o(9) = _nonFocusBorderStyle
o(10) = _nonFocusBorderWidth
Return o
End Function

Public Sub TrackViewState() Implements System.Web.UI.IStateManager.TrackViewState
_marked = True
End Sub
#End Region

Public Sub New()

End Sub
End Class
End Namespace
...全文
319 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmfc 2005-07-08
  • 打赏
  • 举报
回复
呵呵,大家一起提高嘛,我也刚学控件设计,通过你的问题也把自己学的的东西巩固了不少。
hackate 2005-07-08
  • 打赏
  • 举报
回复
解决了,我就是把MyBase.SaveViewState写成MyBase.ViewState,马虎,就加上技术不行。哎。。汗了一下午。。

还有脚本上的错误,把Hot写成Not..

感谢tmfc和凡瑞。两位朋友的相助,感激,为了感谢。两人一人一半分数,希望别怪少了!
fanruinet 2005-07-08
  • 打赏
  • 举报
回复
在SaveViewState里没调用父类的SaveViewState,应该是
Protected Overrides Function SaveViewState() As Object
Dim obj1 As Object = MyBase.SaveViewState()
If HotTrackStyle.Enabled Then
Return New Pair(obj1, CType(HotTrackStyle, IStateManager).SaveViewState)
Else
Return New Pair(obj1, Nothing)
End If
End Function
tmfc 2005-07-08
  • 打赏
  • 举报
回复
Return New Pair(MyBase.SaveViewState, CType(HotTrackStyle, IStateManager).SaveViewState)
不知道对不对,CS的代码是这样的
return new Pair(base.SaveViewState(),((IStateManager)HotTrackStyle).SaveViewState());
hackate 2005-07-08
  • 打赏
  • 举报
回复
这样可以了,但是如果把HotTrackStyle.Enabled这个属性在设计器改成True还是那样的错误。我怀疑这里
If HotTrackStyle.Enabled Then
Return New Pair(MyBase.ViewState, CType(HotTrackStyle, IStateManager).SaveViewState)
Else
if 和else中间这段代码还需修改,对这个不太了解,不知道因该如何处理
tmfc 2005-07-08
  • 打赏
  • 举报
回复
Protected Overrides Function SaveViewState() As Object
If HotTrackStyle.Enabled Then
Return New Pair(MyBase.ViewState, CType(HotTrackStyle, IStateManager).SaveViewState)
Else
Return New Pair(MyBase.ViewState, Nothing)
End If
End Function

Else
Return New Pair(MyBase.ViewState, Nothing)
End If
改成
Else
Return MyBase.SaveViewState()
End If
应该就可以了
hackate 2005-07-08
  • 打赏
  • 举报
回复
我知道这样改才对,本来那个控件是一直不显示成文本框样子的,现在出来了,但是就又出了新的一个错误,没见过。郁闷啊。好痛苦,望指教!
hackate 2005-07-08
  • 打赏
  • 举报
回复
很感谢,我刚也查到这里了
Public Overridable ReadOnly Property HotTrackStyles() As HotTrackStyle
Get
If _hotTrackStyle Is Nothing Then
_hotTrackStyle = GreatHotTrackStyle()
End If
Return _hotTrackStyle
End Get
End Property
这样写才对,我错误写成把Return 放在if ... end if内了,
现在还有问题,就是这样子弄了后。原来报错换别的报错类型了。说
The type 'System.Web.UI.StateBag' must be marked as Serializable or have a TypeConverter other than ReferenceConverter to be put in viewstate.
提示这个错误了。搞不懂。这个应该如何解决
tmfc 2005-07-08
  • 打赏
  • 举报
回复
问题在于你的BaseEditor中的_hotTrackStyle为空,用Reflecort看了一下dll中的Property HotTrackStyle的get,很奇怪为什么会是这样的代码
Public Overridable Function get_HotTrackStyle() As HotTrackStyle
Dim style1 As HotTrackStyle
If (Me._hotTrackStyle Is Nothing) Then
Me._hotTrackStyle = Me.GreatHotTrackStyle
Return Me._hotTrackStyle
End If
Return style1
End Function
可以看到,第一次取这个属性的时候确实是返回了Me._hotTrackStyle,但是以后再取这个属性,就会把那个没有初始化的style1返回回来,不知道这个dll是不是你自己编译的,我家里电脑没有装vb.net的开发环境,vbc的命令行试了试失败,只好放弃。
建议修改:把GreatHotTrackStyle去掉,直接new HotTrackStyle,在所有使用_hotTrackStyle的地方预先判断是否为空。
hackate 2005-07-08
  • 打赏
  • 举报
回复
虫儿飞,虫儿飞,你在思念谁?对啊,我在思念谁啊!我在思念代码的解决方式啊。听着虫儿飞,此时感慨万千..........望多多帮助,各位,我就是那只虫儿,希望你们的帮助能让我飞得更高更远!
pphuyidao 2005-07-08
  • 打赏
  • 举报
回复



           c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#
  c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#
  c#c#c#c#c#c#c#c#c#       c#c#
      c#c#         c#c#c#
      c#c#         c#c#c#
      c#c#         c#c#
      c#c#    c#c#c#c#c#c#c#c#c#c#c#c#c#c#
      c#c#    c#c#c#c#c#c#c#c#c#c#c#c#c#c#
      c#c#    c#c#c#         c#c#
      c#c#    c#c#c#         c#c#
      c#c#    c#c#c#   c#c#c#   c#c#
      c#c#    c#c#c#   c#c#    c#c#
      c#c#    c#c#c#   c#c#    c#c#
      c#c#    c#c#c#   c#c#    c#c#
      c#c#    c#c#c#   c#c#    c#c#
      c#c#    c#c#c#   c#c#    c#c#
      c#c#    c#c#c#   c#c#    c#c#
      c#c#    c#c#c#  c#c#c#    c#c#
      c#c#    c#c#c#  c#c#     c#c#
      c#c#    c#c#c#  c#c#  c#
     c#c#c#        c#c#c# c#c#c#c#
  c#c#c#c#c#c#       c#c#c#   c#c#c#c#
   c#c#c#c#      c#c#c#c#     c#c#c#c#
   c#c#    c#c#c#c#c#c#c#        c#c#c#
          c#c#c#c#           c#c#c#
           c#              c#

chnj1981 2005-07-08
  • 打赏
  • 举报
回复
我也买了:)
hackate 2005-07-08
  • 打赏
  • 举报
回复
tmfc()

非常感谢,嘎嘎,确实是有问题,他台湾人这个人很不负责任啊。怎么书了写一套,代码里又一套。然后好像又很乱,整个好像没有逻辑的样子,哎,痛苦。。。
renyu732 2005-07-08
  • 打赏
  • 举报
回复
呵呵,兄弟,先帮你Up哦...
tmfc 2005-07-08
  • 打赏
  • 举报
回复
嘿嘿,刚好前几天刚刚做完这几个控件,它的代码是有问题的,不过你用的是vb的,看起来有点累,我慢慢看,看不出问题的话回家把我改过的代码贴上来你看看。
hackate 2005-07-08
  • 打赏
  • 举报
回复
不好意思,代码有点多,但是有点郁闷,始终无法,解决,哪位朋友,如果觉得看起来累的话,这里有这个控件库,下载下,帮忙看看,

http://www.7to.net/mynumbereditor.rar

感谢了
hackate 2005-07-08
  • 打赏
  • 举报
回复
以下为:NumberEditor.vb页面

Imports System
Imports System.Text
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Imports System.Web.UI
Imports Microsoft.VisualBasic

Namespace hackate

<DefaultProperty("Text")> Public Class NumberEditor
Inherits BaseEditor

Private Const JS_Guid As String = "{29FD7A41-49FD-AFA9-6A0BB75A1A51}"
Private Const JS_Hook As String = "return NumberEditor_KeyPress_Handler(this);"
Private Const JS_Script As String = "<script language='javascript'>" & Chr(10) & "function NumberEditor_KeyPress_Handler(ctrl)" & Chr(10) & "{{" & Chr(10) & "if (event.keyCode == 13)" & Chr(10) & "return true;" & Chr(10) & "if (event.keyCode < 48 || event.keyCode > 57)" & Chr(10) & "return false;" & Chr(10) & "else" & Chr(10) & "return true;" & Chr(10) & "}}" & Chr(10) & "</script>"

Private Sub RenderJavaScript()
If Not Page.IsClientScriptBlockRegistered(JS_Guid) Then
Page.RegisterClientScriptBlock(JS_Guid, String.Format(JS_Script, MyBase.ID))
End If
End Sub

Protected Overrides Sub AddAttributesToRender(ByVal writer As System.Web.UI.HtmlTextWriter)
MyBase.AddAttributesToRender(writer)
writer.AddAttribute("OnKeyPress", JS_Hook)
End Sub

Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
MyBase.OnPreRender(e) '这里也提示有错
RenderJavaScript()
End Sub

Public Sub New()
MyBase.new()
End Sub
End Class
End Namespace

不知道这样你能明白吗?HotTrackStyle.vb是一些样式处理啊。JS处理的,然后BaseEditor继承TextBox组件,然后NumberEditor这个继承BaseEdior。
可是我运行的时候提示有两处错误是BaseEdiotr.vb里的OnPreRender事件中,我有注明,还有NumberEdiot.vb里的OnPreRender事件,都是这里,请高手看看我哪里出错了。请指教。。感激ing.

补充一下,这三个.vb类,我都是在“控件库”里创建的,写完代码后,我直接生成工程的,就成了一个DLL文件,然后通过工具箱加载,我平时编译一个文件都不出问题,这次这三个页面连成个控件,不知道是不是因为哪里没处理好的原因,
hackate 2005-07-08
  • 打赏
  • 举报
回复
以下为:BaseEditor.vb页面

Imports System
Imports System.ComponentModel
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace hackate
Public Class BaseEditor
Inherits TextBox

Private _hotTrackStyle As HotTrackStyle

<TypeConverter(GetType(ExpandableObjectConverter)), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Overridable ReadOnly Property HotTrackStyle() As HotTrackStyle
Get
If _hotTrackStyle Is Nothing Then
_hotTrackStyle = GreatHotTrackStyle()
Return _hotTrackStyle
End If
End Get
End Property

Protected Function GreatHotTrackStyle() As HotTrackStyle
Return New HotTrackStyle
End Function

Protected Overrides Sub AddAttributesToRender(ByVal writer As System.Web.UI.HtmlTextWriter)
MyBase.AddAttributesToRender(writer)
HotTrackStyle.AddAttributesToRender(writer, ClientID)
End Sub

Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
MyBase.OnPreRender(e)
If HotTrackStyle.Enabled Then
HotTrackStyle.AddScriptRender(Page)
End If
End Sub

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
If Not Page Is Nothing Then
Page.VerifyRenderingInServerForm(Me)
MyBase.Render(writer)
If HotTrackStyle.Enabled Then ''使用控件时,提示这里有错!
HotTrackStyle.Render(writer, Me)
End If
End If
End Sub

Protected Overrides Sub TrackViewState()
MyBase.TrackViewState()
CType(HotTrackStyle, IStateManager).TrackViewState()
End Sub

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
Dim o As Pair = CType(savedState, Pair)
MyBase.LoadViewState(o.First)
If HotTrackStyle.Enabled Then
CType(HotTrackStyle, IStateManager).LoadViewState(o.Second)
End If
End Sub

Protected Overrides Function SaveViewState() As Object
If HotTrackStyle.Enabled Then
Return New Pair(MyBase.ViewState, CType(HotTrackStyle, IStateManager).SaveViewState)
Else
Return New Pair(MyBase.ViewState, Nothing)
End If
End Function

Public Sub New()

End Sub
End Class
End Namespace

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧