08. september 2002 - 13:01Der er
7 kommentarer og 1 løsning
Event på MenuItem
Jeg har en klasse som genererer menuen på en form dynamisk (da den er afhængig af hvilken bruger som er logget på). Klassen får formen med som parameter. Klassen har en attribut af typen menuItem som bruges til at generere alle punkter i menuen. Hvordan får jeg en click_event tilknyttet menupunkterne?
Her er min klasse. har fjernet properties for overskuelighedens skyld. DynamicMenuItem arver fra MenuItem og indeholder kun en enkelt attribut som er et id der skal bruges i forbindelse med onclick proceduren.
Public Class DynamicMenu Private mtTree As MenuTree Private foForm As System.Windows.Forms.Form Private mmMainMenu = New System.Windows.Forms.MainMenu() Private miMenuItem As New DynamicMenuItem() Private colItems As New Collection()
Sub New(ByVal menutree As MenuTree, ByVal mform As System.Windows.Forms.Form, ByVal cItems As Collection) mtTree = menutree foForm = mform foForm.Menu = mmMainMenu colItems = cItems
CreateTree() CreateMenu() mtTree.SetRootAsCurrent() End Sub
#Region "CreateTree" Public Sub CreateTree() Dim i As Integer For i = 1 To colItems.Count Step 1 mtTree.InsertItem(colItems.Item(i)) Next End Sub #End Region
#Region "CreateMenu" Private Sub CreateMenu() mtTree.SetRootAsCurrent() Dim item As Object Dim i As Integer
For i = 1 To mtTree.CurrentNode.Children.Count Step 1 If mtTree.CurrentNode.Child(i).Item.GetType.ToString.Equals("System.String") Then item = CType(mtTree.CurrentNode.Child(i).Item, String) With miMenuItem .dMIId = 0 .Text = item End With mmMainMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) Dim j As Integer For j = 1 To mtTree.CurrentNode.Child(i).children.count Step 1 CreateMenu(mtTree.CurrentNode.Child(i), miMenuItem) Next Else item = CType(mtTree.CurrentNode.Child(i).Item, Item) With miMenuItem .dMIId = item.iId .Text = item.iName End With mmMainMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) End If miMenuItem = New DynamicMenuItem() Next End Sub
Private Sub CreateMenu(ByVal curNode As GeneralTreeNode, ByVal curDynMenuItem As DynamicMenuItem) If curNode.Children.Count <> 0 Then Dim item As Object Dim i As Integer miMenuItem = New DynamicMenuItem() For i = 1 To curNode.Children.Count Step 1 If curNode.Child(i).Item.GetType.ToString.Equals("System.String") Then item = CType(curNode.Child(i).Item, String) With miMenuItem .dMIId = 0 .Text = item End With
Dim j As Integer For j = 0 To curDynMenuItem.MenuItems.Count Step 1 If (curDynMenuItem.MenuItems.Count <> 0) Then If (curDynMenuItem.MenuItems.Item(j).ToString.Equals(miMenuItem.text) = False) Then curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) Exit For End If Else curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) End If Next CreateMenu(curNode.Child(i), miMenuItem) Else item = CType(curNode.Child(i).Item, Item) With miMenuItem .dMIId = item.iId .Text = item.iName End With curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) End If miMenuItem = New DynamicMenuItem() Next End If End Sub #End Region
Jeg har selv løst problemet. En af menuitems konstruktører har en eventhandler som parameter. Jeg sender min sub procedure menuitem_click med til konstruktøren. Så har jeg løst mit problem. :) Tak for hjælpen. Jeg tager dog points selv da jeg selv løste mit problem. Her er klassen igen revideret hvis i skulle have lyst til at bruge den.
Public Class DynamicMenu Private mtTree As MenuTree Private foForm As System.Windows.Forms.Form Private mmMainMenu = New System.Windows.Forms.MainMenu() Private miMenuItem As New DynamicMenuItem() Private colItems As New Collection()
Sub New(ByVal menutree As MenuTree, ByVal mform As System.Windows.Forms.Form, ByVal cItems As Collection) mtTree = menutree foForm = mform foForm.Menu = mmMainMenu colItems = cItems
CreateTree() CreateMenu() mtTree.SetRootAsCurrent() End Sub
#Region "CreateTree" Public Sub CreateTree() Dim i As Integer For i = 1 To colItems.Count Step 1 mtTree.InsertItem(colItems.Item(i)) Next End Sub #End Region
#Region "CreateMenu" Private Sub CreateMenu() mtTree.SetRootAsCurrent() Dim item As Object Dim i As Integer
For i = 1 To mtTree.CurrentNode.Children.Count Step 1 If mtTree.CurrentNode.Child(i).Item.GetType.ToString.Equals("System.String") Then item = CType(mtTree.CurrentNode.Child(i).Item, String) miMenuItem = New DynamicMenuItem(item, 0) mmMainMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) Dim j As Integer For j = 1 To mtTree.CurrentNode.Child(i).children.count Step 1 CreateMenu(mtTree.CurrentNode.Child(i), miMenuItem) Next Else item = CType(mtTree.CurrentNode.Child(i).Item, Item) miMenuItem = New DynamicMenuItem(item.iName, item.iId, New EventHandler(AddressOf Me.MenuItem_Clicked)) mmMainMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) End If Next End Sub
Private Sub CreateMenu(ByVal curNode As GeneralTreeNode, ByVal curDynMenuItem As DynamicMenuItem) If curNode.Children.Count <> 0 Then Dim item As Object Dim i As Integer For i = 1 To curNode.Children.Count Step 1 If curNode.Child(i).Item.GetType.ToString.Equals("System.String") Then item = CType(curNode.Child(i).Item, String) miMenuItem = New DynamicMenuItem(item, 0) Dim j As Integer For j = 0 To curDynMenuItem.MenuItems.Count Step 1 If (curDynMenuItem.MenuItems.Count <> 0) Then If (curDynMenuItem.MenuItems.Item(j).ToString.Equals(miMenuItem.Text) = False) Then curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) Exit For End If Else curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) End If Next CreateMenu(curNode.Child(i), miMenuItem) Else item = CType(curNode.Child(i).Item, Item) miMenuItem = New DynamicMenuItem(item.iName, item.iId, New EventHandler(AddressOf Me.MenuItem_Clicked)) curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem}) End If Next End If End Sub #End Region
#Region "Properties" Public Property MenuTree() As MenuTree Get Return mtTree End Get Set(ByVal Value As MenuTree) mtTree = Value End Set End Property
Public Property Form() As System.Windows.Forms.Form Get Return foForm End Get Set(ByVal Value As System.Windows.Forms.Form) foForm = Value End Set End Property
Public Property MainMenu() As System.Windows.Forms.MainMenu Get Return mmMainMenu End Get Set(ByVal Value As System.Windows.Forms.MainMenu) mmMainMenu = Value End Set End Property
Public Property MenuItem() As System.Windows.Forms.MenuItem Get Return miMenuItem End Get Set(ByVal Value As System.Windows.Forms.MenuItem) miMenuItem = Value End Set End Property
Public Property Items() As Collection Get Return colItems End Get Set(ByVal Value As Collection) colItems = Value End Set End Property
#End Region Private Sub MenuItem_Clicked(ByVal sender As Object, ByVal e As System.EventArgs) sender.dMIId() MsgBox("event " & sender.dMIId()) End Sub End Class
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.