質問

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

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

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

役に立ちましたか?

解決

このハックをロードハンドラーに使用します。結果項目の数が同じ場合、ポケットベルをリセットしませんが、ページインデックスはまだ有効であるため、今のところ一緒に暮らすことができます。

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

他のヒント

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

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

上記のソリューションのいずれかは、両方とも同じ方法を呼び出すため、正しいです。私はあなたが電話するべきだと指摘するべきだと思います yourPagerElement.SetPageProperties(...) DataSource(つまり、リストや配列など)を更新する場所をどこでも更新します。たとえば、ろ過またはリストサイズを大きく変更するものを適用した後。

ListViewが自動的に制限されている場合、問題が発生する可能性があります(つまり、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よりも大きい場合は、最初のページに切り替えます。

注:私はeffectiveページングを使用しており、表示されるデータのみを返しているので、de dataSource(最後のパラメーター(true))を再bindする必要があります

短所:startrowindexがtotolrowcountよりも大きい場合は、double databind。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top