11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prego!


Rifarò il progetto con objectdatasource ...

Aspetta perché "rifare il progetto" forse è eccessivo. Il mio consiglio era di valutare l'ObjectDataSource/SelectMethod per questa specifica pagina. Infatti, se sistemare il codice attuale ti richiede più sforzo del normale, potrebbe essere utile investire il tempo nella nuova soluzione.


tuttavia non si potrebbe fare la stessa cosa che dici nel mio metodo
BindListviewOnPostback ?

Non ho avuto modo di testarlo ma sì, puoi provare.
Al click sul bottone "Cerca" non dovrai legare alcuna logica particolare. Al limite un semplice listview.DataBind().


l'utente perde di vista l'articolo perchè può finire in un altra pagina.

Sì, infatti non è ideale. Se è strettamente necessario supportare l'ordinamento per quantità, puoi reimpostare il datapager alla pagina in cui si trova l'oggetto con la nuova quantità.
Quando gestisci l'evento Click del +, puoi provare a reimpostare le proprietà del DataPager con il metodo SetPageProperties.

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Come faccio in Aggiorna quantità a sapere l'indice che avrà l'articolo?
Conosco l'indice attuale!
Inoltre GetData viene eseguito alla fine.

Sbaglio?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Come faccio in Aggiorna quantità a sapere l'indice che avrà l'articolo?
Conosco l'indice attuale!
Inoltre GetData viene eseguito alla fine.

Potresti conoscerlo invocando GetData, che ti restituirà l'elenco ordinato secondo la SortExpression attuale.
Comunque, puoi controllare se l'articolo cade o no nella pagina corrente anche da GetData. Così forse sarà un pelo più pulito.

In pratica, da AggiornaQuantità ti limiti a mantenere un riferimento all'oggetto aggiornato:
private Articolo articoloDaRendereVisibile = null;
protected void AggiornaQuantità(object sender, CommandEventArgs e)
{
    var idArticolo = Guid.Parse(e.CommandArgument.ToString());
    var articoloDaAggiornare = Lista.FirstOrDefault(articolo => articolo.IdArticolo == idArticolo);
    if (articoloDaAggiornare != null)
    {
        var casellaQuantità = (sender as Control).NamingContainer.FindControl("Quantità") as TextBox;
        int quantità;

        if (int.TryParse(casellaQuantità.Text, out quantità))
        {
            articoloDaAggiornare.ImpostaQuantità(quantità);
        }
    }
    
    //A questo campo privato assegno il riferimento all'oggetto aggiornato
    articoloDaRendereVisibile = articoloDaAggiornare;
    ListView1.DataBind();
}


E poi da GetData controlli se è stato aggiornato un oggetto e in tal caso verifichi che rientri nella pagina corrente. Se non rientra, cambi la pagina con il metodo SetPageProperties.
public IQueryable ListView1_GetData(int maximumRows, int startRowIndex, out int totalRowCount, string sortByExpression)
{
    var lista = Lista.AsQueryable();
    totalRowCount = lista.Count();

    //Filtro, se è stato digitato un testo
    var filtroTestuale = txtSearchCodart.Text.Trim();
    if (!string.IsNullOrEmpty(filtroTestuale))
        lista = lista.Where(elemento => elemento.Nome.Contains(filtroTestuale));

    if (!string.IsNullOrEmpty(sortByExpression))
        lista = lista.OrderBy(sortByExpression);

    //Se è stato aggiornato un articolo...
    if (articoloDaRendereVisibile != null)
    {
        //Verifico se è fuori dalla pagina corrente
        var indiceArticolo = lista.ToList().IndexOf(articoloDaRendereVisibile);
        if (indiceArticolo < startRowIndex || indiceArticolo >= startRowIndex + maximumRows)
        {
            //Se è fuori, aggiorno le proprietà della pagina
            PagerID.SetPageProperties(indiceArticolo - (indiceArticolo % maximumRows), maximumRows, true);
        }
    }

    return lista.Skip(startRowIndex).Take(maximumRows);
}


ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Bella pensata:)
Funziona...
Ottengo un errore di viewatate quando filtro ma penso che posso cavarmela da solo

Ho imparato una nuova cosa
Grazie mille
A presto

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.