Frage

Ich habe einen ausgelagerten ASP.NET Listview. Die gezeigten Daten wird gefiltert, die durch eine Form gesteuert werden kann. Wenn die Filterform ändert, habe ich eine neue Abfrage zu erstellen, und einen DataBind auszuführen.

Das Problem ist jedoch, wenn ich auf die nächste Seite gehen, und einen Filter, die Listview zeigt „Es wurden keine Daten zurückgegeben“. Das ist nicht komisch, denn nach den Filter angewandt wird, gibt es nur eine Seite von Daten ist.

Also, was ich tun möchte, ist den Pager zurückgesetzt. Ist das eine richtige Lösung für das Problem? Und wie kann ich das tun?

War es hilfreich?

Lösung

Ich benutze diesen Hack in meinem Last-Handler. Es wird nicht den Pager zurückgesetzt, wenn die Anzahl der Ergebnispositionen ist die gleiche, aber die Seite Index wird nach wie vor gültig, so dass ich mit, dass für die jetzt leben können.

if (IsPostBack)
{
    DataPager pgr = MyListView.FindControl("MyPager") as DataPager;
    if (pgr != null && MyListView.Items.Count != pgr.TotalRowCount)
    {
        pgr.SetPageProperties(0, pgr.MaximumRows, false);
    }
}

Andere Tipps

Wenn Sie wissen, wie es zu tun, ist es einfach. Ich habe den Code unten an meine onchange-Ereignisse meines Filter:

DataPager pager = ListViewReference.FindControl("DataPagerId") as DataPager;
if (pager != null)
{
    pager.SetPageProperties(0, pager.PageSize, true);
}

eine der beiden oben genannten Lösungen sind richtig, da sie sowohl Aufruf der gleichen Methode. Ich denke nur, sollte darauf hingewiesen werden, dass Sie yourPagerElement.SetPageProperties(...) nennen sollten, wo immer Sie Ihre Datenquelle (dh eine Liste oder ein Array, etc.) wollen aktualisiert werden. Zum Beispiel, nachdem er einige Filtration oder etwas anwenden, das die Liste Größe stark verändert.

Sie können Probleme auftreten, wenn Ihre Listenansicht automatisch begrenzt ist (das heißt Object)

Load-Ereignishandler nicht funktioniert, weil Sie noch nicht den neuen DataPager.TotalRowPage Wert haben, aber Sie können Page_PreRenderComplete handhaben, wie folgt aus:

    protected void Page_PreRenderComplete(object sender, EventArgs e)
    {
        // PreRenderComplete occurs just after databindings page events
        // And saves to viewstate

        // Trick on search to avoid "No data" on results when old page is greater than actual row count                
        if (DataPager1.StartRowIndex  > DataPager1.TotalRowCount )
            DataPager1.SetPageProperties(0, DataPager1.MaximumRows, true);
    }

Dies hinterlässt immer Listview auf einer Seite mit Daten. Wenn Seite größer ist als TotalRow, Schalter zur ersten Seite.

Weitere Informationen: Ich verwende efective Paging und die Rücksendung der Daten nur angezeigt werden, so dass ich neu binden müssen de-Datenquelle (letzte Parameter (true))

Nachteile:. Doppel databind wenn StartRowIndex größer als TotalRowCount

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top