7

ページングされたASP.NETListViewがあります。表示されるデータはフィルタリングされており、フォームで制御できます。フィルタフォームが変更されたら、新しいクエリを作成し、DataBindを実行します。

ただし、次のページに移動してフィルターを設定すると、ListViewに「データが返されませんでした」と表示されるという問題があります。フィルタが適用された後、データは1ページしかないため、これは奇妙なことではありません。

だから私がしたいのはページャーをリセットすることです。それは問題の正しい解決策ですか?そして、どうすればそれを行うことができますか?

4

4 に答える 4

10

このハックをロードハンドラーで使用します。結果アイテムの数が同じである場合、ページャーはリセットされませんが、ページインデックスは引き続き有効であるため、今のところそれを使用できます。

if (IsPostBack)
{
    DataPager pgr = MyListView.FindControl("MyPager") as DataPager;
    if (pgr != null && MyListView.Items.Count != pgr.TotalRowCount)
    {
        pgr.SetPageProperties(0, pgr.MaximumRows, false);
    }
}
于 2010-06-04T08:55:36.337 に答える
6

あなたがそれを行う方法を知っているなら、それは簡単です。onchangeフィルタのイベントに以下のコードを追加しました。

DataPager pager = ListViewReference.FindControl("DataPagerId") as DataPager;
if (pager != null)
{
    pager.SetPageProperties(0, pager.PageSize, true);
}
于 2010-05-18T07:46:04.093 に答える
1

上記のソリューションはどちらも同じメソッドを呼び出すため、どちらも正しいです。yourPagerElement.SetPageProperties(...)データソース(リストや配列など)を更新したい場所ならどこでも呼び出す必要があることを指摘しておく必要があると思います。たとえば、フィルタリングなどを適用した後、リストのサイズが大幅に変更されます。

于 2014-02-04T20:15:44.420 に答える
0

リストビューが自動的に制限される場合(つまり、ObjectDataSource)、問題が発生する可能性があります。

新しいDataPager.TotalRowPage値がまだないため、ロードイベントハンドラーは機能しませんが、次のようにPage_PreRenderCompleteを処理できます。

    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);
    }

これにより、ListViewは常にデータのあるページに残ります。ページがTotalRowより大きい場合は、最初のページに切り替えます。

注:有効なページングを使用しており、表示するデータのみを返すため、データソースを再バインドする必要があります(最後のパラメーター(true))

短所:StartRowIndexがTotalRowCountより大きい場合、データバインドが2倍になります。

于 2014-04-23T15:48:11.197 に答える