Alfabetisch/ rangschikken .... in menu

Status
Niet open voor verdere reacties.

Grafor

Gebruiker
Lid geworden
31 mei 2008
Berichten
23
Ik heb een progje waar je een menu mee maakt adhv gegevens uit een database (dynamische menu).
Doch heb ik last van het alfabetisch rangschikken van de SUB menu's , welke niet lukt ...:confused:

Kan er iemand helpen AUB :rolleyes:

Bedankt op voorhand !

Hier de URL naar het zip bestandje:
http://www.profbar.com/vb.net/EcMenu.zip
 
Laatst bewerkt:
extra bijlage (enkel source code)

Hier bijgevoegd enkel de source code en een voorbeeld van het bewuste menu.
Het probleem doet zich voor bij het rangschikken van de verticale menu items en hun sub menu's.

de nummers die achter elk menu item staan zou de volgorde moeten zijn.
in de database (mdb) heb ik een rowcol veld, welke de volgorde kan bepalen, waarin het menu getoond moet worden, doch dit laatste ... lukt niet.
Wat wel correct staat zijn de index menu items (horizontale bovenste items) ... daarna ... gaat het fout
Bedankt op voorhand :)
 

Bijlagen

  • EcMenu.zip
    EcMenu.zip
    4,3 KB · Weergaven: 37
  • Capture1.gif
    Capture1.gif
    9,3 KB · Weergaven: 60
Laatst bewerkt:
het ziet er naar uit dat het rangschikt op alfabetische volgorde - maar dan aflopend (x, v, o,b)

deze regel: (via notepad, heb geen 200x)
Code:
        adap.SelectCommand.CommandText = "SELECT * FROM ITEMS ORDER BY ROWCOL DESC"
is denk ik verkeerd. OF, de database doet het verkeerd - het heeft in ieder geval met dat 'DESC' te maken - maak er eens 'ASC' van. Als het dan omgedraaid staat: (b,o,v,x) dan weet je dat dat het is en moet je die regel gaan aanpassen.
 
Volgorde blijft onjuist ....

Bedankt Vegras voor deze tip doch ...

ik ben er me bewust van dat deze "fout" zou kunnen staan:
adap.SelectCommand.CommandText = "SELECT * FROM ITEMS ORDER BY ROWCOL DESC"

door deze te veranderen naar:
adap.SelectCommand.CommandText = "SELECT * FROM ITEMS ORDER BY ROWCOL ASC"

worden dus de items in de horizonntale menu balk omgekeerd weergegeven EN blijven de subitems verkeerd staan.

een derde optie:
adap.SelectCommand.CommandText = "SELECT * FROM ITEMS ORDER BY '" & "ROWCOL" & "' ASC" (als pure tekst sorteren)

bied ook geen directe oplossing

mijn vermoeden ... is dat ik ga moeten sorteren nadat de dataset is gemaakt ....
en gaat het ergens in deze lijn fout:
dsItems.Tables(0).PrimaryKey = New DataColumn() {dsItems.Tables(0).Columns("ROWCOL")}

doch is dit slechts een vermoeden en rijkt mijn vb.net kennis niet zover ...
in de tabel is rowcol: een tekst veld van 50 lang en zonder index.
het blijft door elkaar staan indien ik daar een index op zet.

Toch bedankt voor je hulp :p
 
Laatst bewerkt:
het heeft meer met de kennis van database/sql te maken dan vb.net :p
maar, je hebt gelijk. Mischien kan iemand met 200X je verder helpen.

:thumb:
 
wat bedoeld u

Bedoeld U dat ik deze vraag ergens anders moet plaatsen, zo ja waar, of dat er iemand anders op dit topic gaat reageren?
Sorry voor men eerste stapjes fouten (indien er zijn) hier op het forum.
Bedankt voor je reactie! :thumb:
 
Heb net een auto mail gehad van het forum, met de vraag of het opgelost is.
Helaas niet en dit is de broncode die ik nu heb, waarvan het sorteren nog steeds niet lukt:

Code:
Imports System.Windows.Forms

Public Class HoofdMenu

    'CONNECTIE NAAR ... nu naar MDB
    Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|\MENU.MDB; Persist Security Info=False"
    Public EcMenuVars As New Hashtable 'Alle menu items variabelen
    Public EcMenuFunc As New Hashtable 'Menu item uitvoeren
    Private sFolder As String = System.Environment.CurrentDirectory()

    Private Sub MenuBox_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        LoadMenuItems()
    End Sub

    Function LoadMenuItems() As Boolean
        'Laad alle menu items in het menu
        Dim dsItems As New DataSet
        Dim i As Integer
        Dim Sql As String

        Sql = "SELECT ROWCOL,TEXT,FUNC FROM ITEMS ORDER BY " & "ROWCOL" & " ASC"
        Dim adap As System.Data.OleDb.OleDbDataAdapter
        adap = New System.Data.OleDb.OleDbDataAdapter(Sql, conn)
        adap.Fill(dsItems)
        '************************************************************
        'TestData (steeds uitzetten indien WriteXmlSchema aan staat)!
        'Dim objXmlDocument As New System.Xml.XmlDocument
        'Dim xsdFile As String = sFolder & "\TEST.xsd"
        'objXmlDocument.LoadXml(dsItems.GetXml())
        'objXmlDocument.Save(xsdFile)
        '************************************************************

        ' Set PrimaryKey
        dsItems.Tables(0).Columns("rowcol").Unique = True
        dsItems.Tables(0).PrimaryKey = New DataColumn() {dsItems.Tables(0).Columns("rowcol")}

        For i = 0 To dsItems.Tables(0).Rows.Count - 1
            Dim id_ROWCOL As String 'sub items en sub sub items en ...
            Dim parent As String 'tijdelijke var om parent index te bewaren            
            id_ROWCOL = dsItems.Tables(0).Rows(i)("ROWCOL")

            'VERTICAAL
            Dim menu_it As New DinamicMenu
            menu_it.Text = dsItems.Tables(0).Rows(i)("ROWCOL")
            menu_it.Func = dsItems.Tables(0).Rows(i)("FUNC")
            menu_it.MenuItemobj = New MenuItem
            menu_it.MenuItemobj.Text = dsItems.Tables(0).Rows(i)("TEXT")
            AddHandler menu_it.MenuItemobj.Click, AddressOf CallForMenuItem
            'sort is ok

            If Not EcMenuVars.ContainsKey(dsItems.Tables(0).Rows(i)("ROWCOL")) Then
                EcMenuVars.Add(dsItems.Tables(0).Rows(i)("ROWCOL"), menu_it)
            End If

            While id_ROWCOL.IndexOf(".") > 0
                parent = id_ROWCOL.Substring(0, id_ROWCOL.LastIndexOf("."))
                id_ROWCOL = parent
            End While

        Next

        Dim d As DictionaryEntry
        Dim parentMenu As New MenuItem
        Dim sonMenu As New MenuItem
        Dim parentItem As New DinamicMenu
        Dim sonItem As New DinamicMenu
        Dim sel_key, sel_KeyParent As String

        For Each d In EcMenuVars
            sonItem = d.Value
            sel_key = d.Key

            sonMenu = sonItem.MenuItemobj

            If sel_key.LastIndexOf(".") >= 0 Then
                sel_KeyParent = sel_key.Substring(0, sel_key.LastIndexOf("."))
                parentItem = EcMenuVars(sel_KeyParent)
                parentMenu = parentItem.MenuItemobj
                parentMenu.MenuItems.Add(sonMenu)
            Else
                Me.MainMenu.MenuItems.Add(sonMenu)
            End If
        Next
        CreateEcMenuFunc()
    End Function

    Private Sub CallForMenuItem(ByVal obj As Object, ByVal ea As EventArgs)
        'menu item geklikt? actie !
        Dim i As New MenuItem
        Dim pai As New MenuItem
        Dim position As String

        'bepaal de positie
        i = obj
        pai = i.Parent
        position = i.Index

        While (pai.Parent.GetType().ToString <> "System.Windows.Forms.MainMenu")
            position = pai.Index & "." & position
            pai = pai.Parent
        End While

        position = pai.Index & "." & position

        Dim funcToCall As String

        funcToCall = EcMenuFunc(position)

        '// begin OPDRACHT UITVOEREN
        MsgBox("Opdracht " & funcToCall & " uitvoeren ...")
        If funcToCall = "exit()" Then Application.Exit()

        '// einde OPDRACHT UITVOEREN

    End Sub

    Function CreateEcMenuFunc() As Boolean
        'De HashTable aanmaken (menu informatie)
        'voor elke menu positie
        Dim position As String
        Dim pai As New MenuItem
        Dim item As New MenuItem
        Dim d As New DictionaryEntry
        Dim func As String = ""



        For Each d In EcMenuVars
            item = d.Value.MenuItemObj
            position = item.Index
            If (item.Parent.GetType().ToString = "System.Windows.Forms.MainMenu") Then
                position = item.Index
            Else
                pai = item.Parent

                While (pai.Parent.GetType().ToString <> "System.Windows.Forms.MainMenu")
                    position = pai.Index & "." & position
                    pai = pai.Parent
                End While
                position = pai.Index & "." & position
                func = d.Value.Func
                MsgBox(position.ToString)
            End If


            'relatie menu positie en functie om uit te voeren
            EcMenuFunc.Add(position, func)

        Next
    End Function

    Private Sub CascadeToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.LayoutMdi(MdiLayout.Cascade)
    End Sub

    Private Sub TileVerticleToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.LayoutMdi(MdiLayout.TileVertical)
    End Sub

    Private Sub TileHorizontalToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.LayoutMdi(MdiLayout.TileHorizontal)
    End Sub

    Private Sub ArrangeIconsToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.LayoutMdi(MdiLayout.ArrangeIcons)
    End Sub

    Private Sub CloseAllToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
        ' Close all child forms of the parent.
        For Each ChildForm As Form In Me.MdiChildren
            ChildForm.Close()
        Next
    End Sub

    Private m_ChildFormNumber As Integer

End Class


Public Class DinamicMenu
    'Dinamisch Menu item
    Public Func As String 'de functie welke wordt uitgevoerd
    Public Text As String 'de tekst (getoonde)
    Public MenuItemobj As MenuItem 'het menuitem zelf
End Class
Heeft iemand een idee waarom?
BEDANKT op voorhand!
 
Hier gaat het dus fout heb ik ontdekt :

Code:
       For i = 0 To datasetItems.Tables(0).Rows.Count - 1

            Dim menu_items As New DinamischMenu
            menu_items.MenuItemobj = New MenuItem
            menu_items.Func = datasetItems.Tables(0).Rows(i)("FUNC")
            menu_items.MenuItemobj.Index = datasetItems.Tables(0).Rows(i)("ROWCOL")
            menu_items.MenuItemobj.Text = datasetItems.Tables(0).Rows(i)("TEXT")
            AddHandler menu_items.MenuItemobj.Click, AddressOf CallForMenuItem
'Tot hier is alles inorde (netjes van 0 naar 0.1 naar 0.1.1 enz in menu_items)
            EcMenuVars.Add(datasetItems.Tables(0).Rows(i)("ROWCOL"), menu_items)
'hier zit het door elkaar, begint met 2.1 naar 0.4 enz ... in EcMenuVars (HashTable))

Kan ik deze toch gesorteerd naar in het menu plaatsen?
:confused:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan