Avatar billede peter_svendsen Nybegynder
25. januar 2005 - 12:44 Der er 1 kommentar og
1 løsning

Tray menu: Dynamiske menupunkter med dynamiske underpunkter

Jeg har opbygget en menu, hvor den relevante del kommer fra XML til et Dataset og forbi et Dataview inden det bruges til at opbygge menupunkterne. Jeg har lavet det så et statisk menupunkt kan have variable underpunkter, men kan ikke finde ud af at give de variable underpunkter deres egne variable underpunkter. Beklager de mange informationer, men kan måske hjælpe med at få et overblik over problemet.


Dataset strukturen er opbygget på følgende måde:
Projekt    1-----*    Task    1-----*    SubTask

Tabellerne har følgende informationer:
Projekt: (id, navn)
Task: (id, navn, projekt)
Subtask: (id, navn, task)

Min nuværende menu opbygning ser ud på følgende måde:
Projekt  -> (Liste over mulige projekter)
Task      -> (Tomt hvis der ikke er valgt et projekt, og viser projektets tasks når et projekt er valgt)
Subtask -> (Tomt hvis der ikke er valgt en task, og viser taskens subtasks når et projekt er valgt)

Jeg vil gerne ændre opbygningen så man ikke behøver at vælge projekt eller task, men kan bevæge sig ind i undermenuer direkte. Opbygningen vil se ud på følgende måde:
Projekt ->
    Projekt1 ->
          Task1 ->
              Subtask1
              Subtask2
          Task2
          Task3
          Task4 ->
              Subtask3
    Projekt2 ->
          Task3 ->
              Subtask4

*** MIN NUVÆRENDE KODE (relevante områder klippet sammen) ***
*************************************************************
    Private Projects As MenuItem
    Private Tasks As MenuItem
    Private SubTasks As MenuItem
    Private Data As New dsProTrackTray

    Private Sub BuildMenu()
        Me.Menu.MenuItems.Clear()

        'PROJECTS - Dataview
        Dim dvProj As New DataView(Data.Tables("Project"), _
            "", _
            "ProjectName", _
            DataViewRowState.CurrentRows)

        'PROJECTS - Added to menu
        Dim drvProj As DataRowView
        Projects = Me.Menu.MenuItems.Add("Projects")

        For Each drvProj In dvProj
            Projects.MenuItems.Add(New MenuItemWithID(CType(drvProj.Row.ItemArray(1), String), AddressOf AppChangeProject, CInt(drvProj.Row.ItemArray(0))))
        Next

        'TASKS - Dataview
        Dim dvTask As New DataView(Data.Tables("Task"), _
            "Project = " & CurrentProject, _
            "TaskName", _
            DataViewRowState.CurrentRows)

        'TASKS ARE ADDED
        Dim drvTask As DataRowView
        Tasks = Me.Menu.MenuItems.Add("Tasks")
        If Not CurrentProject = 0 Then
            For Each drvTask In dvTask
                Tasks.MenuItems.Add(New MenuItemWithID(CType(drvTask.Row.ItemArray(2), String), AddressOf AppChangeTask, CInt(drvTask.Row.ItemArray(0))))
            Next
        End If

        'SUBTASKS - Dataview
        Dim dvSubTask As New DataView(Data.Tables("Subtask"), _
            "Task = " & CurrentTask, _
            "SubTaskName", _
            DataViewRowState.CurrentRows)

        'SUBTASKS ARE ADDED
        Dim drvSubTask As DataRowView
        SubTasks = Me.Menu.MenuItems.Add("SubTasks")
        If Not CurrentTask = 0 Then
            For Each drvSubTask In dvSubTask
                SubTasks.MenuItems.Add(New MenuItemWithID(CType(drvSubTask.Row.ItemArray(1), String), AddressOf AppChangeSubTask, CInt(drvSubTask.Row.ItemArray(0))))
            Next
        End If
    End Sub
**********************************************************
**********************************************************
(MenuItemWithID er en overbygning til MenuItem, som gemmer et Id)
Avatar billede peter_svendsen Nybegynder
25. januar 2005 - 14:46 #1
Jeg har hævet pointtallet. Ved ikke om løsningen er særlig omfattende, men ved at spørgsmål med meget tekst normalt skræmmer folk væk =)
Avatar billede peter_svendsen Nybegynder
27. januar 2005 - 09:41 #2
Har selv fundet en løsning på problemet, og indsætter koden nedenfor, så andre kan se den hvis de har brug for det.

******************************************
'DataView & DataRowView
Dim dvProj As DataView
Dim drvProj As DataRowView
Dim dvTask As DataView
Dim drvTask As DataRowView
Dim dvSubTask As DataView
Dim drvSubTask As DataRowView

dvProj = New DataView(Data.Tables("Project"), _
    "", _
    "ProjectName", _
    DataViewRowState.CurrentRows)

Projects = Me.Menu.MenuItems.Add("Projects")

For Each drvProj In dvProj
    dvTask = New DataView(Data.Tables("Task"), _
        "Project = " & CInt(drvProj.Row.ItemArray(0)), _
        "TaskName", _
        DataViewRowState.CurrentRows)

    Tasks = Projects.MenuItems.Add(CType(drvProj.Row.ItemArray(1), String))

    For Each drvTask In dvTask
        dvSubTask = New DataView(Data.Tables("Subtask"), _
        "Task = " & CInt(drvTask.Row.ItemArray(0)), _
        "SubTaskName", _
        DataViewRowState.CurrentRows)

        If dvSubTask.Count = 0 Then 'Tasken har ingen SubMenuer
            Tasks.MenuItems.Add(New MenuItemWithID(CType(drvTask.Row.ItemArray(2), String), AddressOf AppChangeTask, CInt(drvTask.Row.ItemArray(0))))
        Else 'Tasken har SubMenuer
            SubTasks = Tasks.MenuItems.Add(CType(drvTask.Row.ItemArray(2), String))
            For Each drvSubTask In dvSubTask
                SubTasks.MenuItems.Add(New MenuItemWithID(CType(drvSubTask.Row.ItemArray(1), String), AddressOf AppChangeSubTask, CInt(drvSubTask.Row.ItemArray(0))))
            Next
        End If
    Next
Next
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester