4 Stimmen

So verwenden Sie DataPager mit Database Paged

Ich verwende ListView/DataPager.

Aus Leistungsgründen rufe ich meine Ergebnisse in der Datenbank auf, indem ich ROW_NUMBER(SQl2005) verwende.

Bei meinem C#-Code kommt nur eine Seite nach der anderen. Wie kann ich sagen, DataPager, dass ich mehr Zeilen, die wirklich in meiner Liste sind haben?

5voto

Felipe Pessoto Punkte 6677

Ich habe eine Klasse erstellt, die gefälschte default(T)-Objekte gerenate. Funktionierte gut:

public class PagedList<T> : IEnumerable<T>, ICollection
{
    private IEnumerable<T> ActualPage { get; set; }
    private int Total { get; set; }
    private int StartIndex { get; set; }

    public PagedList(int total, int startIndex, IEnumerable<T> actualPage)
    {
        ActualPage = actualPage;
        Total = total;
        StartIndex = startIndex;
    }

    public IEnumerator<T> GetEnumerator()
    {
        bool passouPagina = false;
        for (int i = 0; i < Total; i++)
        {
            if (i < StartIndex || passouPagina)
            {
                yield return default(T);
            }
            else
            {
                passouPagina = true;
                foreach (T itempagina in ActualPage)
                {
                    i++;
                    yield return itempagina;
                }
            }
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    #region Implementation of ICollection

    void ICollection.CopyTo(Array array, int index)
    {
        throw new NotSupportedException();
    }

    public int Count
    {
        get { return Total; }
    }

    object ICollection.SyncRoot
    {
        get { throw new NotSupportedException(); }
    }

    bool ICollection.IsSynchronized
    {
        get { throw new NotSupportedException(); }
    }

    #endregion
}

Beispiel für die Verwendung:

int totalRows = DB.GetTotalPeople();
int rowIndex = (currentPage-1)*pageSize;
List<Person> peoplePage = DB.GetPeopleAtPage(currentPage);

listview.DataSource = new PagedList(totalRows, rowIndex, peoplePage)
listView.DataBind();

0voto

Stanislas Punkte 1656

Offensichtlich kann ich die obige Lösung, die von Fujiy zur Verfügung gestellt wurde, nicht kommentieren, aber ich habe den folgenden Fehler entdeckt:

Innerhalb GetEnumerator() wird die Inkrementierung im else-Zweig immer dazu führen, dass die Sammlung ein Standardelement überspringt, es sei denn, Sie befinden sich auf der letzten Seite der PagedList.

Ein Beispiel: Sie möchten eine seitenweise Liste mit 5 Elementen erstellen, mit Startindex 3 und 1 Element pro Seite. Dies könnte den else-Zweig für Element 2 eingeben. Es würde i auf 3 inkrementieren und dann zurück in den for-Header gehen, wo es auf 4 inkrementieren würde, ohne ein Standardelement für i == 3 zu erstellen.

  • i == 1 -> Standard
  • i == 2 -> Standard
  • i == 3 -> Tatsächliches Element
  • i == 4 -> Übersprungen
  • i == 5 -> Standard

Eine einfache Lösung wäre, entweder 3 for-Schleifen zu verwenden (eine für Standardwerte vor der ActualPage, eine für die ActualPage und eine für Elemente nach der ActualPage). Oder man fügt ein i-- nach der For-Schleife innerhalb des Else-Zweigs ein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X