Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Asp:Menu e database access

    Ciao a tutti,

    per un piccolo problema scritto in un post poco fa, ho dovuto abbandonare il componente <TELERIK:MENU e utilizzare il classimo <ASP:MENU.

    Siccome io ho un CMS, e i gli elementi del menu venivano letti in AUTOMATICO dal componente telerik, c'è un modo per fare la stessa cosa ocn il classico menu asp?

    Il classico menu asp non prevede l'aganciamento ad un accessdatasource e non saprei proprio come fare.

    Grazie in anticipo
    Response.Write("Tonyhhkx Programmer32");

  2. #2
    Esiste qualche altro componente gratuito semmai?

    Per il classico compontente asp ho trovato un bel pezzo di codice che simula l'agganciamento.
    Chiedevo se ci fosse un agganciamento automatico senza implementare sempre quel codice quando uso il menu.
    Response.Write("Tonyhhkx Programmer32");

  3. #3
    allora ho utilizzato questo codice per far popolare le voci del mene <asp:

    Codice PHP:
     private DataTable GetMenuData()
        {
            
    string selectCommand "SELECT ProgMenu, ParentID, Testo , URLDest FROM SIS_MENU WHERE Tipo = 't'";
            
    string conString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|BDPSW.mdb";

            
    OleDbDataAdapter dad = new OleDbDataAdapter(selectCommand,conString);
            
    DataTable dtblCategories = new DataTable();

            
    dad.Fill(dtblCategories);
            return 
    dtblCategories;
        }

        private 
    void AddTopMenuItems(DataTable menuData)
        {
            
    DataView view = new DataView(menuData);
            
    view.RowFilter "ParentID IS NULL";
            foreach (
    DataRowView row in view)
            {
                
    MenuItem newMenuItem = new MenuItem(row["Testo"].ToString(), row["ProgMenu"].ToString());
                
    newMenuItem.NavigateUrl row["URLDest"].ToString();
                
    string a newMenuItem.Text;
                
    rmMenuTop.Items.Add(newMenuItem); 
                
    AddChildMenuItems(menuDatanewMenuItem);
            }

        }

        private 
    void AddChildMenuItems(DataTable menuDataMenuItem parentMenuItem)
        {
            
    DataView view = new DataView(menuData);
            
    view.RowFilter "ParentID=" parentMenuItem.Value;
            foreach (
    DataRowView row in view)
            {
                
    MenuItem newMenuItem = new MenuItem(row["Testo"].ToString(), row["ProgMenu"].ToString());
              
    //  newMenuItem.NavigateUrl = row["URLDest"].ToString();
                
    parentMenuItem.ChildItems.Add(newMenuItem);
                
    AddChildMenuItems(menuDatanewMenuItem);
            }
        } 
    Il problema è che se clicco una voce che contiene una sotto voce fa veramente pena la visualizzazione!!
    Sarebbe bello avere il classico menu a tendina, solo che non ho la più pallida idea di come agganciare DINAMICAMENTE le voci con il menu.

    Gli esempio javascript che sono i rete popolano le voci e le sotto voci manualmente, senza aggancio a nesusn database. Quindi non saprei proprio come fare
    Response.Write("Tonyhhkx Programmer32");

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Se tu hai un menu in html-css-javascript magari adattato tra i millemila belli che si trovano in giro puoi farti il componente da te.

    1.Ti fai fare/trovi/crei/adatti un menu. Per esempio questo
    2. provi una versione statica sull tua pagina cosi sei sicuro che va bene, i pezzi di jquery non litigano tra loro ecc.
    3. Ti crei un componente Menu.ascx che si costruisce l'html del menu da se.

    esempio (strettamente legato al menu di cui sopra e a dati inventati)
    Mettiamo il caso di avere un elenco di città suddivise per provincie e di dover caricare una sezione del menu con questi dati.
    Modello:
    codice:
        public class Provincia
        {
            public string ID { get; set; }
            public string NomeProvincia { get; set; }
            public List<Citta> ElencoCitta { get; set; }
        }
        public class Citta
        {
            public string NomeCitta { get; set; }
        }
    Poi mi serve una classe manager (o helper) che mi tira fuori dal DB questi dati. Questa qui sotto per comodità pesca i dati da liste in memoria ma tu dovrai farlo interrogando il DB:
    codice:
        public class MenuManager
        {
            //Elenco di tutte le provincie
            public static List<Provincia> LeggiProvincie()
            {
                return provincie;
            }
            //Elenco delle citta data una provincia
            public static List<Citta> LeggiCitta(string id)
            {
                var prov = provincie.FirstOrDefault(p => p.ID.Equals(id));
                if (null == prov)
                    return null;
                else 
                    return prov.ElencoCitta;
            }
        }
    Nel Menu.ascx mi genero l'html. Il menu che ho scelto è uno di quelli eterogenei e per automatizzarne la generazione dovremmo lavorarci un po su. Per questo le voci principali decido di metterle manualmente. I sotto menu invece (solo uno in questo esempio) li posso tutti automatizzare per esempio pescando dal db.
    codice:
    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Menu.ascx.cs" Inherits="MegaMenu.Usercontrols.Menu" %>
    <%@ Import Namespace=" MegaMenu.Usercontrols" %>
    
    <ul id="ldd_menu" class="ldd_menu">[*]<span>Home</span>[*]<span>Catalogo (vuoto)</span>[*]
            <span>Citta</span>
            <div class="ldd_submenu">
                <asp:Repeater ID="ProvincieRP" runat="server">
                    <HeaderTemplate>
                        <ul>
                    </HeaderTemplate>
                    <ItemTemplate>
                        <li class="ldd_heading"><%# Eval("NomeProvincia") %>
                        <asp:Repeater ID="CittaRP" runat="server" DataSource='<%# MenuManager.LeggiCitta(Eval("ID").ToString()) %>' >
                            <ItemTemplate>[*]
                                    <a href='<%# string.Format("/Citta.aspx?nome={0}",Eval("NomeCitta")) %>'>
                                        <%# Eval("NomeCitta") %>
                                    </a>
                                
                            </ItemTemplate>
                        </asp:Repeater>
                    </ItemTemplate>
                    <FooterTemplate>[/list]
                    </FooterTemplate>
                </asp:Repeater>
            </div>
        [/list]
    
    Qui sotto c'è il javascript del menu che non riporto perchè non è importante ai fini dell'esempio.
    Le voci principali (home, catalogo e città) sono inserite in questo caso manualmente (se il menu fosse stato uno verticale su cui mettere direttamente le province il problema non ci sarebbe stato perche saremmo partiti direttamente con il repeater). L'elenco delle città invece lo genero utilizzando due Repeater innestati, il primo Itera le province e il secondo le città di ogni provincia. Se noti il Datasource del secondo viene creato dal metodo helper LeggiCitta al quale gli si passa l'id della provincia corrente. La direttiva import è il namespace della classe helper MenuManager, senza quella direttiva non posso chiamare l'helper dal markup.

    Non resta che bindare il datasource del repeater esterno all'elenco delle province. Posso farlo nel markup o nel codebheind:
    codice:
            protected void Page_Load(object sender, EventArgs e)
            {
                ProvincieRP.DataSource = MenuManager.LeggiProvincie();
                ProvincieRP.DataBind();
            }
    A questo punto basta trascinare l'usercontrol nella masterpage ed il menu è pronto:


    Si. Si scrive del codice. Ma con questa flessibilità puoi avere tutti i menu che vuoi.

  5. #5
    allora, non ho mai avuto a che fare con il controllo utente.

    Non ci ho capito nulla nel senso, non saprei come adattare tutto al mio menu.

    Da quello che ho capito il menu asp non lo utlizziamo per niente. Ok, allora prendiamo un menu,
    per esempio questo che ho trovato:

    Codice PHP:
    <html>
           <
    link rel="stylesheet" href="menu.css" type="text/css" />

    <
    div id="menu">


    <
    ul>[*][url="#nogo"]Link 1[/url]
    <
    ul>[*][url="#nogo"]Link 1-1[/url][*][url="#nogo"]Link 1-2[/url][*][url="#nogo"]Link 1-3[/url]
    [/list]


    [*][
    url="#nogo"]Link 2[/url]
    <
    ul>[*][url="#nogo"]Link 2-1[/url][*][url="#nogo"]Link 2-2[/url][*][url="#nogo"]Link 2-3[/url][/list]


    [*][
    url="#nogo"]Link 3[/url]
    <
    ul>[*][url="#nogo"]Link 3-1[/url][*][url="#nogo"]Link 3-2[/url][*][url="#nogo"]Link 3-3[/url]

    [/list]
    </
    div
    Ora, questo è un menu statico che fa solo riferimento ad un file .css.
    Ed'è a 2 livelli.

    Ora qui mi sono perso, non ho capito come fare.
    Visto che il menu funziona, l'unico modo per creare il menu leggendo i dati dal db è con con queste funzioni:

    Codice PHP:
       private void PopulateMenu(string pos)
        {
            
    DataTable menuData GetMenuData(pos);
            
    AddTopMenuItems(menuData);
        }

        private 
    DataTable GetMenuData(string pos)
        {
            
    string selectCommand "SELECT ProgMenu, ParentID, Testo , URLDest FROM SIS_MENU WHERE Tipo = '" pos "' ";
            
    string conString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|BDPSW.mdb";

            
    OleDbDataAdapter dad = new OleDbDataAdapter(selectCommandconString);
            
    DataTable dtblCategories = new DataTable();

            
    dad.Fill(dtblCategories);
            return 
    dtblCategories;
        }
      
        private 
    void AddTopMenuItems(DataTable menuData)
        {
            
    DataView view = new DataView(menuData);
            
    view.RowFilter "ParentID IS NULL";
            foreach (
    DataRowView row in view)
            {  if (
    == "2")
            {
                
    cod += "[/list]";
                
    "1";
            }
                
    MenuItem newMenuItem = new MenuItem(row["Testo"].ToString(), row["ProgMenu"].ToString());
                
    cod += "[*]<a href=\"" row["URLDest"].ToString() + "\">" newMenuItem.Text "</a><ul>";
                
    AddChildMenuItems(menuDatanewMenuItem);
            }

        }

        private 
    void AddChildMenuItems(DataTable menuDataMenuItem parentMenuItem)
        {
            
    DataView view = new DataView(menuData);
            
    view.RowFilter "ParentID=" parentMenuItem.Value;
            foreach (
    DataRowView row in view)
            {
                
    MenuItem newMenuItem = new MenuItem(row["Testo"].ToString(), row["ProgMenu"].ToString());
                
    cod += "[*]<a href=\"" row["URLDest"].ToString() + "\">" newMenuItem.Text "</a>";
                
    AddChildMenuItems(menuDatanewMenuItem);
            }
            
    "2";
            
        } 
    Legge i dati dal db (fino a 2 livelli, non saprei come fare per aggiungere n livelli dinamicamento) e riscrive il menu con il response.write(..);
    Questo sistema è troppo spartano lo so, ma funziona bene e ho 2 livelli.

    La soluzione che mi stai proponendo sono sicuro che è molto ma molto migliore, ma essendo poco pratico, non riesco a far molto
    Response.Write("Tonyhhkx Programmer32");

  6. #6

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.