![]() |
Problems with Events from an Item Collection
Hi!
I'm trying to build my own custom Menu webcontrol, but I'm having some problems handling the events. I've got 3 classes: 1. A MenuItem Class (It works fine, even independently), 2. A MenuItem Collection Class and 3. A Menu Class that contains a MenuItem Collection Property. The MenuItem supports Click events on the server side, but when I'm trying to assign the Click event of an Item to the main Click event of the Menu, the MenuItem's Click event are lost. How can I solve this? I would really appreciate any suggestion, here's my code, thanks a lot. '**************** Menu.vb Imports System.ComponentModel Public Enum Orientations Horizontal = 0 Vertical = 1 End Enum <DefaultEvent("Click")> _ Public Class Menu Inherits WebControl Implements IPostBackEventHandler Public Event Click As EventHandler Private _items As MenuItemCollection = New MenuItemCollection <DefaultValue(0)> _ Public Property Spacing() As Integer Get Return CType(ViewState("_Spacing"), Integer) End Get Set(ByVal Value As Integer) ViewState("_Spacing") = Value End Set End Property <PersistenceMode(PersistenceMode.InnerProperty)> _ Public ReadOnly Property Items() As MenuItemCollection Get Return _items End Get End Property <DefaultValue(Orientations.Vertical)> _ Public Property Orientation() As Orientations Get Return CType(ViewState("_Orientation"), Orientations) End Get Set(ByVal Value As Orientations) ViewState("_Orientation") = Value End Set End Property Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackE vent 'OnClick(Me, New EventArgs) End Sub Private Sub Menu_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Attributes("onClick") = Attributes("onClick") & ";" & Page.GetPostBackEventReference(Me) End Sub Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter) Dim i As Integer writer.Write("<TABLE BORDER='0' CELLPADDING='") writer.Write(Spacing) writer.Write("' CELLSPACING='") writer.Write(Spacing) writer.Write("'><TR>") For i = 0 To Items.Count - 1 If (Orientation = Orientations.Vertical) Then Items(i).Width = Me.Width Else Items(i).Height = Me.Height End If Controls.Add(Items.Item(i)) If (Orientation = Orientations.Vertical) Then writer.Write("<TR>") End If writer.Write("<TD>") Items.Item(i).RenderControl(writer) writer.Write("</TD>") If (Orientation = Orientations.Vertical) Then writer.Write("</TR>") End If Next writer.Write("</TR>") writer.Write("</TABLE>") End Sub Protected Sub OnClick(ByVal sender As Object, ByVal e As EventArgs) RaiseEvent Click(sender, e) End Sub Private Sub Menu_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Init Dim i As Integer For i = 0 To Items.Count - 1 Items(i).AutoPostBack = True AddHandler Items(i).Click, AddressOf OnClick Next End Sub End Class '**************** MenuItemCollection.vb Public Class MenuItemCollection Inherits CollectionBase Default Public Property Item(ByVal index As Integer) As MenuItem Get Return CType(List(index), MenuItem) End Get Set(ByVal Value As MenuItem) List(index) = Value End Set End Property Public Function Add(ByVal value As MenuItem) As Integer Return List.Add(value) End Function 'Add Public Function IndexOf(ByVal value As MenuItem) As Integer Return List.IndexOf(value) End Function 'IndexOf Public Sub Insert(ByVal index As Integer, ByVal value As MenuItem) List.Insert(index, value) End Sub 'Insert Public Sub Remove(ByVal value As MenuItem) List.Remove(value) End Sub 'Remove Public Function Contains(ByVal value As MenuItem) As Boolean ' If value is not of type MenuItem, this will return false. Return List.Contains(value) End Function Protected Overrides Sub OnInsert(ByVal index As Integer, ByVal value As [Object]) If Not (TypeOf value Is MenuItem) Then Throw New ArgumentException("value must be of type MenuItem.", "value") End If End Sub Protected Overrides Sub OnRemove(ByVal index As Integer, ByVal value As [Object]) If Not (TypeOf value Is MenuItem) Then Throw New ArgumentException("value must be of type MenuItem.", "value") End If End Sub Protected Overrides Sub OnSet(ByVal index As Integer, ByVal oldValue As [Object], ByVal newValue As [Object]) If Not (TypeOf newValue Is MenuItem) Then Throw New ArgumentException("newValue must be of type MenuItem.", "newValue") End If End Sub Protected Overrides Sub OnValidate(ByVal value As [Object]) If Not (TypeOf value Is MenuItem) Then Throw New ArgumentException("value must be of type MenuItem.") End If End Sub End Class '**************** MenuItem.vb Imports System.ComponentModel <DefaultEvent("Click")> _ Public Class MenuItem Inherits WebControl Implements IPostBackEventHandler Public Event Click As EventHandler <DefaultValue(False)> _ Public Property AutoPostBack() As Boolean Get If (CType(ViewState("_autoPostBack"), Object) Is Nothing) Then ViewState("_autoPostBack") = False End If Return CType(ViewState("_autoPostBack"), Boolean) End Get Set(ByVal Value As Boolean) ViewState("_autoPostBack") = Value End Set End Property Public Property Text() As String Get If (CType(ViewState("_Text"), Object) Is Nothing) Then ViewState("_Text") = String.Empty End If Return CType(ViewState("_Text"), String) End Get Set(ByVal Value As String) ViewState("_Text") = Value End Set End Property Public Sub New() InitVars("MenuItem") End Sub Public Sub New(ByVal itemText As String) InitVars(itemText) End Sub Public Sub New(ByVal itemText As String, _ ByVal itemHeight As Integer, _ ByVal itemWidth As Integer) InitVars(itemText, itemHeight, itemWidth) End Sub Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackE vent OnClick(New EventArgs) End Sub Public Overrides Sub RenderEndTag(ByVal writer As System.Web.UI.HtmlTextWriter) writer.Write(Text) MyBase.RenderEndTag(writer) End Sub Private Sub InitVars( _ ByVal itemText As String, _ Optional ByVal itemHeight As Integer = 15, _ Optional ByVal itemWidth As Integer = 70) BackColor = Color.FromArgb(255, 241, 241, 241) Font.Name = "MS Sans Serif" Font.Size = FontUnit.Parse("10") Text = itemText End Sub Protected Overridable Sub OnClick(ByVal e As EventArgs) RaiseEvent Click(Me, e) End Sub Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) Dim script As New System.Text.StringBuilder script.Append("<script language=javascript ") script.Append("src='Menu.js'></script>") Page.RegisterStartupScript("MenuItem", script.ToString) Attributes("onMouseDown") = Attributes("onMouseDown") & _ ";" & _ "chItem(this, " & _ "'default', " & _ "'#999999', '#999999')" Attributes("onMouseOver") = Attributes("onMouseOver") & _ ";" & _ "chItem(this, 'hand', " & _ "'#919191', '#f1f1f1')" Attributes("onMouseOut") = Attributes("onMouseOut") & _ ";" & "chItem(this, " & _ "'default', " & _ "'#f1f1f1', '#f1f1f1')" Style.Add("border", "#f1f1f1 1px solid") If (AutoPostBack) Then Attributes("onClick") = Attributes("onClick") & ";" & Page.GetPostBackEventReference(Me) End If MyBase.OnLoad(e) End Sub End Class '********** Menu.js function chItem(obj, cursor, borderColor, backgroundColor) { obj.style.cursor = cursor; obj.style.backgroundColor = backgroundColor; obj.style.border = borderColor + " 1px solid"; } |
| All times are GMT. The time now is 08:51 PM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.