这几天在论坛上看到"总是听见有很多人说,要尽量避免使用服务器控件和替换服务器控件,现在发个贴来征集所有的办法"这样的帖子..帖子招来很多同僚的关注..大部分都同意用服务器端控件..而少部分人同意用HTML控件..而同意服务器端控件的朋友说服务器端控件开发效率很快..而用HTML控件..开发效率很慢..而且一时很难下手..复用程度不高...
但是我在这里反问为什么不自己写控件....昨天小弟花了半天的时间写了一个CheckBOx控件..因为时间的原因..可能有些BUG..这个控件不是做于商业用途..只是用于学习..OK?代码如下:
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.HtmlControls
Namespace Framework.WebControls
'''
''' 简单实现可以自定义外观的CheckBox,只是在有特殊需要时使用。
''' 同时避开.NET 框架类库中相关类使用样式表的不方便性。
'''
Public Class CheckBox
Inherits Control
Implements INamingContainer
'IPostBackEventHandler
'''
''' 获取或设置一个值,该值指示是否被选中。
'''
Public Property Checked() As Boolean
Get
state.Value = IIf((state.Value = ""), "False", state.Value)
Return Convert.ToBoolean(state.Value)
End Get
Set(ByVal Value As Boolean)
state.Value = Value.ToString()
Me.Controls.Clear()
CreateChildControls()
End Set
End Property
'''
''' 获取或设置客户端脚本
'''
Public Property ClientAction() As String
Get
Return IIf((ViewState("act") Is Nothing), "", ViewState("act").ToString())
End Get
Set(ByVal Value As String)
ViewState("act") = Value
End Set
End Property
'''
''' 获取或设置一个值,该值指示是否回发。
'''
Public Property AutoPostBack() As Boolean
Get
Return _auto
End Get
Set(ByVal Value As Boolean)
_auto = Value
End Set
End Property
'''
''' 在改变Checked属性时发生。
'''
Public Event ServerChange As EventHandler
Private _auto As Boolean
Private state As System.Web.UI.HtmlControls.HtmlInputHidden = New HtmlInputHidden
Private box As System.Web.UI.HtmlControls.HtmlInputButton = New HtmlInputButton
Public JSFunction As String = "__doChangeCheckBox"
Private Sub Check_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Me.Checked = IIf((Me.Checked = True), False, True)
OnServerChange(sender, e)
End Sub
Protected Overridable Sub OnServerChange(ByVal sender As Object, ByVal e As System.EventArgs)
RaiseEvent ServerChange(Me, e)
End Sub
Protected Overloads Overrides Sub CreateChildControls()
Me.Controls.Remove(box)
box = New HtmlInputButton
box.ID = "box"
If Me.AutoPostBack = True Then
box.Attributes.Add("onmousedown", "__doMouseDown(this)")
AddHandler box.ServerClick, AddressOf Check_Click
Else
box.Attributes.Add("onclick", Me.ClientAction)
box.Attributes.Add("onmousedown", JSFunction + "(this)")
End If
'box.Attributes.Add("language","javascript");
Me.Controls.Add(box)
state.ID = "state"
state.Attributes.Add("value", Me.Checked.ToString())
Me.Controls.Add(state)
End Sub
Protected Overloads Overrides Sub Render(ByVal output As HtmlTextWriter)
'改变外观通过改变样式表的类实现
If Me.Checked = True Then
box.Attributes.Add("class", "CheckedItem")
Else
box.Attributes.Add("class", "UnCheckedItem")
End If
output.Write("")
box.RenderControl(output)
state.RenderControl(output)
output.Write("")
End Sub
End Class
End Namespace
1