Main menu dinamico

martedì 02 febbraio 2010 - 17.24

gabriel81 Profilo | Junior Member

Ciao a tutti!
Googlando un po' sono riuscito ad abbozzare un primo rozzo tentativo di menu dinamico con voci prese da db.
Riesco a fare la prima fila di voci, ma non ho capito assolutamente come riempire il drop down

non so se sono riuscito a spiegarmi...

Qualcuno mi può gentilmente illustrare? anche in pseudocodice basterebbe

grazie 1000
http://www.myspace.com/madmack1981

AntCiar Profilo | Expert

Ciao.

Prima di tutto ti consiglio di inserire nei prossimi messaggi che scriverai su questo forum sia la versione di Visual Studio che utilizzi, sia il linguaggio che hai utilizzato di modo che le risposte possono essere dirette senza poi dover cercare tool di conversione codice.

Io ti rispondo con C#:

supponiamo che il tuo elemento base del menu si chiama 'menu1' e che a questo devi aggiungere al suo interno altri tre menu chiamati 'sub1', 'sub2', 'sub3'.

System.Windows.Forms.ToolStripMenuItem sub1 = new System.Windows.Forms.ToolStripMenuItem();
sub1.Name = "sub1"; qui ci puoi mettere quello che vuoi. Magagi anche un codice univoco di modo che quando gestisci il clic su un generico elemento del menu riesci a sapere su quale hai cliccato

sub1.size = new System.Drawing.Size(152, 22);

//aggiungo il sub1 all'elemento padre 'menu1'

this.menu1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {sub1});

cosi puoi fare con tutti gli elementi.

Poi se ti serve inserire qualcosa all'interno di sub1 basta che rifai le stesse operazioni considerando al posto di 'menu1' l'oggetto 'sub1' e così puoi creare livelli innestati anche all'infinito.

Ciao


Cristian Barca

AntCiar Profilo | Expert

Ciao.

Aggiungo altro al mio post.

In generale quando hai problemi di questo tipo puoi fare semplicemente in questo modo: ti crei una form inserendoci dentro il main menu e tutti i suoi sottolivelli. poi vai nel file di designer e vedi il codice che è stato scritto in automatico. Puoi usare questo tipo di approccio anche per altro.

PS. Non vedere la mia risposta come "così la prossima volta vedi di non disturbare gli altri....". E' solo un suggerimento per risparmiare i "tempi di risposta del forum".
Cristian Barca

gabriel81 Profilo | Junior Member

Grazie 1000 per la risposta velocisima!!

Quel giro dal designer l'ho fatto , ma probabilmente ero poco lucido quando l'ho fatto perchè non ne ho dedotto nulla..
Ora provo a fare come dici tu e vediamo cosa esce fuori...

Comunque hai ragione, sono stato troppo generico:
VB.NET con VS2005
http://www.myspace.com/madmack1981

AntCiar Profilo | Expert

Ciao.

Se usi VB Net devi apportare delle modifiche al mio codice perchè è in C#

a tutti i 'this.' devi sostituire 'me.'
tutte le '[]' vanno sostituite con '()'
le parentesi graffe con le tonde
rimuovi tutti i ; dalla fine delle istruzioni

nella dichiarazione delle variabili

DefinizioneTipo aaa = new DefinizioneTipo() va sostituito con DIM aaa AS DefinizioneTipo = new DefinizioneTipo()

per il resto non dovresti avere problemi
Cristian Barca

gabriel81 Profilo | Junior Member

Grazie infinite !

Per coloro che in futuro ne avranno bisogno posto la routine completa.
L'unico limeite per adesso è il livello di annidamento dei menu che per ora è al max 2 (a me basta così!!)

(Christian se cambieresti qcs dimmi pure! nn mi offendo mica!)

Ecco:

Public Sub _CaricaIndirizzario()
Dim _Conn As SqlConnection = _IstanziaConnessioneSQLServer()
Dim _dt As New DataTable
Dim _da As New SqlClient.SqlDataAdapter("SELECT * FROM MENU.INDIRIZZARIO WHERE APPNAME='TEST'", _Conn)
_da.Fill(_dt)
_Conn.close()
Dim _dv_main As New DataView(_dt)
Try
_dv_main.RowFilter = "UNDEROBJ = '*NONE'"
_dv_main.Sort = "PROG ASC"
Catch ex As Exception
MsgBox(ex.Message)
End Try

Dim _dt_main = _dv_main.ToTable()
'MsgBox(_dt.Rows.Count)
'MsgBox(_dt_main.Rows.Count)
If _dv_main.Count > 0 Then
Dim _menu As New MenuStrip

For Each main_row As DataRow In _dt_main.rows
Dim _ms As ToolStripItem
Dim _info As New InfoMenu
_info.PGM = main_row.Item("PGM").ToString
_info.Parent = main_row.Item("UNDEROBJ").ToString
_ms = _menu.Items.Add(main_row.Item("LABEL").ToString, Nothing, New System.EventHandler(AddressOf MMenu_OnClick))
_ms.Tag = _info
Dim _dv_under As New DataView(_dt)
Try
_dv_under.RowFilter = "UNDEROBJ = '" & main_row.Item("CODE").ToString & "'"
_dv_under.Sort = "PROG ASC"
Catch ex As Exception
MsgBox(ex.Message)
End Try

Dim _dt_under As DataTable = _dv_under.ToTable()

For Each under_row As DataRow In _dt_under.Rows
Dim sub1 As New System.Windows.Forms.ToolStripMenuItem()
sub1.Name = under_row.Item("CODE").ToString
sub1.Text = under_row.Item("LABEL").ToString
sub1.Size = New System.Drawing.Size(152, 22)
Dim _ddi As ToolStripDropDownItem = _ms
_ddi.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {sub1})
Next

Me.Controls.Add(_menu)
Next
End If


http://www.myspace.com/madmack1981
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5