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