none
creare un menu a runtime RRS feed

  • Domanda

  • ciao a tutti,

    vorrei creare a runtime un menu di questa forma

            <Menu Height="23" HorizontalAlignment="Left" Margin="50,50,0,0" Name="Menu1" VerticalAlignment="Top" Width="200">
              <MenuItem Header="_File">
                <MenuItem.ItemsPanel>
                  <ItemsPanelTemplate>
                    <VirtualizingStackPanel Orientation="Vertical"/>
                  </ItemsPanelTemplate>
                </MenuItem.ItemsPanel>
                <MenuItem Header="_New" IsCheckable="true"/>
                <MenuItem Header="_Open" IsCheckable="true"/>
                <MenuItem Header="_Close" IsCheckable="true"/>
                <Separator/>
                <MenuItem Header="Menu with Submenu">
                  <MenuItem Header="_submenuitem1" IsCheckable="true"/>
                  <MenuItem Header="_submenuitem2" IsCheckable="true">
                    <MenuItem Header="_submenuitem2.1" IsCheckable="true"/>
                  </MenuItem>
                </MenuItem>
              </MenuItem>
            </Menu>
    

    in page_loaded ho iniziato a scrivere un menu più semplice

        Dim m As Menu
        Dim objMenuItem As MenuItem
        m = New Menu()
        m.Background = Brushes.AliceBlue
        m.Name = "MENU1"
        m.Margin = New Thickness(50, 50, 0, 0)
        m.Width = 200
        m.Height = 23
        objMenuItem = New MenuItem
        objMenuItem.Width = 200
        objMenuItem.Header = "_aaaaaa"
        m.Items.Add(objMenuItem)
        objMenuItem = New MenuItem
        objMenuItem.Width = 200
        objMenuItem.Header = "_bbbbbb"
        m.Items.Add(objMenuItem)
    
    

    ma non appare nulla!

    Inoltre, come faccio a settare le proprietà di MenuItem.ItemsPanel in modo da ottenere la disposizione verticale?

    giovedì 20 gennaio 2011 15:12

Risposte

  • Ciao Antonio,

    Il problema che stai incontrando è che stai tentando di aprire più lettori di dati contro la stessa connessione db . Per impostazione predefinita, questo ti darà una eccezione come sarà dire che c'è già uno di connessione - come si è visto.

    Potresti invece fare uso di MultipleActiveResultsets , per cui da NET 2.0 e SQL Server 2005 in poi, è possibile specificare un'ulteriore opzione nella stringa di connessione per abilitare più di risultati attivi nei confronti di un unico collegamento db con l'aggiunta di :

    MultipleActiveResultSets = True;

    L'alternativa è quella di utilizzare una connessione diversa per aprire il lettore dati  interno.

    O meglio ancora, potrebbe essere possibile ripensare il tuo approccio originale - forse c'è un modo per farlo senza usare delle query annidate :-)

    Saluti, Daniel.

    ciao Daniel,

    il mio DB è Oracle, e l'attributo MultipleActiveResultsets non è supportato.

    L'approccio alternativo è quello che ho provato, usando una connessione Conn1 globale, e una Conn2 locale all'interno della procedura. Ma il messaggio d'errore rimane, anche se la query carica tutti i dati.

    Per risolvere ho scaricato le righe di Command.ExecuteReader() su un dataTable, e ho lavorato con quello. Sicuramente ho sbagliato qualcosa nella gestione dei DataReader, perché il vincolo di aprire un solo DataReader mi sembra una limitazione assurda

    • Contrassegnato come risposta mr anto venerdì 21 gennaio 2011 15:39
    venerdì 21 gennaio 2011 14:00

Tutte le risposte

  • Forse se aggiungi il menu (m) alla Page o un container qualcosa
    appare... :-)
     

    Corrado Cavalli [Microsoft .NET MVP-MCP]
    UGIdotNET - http://www.ugidotnet.org
    Weblog: http://blogs.ugidotnet.org/corrado/
    Twitter: http://twitter.com/corcav
    giovedì 20 gennaio 2011 16:15
  • Forse se aggiungi il menu (m) alla Page o un container qualcosa
    appare... :-)
     

    Corrado Cavalli [Microsoft .NET MVP-MCP]
    UGIdotNET - http://www.ugidotnet.org
    Weblog: http://blogs.ugidotnet.org/corrado/
    Twitter: http://twitter.com/corcav

    intendi dire che devo aggiungere al codice XAML un tag
    <Menu Name="m"...>
    </Menu>
    

    ?

    Se è così, purtroppo non è quello che mi serve. Devo ricavare i menu da una tabella, in base al profilo dell'utente; quindi non posso sapere a priori se e quanti menu dovrò creare

    giovedì 20 gennaio 2011 16:38
  • No, intendo dire che il menu che hai creato è, attualmente, "staccato"
    dal Visual Tree della Window, quindi non viene renderizzato.
    Se hai una griglia come root containeir devi scrivere qualcosa tipo
     
    LayoutRoot.Children.Add(m);
     

    Corrado Cavalli [Microsoft .NET MVP-MCP]
    UGIdotNET - http://www.ugidotnet.org
    Weblog: http://blogs.ugidotnet.org/corrado/
    Twitter: http://twitter.com/corcav
    giovedì 20 gennaio 2011 16:49
  • No, intendo dire che il menu che hai creato è, attualmente, "staccato"
    dal Visual Tree della Window, quindi non viene renderizzato.
    Se hai una griglia come root containeir devi scrivere qualcosa tipo
     
    LayoutRoot.Children.Add(m);
     

    Corrado Cavalli [Microsoft .NET MVP-MCP]
    UGIdotNET - http://www.ugidotnet.org
    Weblog: http://blogs.ugidotnet.org/corrado/
    Twitter: http://twitter.com/corcav


    grazie mille, ora il menu è visibile. Ma ho un altro problema.

    Il mio menu contiene dei sottomenu, e devo ricavare la struttura da una tabella. Per farlo, ho costruito una procedura ricorsiva P che, data una chiave (elemento del menu), ricava gli elementi del sottomenu e chiama P sui figli della chiave. La struttura è corretta, ma alla prima chiamata ricorsiva scatta questo errore

    "There is already an open DataReader associated with this Command which must be closed first".

    In parole povere, non posso fare delle query annidate??

    venerdì 21 gennaio 2011 10:48
  • Ciao Antonio,

    Il problema che stai incontrando è che stai tentando di aprire più lettori di dati contro la stessa connessione db . Per impostazione predefinita, questo ti darà una eccezione come sarà dire che c'è già uno di connessione - come si è visto.

    Potresti invece fare uso di MultipleActiveResultsets , per cui da NET 2.0 e SQL Server 2005 in poi, è possibile specificare un'ulteriore opzione nella stringa di connessione per abilitare più di risultati attivi nei confronti di un unico collegamento db con l'aggiunta di :

    MultipleActiveResultSets = True;

    L'alternativa è quella di utilizzare una connessione diversa per aprire il lettore dati  interno.

    O meglio ancora, potrebbe essere possibile ripensare il tuo approccio originale - forse c'è un modo per farlo senza usare delle query annidate :-)

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    Seguici su Twitter e Facebook

    venerdì 21 gennaio 2011 11:48
  • Ciao Antonio,

    Il problema che stai incontrando è che stai tentando di aprire più lettori di dati contro la stessa connessione db . Per impostazione predefinita, questo ti darà una eccezione come sarà dire che c'è già uno di connessione - come si è visto.

    Potresti invece fare uso di MultipleActiveResultsets , per cui da NET 2.0 e SQL Server 2005 in poi, è possibile specificare un'ulteriore opzione nella stringa di connessione per abilitare più di risultati attivi nei confronti di un unico collegamento db con l'aggiunta di :

    MultipleActiveResultSets = True;

    L'alternativa è quella di utilizzare una connessione diversa per aprire il lettore dati  interno.

    O meglio ancora, potrebbe essere possibile ripensare il tuo approccio originale - forse c'è un modo per farlo senza usare delle query annidate :-)

    Saluti, Daniel.

    ciao Daniel,

    il mio DB è Oracle, e l'attributo MultipleActiveResultsets non è supportato.

    L'approccio alternativo è quello che ho provato, usando una connessione Conn1 globale, e una Conn2 locale all'interno della procedura. Ma il messaggio d'errore rimane, anche se la query carica tutti i dati.

    Per risolvere ho scaricato le righe di Command.ExecuteReader() su un dataTable, e ho lavorato con quello. Sicuramente ho sbagliato qualcosa nella gestione dei DataReader, perché il vincolo di aprire un solo DataReader mi sembra una limitazione assurda

    • Contrassegnato come risposta mr anto venerdì 21 gennaio 2011 15:39
    venerdì 21 gennaio 2011 14:00