413 messaggi dal 22 giugno 2007
Salve, sto cercando di realizzare un elenco ad albero di categorie e sotto-categorie per 2 soli livelli, prendendo i dati da un Database.
Non posso usare il Treeview in quanto ho bisogno che il risultato in HTML del controllo sia un Ul perchè devo usare un script Jquery che accetta tale tag.

Ho provato a risolvere il problema con dei Repeat in tale modo:
<asp:Repeater ID="repeatGroup" runat="server" OnItemDataBound="figli_ItemDataBound">
 <ItemTemplate>
   <li>
   <asp:HyperLink ID="padreHyperLink" runat="server" ToolTip='<%#Eval("CodCat")%>' Text='<%#Eval("Descrizione")%>'>  
   </asp:HyperLink>                                   
   <asp:Repeater ID="repeatCategory" runat="server" DataMember="4" OnItemDataBound="figli_ItemDataBound">
     <HeaderTemplate>
       <ul id="categorieFigli">
     </HeaderTemplate>
     <ItemTemplate>
       <li>
       <asp:HyperLink NavigateUrl='<%# "/categoria/" + DataBinder.Eval(Container.DataItem,"Descrizione").ToString().Replace(" ", "-").ToLower() + "_" + DataBinder.Eval(Container.DataItem,"CodCat")+ ".aspx"%>' ID="padreHyperLink" runat="server" ToolTip='<%#Eval("CodCat") %>' Text='<%#Eval("Descrizione")%>'></asp:HyperLink>
       <asp:Repeater ID="repeatCategory" runat="server" DataMember="8">
         <HeaderTemplate>
           <ul id="categorieFigli">
         </HeaderTemplate>
         <ItemTemplate>
           <li>
           <asp:HyperLink NavigateUrl='<%# "/categoria/" + DataBinder.Eval(Container.DataItem,"Descrizione").ToString().Replace(" ", "-").ToLower() + "_" + DataBinder.Eval(Container.DataItem,"CodCat")+ ".aspx"%>'
ID="padreHyperLink" runat="server" Text='<%#Eval("Descrizione")%>'></asp:HyperLink></li>
         </ItemTemplate>
         <FooterTemplate>
            </ul>
         </FooterTemplate>
       </asp:Repeater>
     </li>
     </ItemTemplate>
     <FooterTemplate>
       </ul>
     </FooterTemplate>
   </asp:Repeater>
     </li>
  </ItemTemplate>
</asp:Repeater>


Il risultato che ottengo è quello che desidero ma ho problemi di prestazioni del sito a causa di tale controllo.
Qualcuno riesce a fornirmi una soluzione? Potrei utilizzare un altro controllo?
Grazie mille
93 messaggi dal 25 maggio 2005
ciao,
non è tanto il codice aspx che potrebbe creare problemi, ma come passi i dati a questi repeater.

In un mio progetto ho una struttura dati ben costruita, e la pagina aspx ha 5 repeater uno dentro l'altro. Non ci sono assolutamente problemi di prestazioni (definisci il tuo "standard" per "problema" comunque. Per me, per la mia mole di dati, 5 secondi non è un problema, per altri potrebbe esserlo)
413 messaggi dal 22 giugno 2007
Ciao e grazie mille della tua risposta.
beh magari fossero 5 secondi  .. la pagina ci mette quasi un minuto per caricarsi, ed visto che i repeater sono nella masterpage capisci che tutto il sito risulta molto lento, superando il minuto quando vi sono lettura di altr query..

Ti scrivo la parte di codice per la lettura dei dati:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
     cod.Category cat = new DinECommerce.cod.Category();
     repeatGroup.DataSource = cat.categorieLivello("2", null);
     repeatGroup.DataBind();
  }
}

protected void figli_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
  HyperLink padre = e.Item.FindControl("padreHyperLink") as HyperLink;
  if (padre != null)
  {
    string codCat = padre.ToolTip;
    cod.Category cat = new DinECommerce.cod.Category(codCat);
    padre.ToolTip = "";
    string descrizione = padre.Text;
    padre.NavigateUrl = "~/categoria/" + cat.DescrizionePerUrl + "_" + codCat + ".aspx";
    Repeater figli = e.Item.FindControl("repeatCategory") as Repeater;

    DataView vista = cat.categorieLivello(figli.DataMember, codCat);
    if (vista.Count > 0)
    {
        figli.DataSource = vista;
        figli.DataBind();
    }
    else
    {
        figli.Visible = false;
    }
  }
}

CLASSI per la CATEGORIA
public Category()
{ 
}
public Category(string codCat)
{
  cod.DinECommerceDataSet.din_CategorieDataTable tableCat = LeggiCategorie();
  DataView categoriaDV = new DataView(tableCat, "CodCat = " + codCat, "CodCat", DataViewRowState.CurrentRows);
  DataRowView categRow = categoriaDV[0];
  descrizione = categRow["Descrizione"].ToString();

  if (codCat.Length > 2)
  {
     DescrizioneCompleta = percorsoCategoria(codCat) + " > " + descrizione;
  }
  else
  {
     DescrizioneCompleta = descrizione;
  }
  DescrizionePerUrl = cod.Util.MakeValidPathDescrition(descrizione);
}

public DataView categorieLivello(string lungArt, string codCat_padre)
{
  cod.DinECommerceDataSet.din_CategorieDataTable tableCat = LeggiCategorie();

  DataView livello;
  if (codCat_padre == null)
  {
    livello = new DataView(tableCat, "LEN(CodCat) = 2", "Descrizione", DataViewRowState.CurrentRows);
  }
  else
  {
    livello = new DataView(tableCat, "LEN(CodCat) =" + lungArt + "AND CodCat LIKE '" + codCat_padre + "%'", "Descrizione", DataViewRowState.CurrentRows);
  }
  return livello;
}

private static cod.DinECommerceDataSet.din_CategorieDataTable LeggiCategorie()
{
  cod.DinECommerceDataSet.din_CategorieDataTable tableCat = (cod.DinECommerceDataSet.din_CategorieDataTable)HttpContext.Current.Cache.Get("CategorieDataTable");
  if (tableCat == null)
  {
     cod.DinECommerceDataSetTableAdapters.din_CategorieTableAdapter ta = new DinECommerce.cod.DinECommerceDataSetTableAdapters.din_CategorieTableAdapter();
     tableCat = ta.GetData();
     HttpContext.Current.Cache.Insert("CategorieDataTable", tableCat);
     ta.Dispose();
  }
  return tableCat;
}
161 messaggi dal 07 settembre 2009
La butto lì così... e se caricassi i dati tramite Ajax? Non ti aiuterà molto nel velocizzare il caricamento dati dei repeater (personalmente prediligo i ListView) ma almeno eviti di dover aspettare che tutta la pagina si carichi, permettendo all'utente di effettuare altre operazioni nel mentre.


Davide
413 messaggi dal 22 giugno 2007
Nessuno sa darmi una dritta?
Non riesco a risolvere il problema e il provider mi sta alle strette perchè dice che consumo molta CPU.
Please...
93 messaggi dal 25 maggio 2005
purtroppo non ho ancora avuto il tempo di vedere il codice che hai postato.....

però mi viene in mente una cosa: sei costretto ad usare i datatable e le dataview? Puoi eventualmente utilizzare Linq?
Esiste il modo di interrogare le Table con Linq:
http://blogs.msdn.com/b/adonet/archive/2007/01/26/querying-datasets-introduction-to-linq-to-dataset.aspx


Inoltre ho notato che la proprietà NavigateUrl dei tuoi HyperLink è calcolata, e non è nemmeno semplice.
Sostituisci tutto questo calcolo con un valore già pronto, che ti crei quando fai la select dei dati, a livello di query (se puoi) o con Linq

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.