299 messaggi dal 13 luglio 2005
Salve a tutti,
io spesso e volentieri creo una classe locale (magari estendendo una classe preesistente), faccio una query in linq e popolo quella classe. Poi la List<miaClasse> la dò in pasto ad una GridView che mi visualizza l'elenco dei risultati. Tutto funziona in maniera abbastanza "pulita".
Il problema nasce quando devo fare la paginazione o l'ordinamento! non c'è verso di farlo funzionare! Ho cercato di intercettare i vari eventi, ma non riesco ad avere il risultato voluto. La cosa invece funziona se io creo un metodo su una dll esterna (ma perchè deve essere esterna!?) e imposto nella definizione della GridView il datasource...
Qualcuno mi sa dare qualche consiglio? E' sbagliato il metodo che uso? come dovrei procedere? non posso usare in nessun modo una query e una classe locali?

Grazie a tutti.

Umb
177 messaggi dal 30 novembre 2004
No il metodo è corretto.
I risultati li vedi nella griglia giusto?

Ti consiglio di impostare la lista in una property

private List<TuoOggetto> Lista
    {
      get
      {
        try
        {
          object session = ViewState["Lista"];
          return session == null
            ? new List<TuoOggetto>()
            : (List<TuoOggetto>)session;
        }
        catch (Exception)
        {
          return new List<TuoOggetto>();
        }
      }
      set => ViewState["Lista"] = value;
    }


in modo da poterla richiamare ad esempio sul cambio pagina:

protected void GridViewDatas_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
      GridViewDatas.PageIndex = e.NewPageIndex;
      GridViewDatas.DataSource = Lista;
      GridViewDatas.DataBind();
    }
299 messaggi dal 13 luglio 2005
Ciao Mexico77,
ti ringrazio per la risposta, ho provato il codice che mi hai consigliato e funziona alla grande!
Solo due piccoli appunti:
1. inizialmente la pagina mi segnalava un errore per la classe che non era serializzabile, ma ho risolto con l'attributo [Serializable]. Però ho letto in giro che forse era meglio utilizzare l'oggetto "Cache" al posto del "ViewState", tu che ne pensi?
2. potresti dirmi come fare l'ordinamento? ho cercato di usare lo stesso principio, ma ... niente da fare ...

Grazie ancora, ciao.

Umb
177 messaggi dal 30 novembre 2004
Allora la cache resta li, il viewstate muore quando muore la pagina, è una tua scelta cosa usare, molto dipende dalle esigenze.

Per l'ordinamento ti crei un metodo per conservare il verso:

private string GetSort()
        {
            string direction = "";
            try
            {
                direction = Session["SortDirection"].ToString();
            }
            catch (Exception) { }
            switch (direction)
            {
                case "ASC":
                    Session["SortDirection"] = "DESC";
                    break;
                case "":
                case "DESC":
                    Session["SortDirection"] = "ASC";
                    break;
            }
            return Session["SortDirection"].ToString();
        }


poi nel metodo che richiama l'ordinamento:

 protected void GridViewDatas_Sorting(object sender, GridViewSortEventArgs e)
        {
            if (e.SortExpression == "SortExpression")
            {
               if (GetSort() == "ASC")
                   Lista= Lista.OrderBy(x => x.Campo).ToList();
               else
                   Lista= Lista.OrderByDescending(x => x.Campo).ToList();
            }
            GridViewDatas.DataSource = Lista;
            GridViewDatas.DataBind();
        }
299 messaggi dal 13 luglio 2005
Perfetto, funziona! ... anche se ho dovuto dichiarare un oggetto locale temporaneo, altrimenti non c'era verso di farlo funzionare (chissà perchè?), cioè:
List<miaClasse> tmp = new List<miaClasse>();
tmp = Lista.OrderBy(x => x.Campo).ToList();
GridViewDatas.DataSource = tmp;
GridViewDatas.DataBind();

Però se io voglio che ogni colonna della GridView possa essere ordinata, sono costretto a fare uno "switch case" e per ogni Campo avere un ordinamento diverso ..., cioè:
switch e.SortExpression
{
   case "Colonna1":
     tmp = Lista.OrderBy(x => x.Colonna1).ToList();
     break;
   case "Colonna2":
     tmp = Lista.OrderBy(x => x.Colonna2).ToList();
     break;
   case "Colonna3":
     tmp = Lista.OrderBy(x => x.Colonna3).ToList();
     break;
   ....
}

non si potrebbe fare una cosa un po' più automatica sfruttando il valore di e.SortExpression ? In definitiva una query "dinamica" ?

Umb
177 messaggi dal 30 novembre 2004
puoi provare a fare la cosa dinamica certo. Dovresti avere i sort expression con i nomi delle colonne e parsare poi il nome, ma il codice devi vedere tu.... al momento non riesco
299 messaggi dal 13 luglio 2005
Ok mexico77, ti ringrazio comunque mi sei stato di grande aiuto!

Ciao.

Umb

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.