ListViewを強制的にプログラムで表示する方法
質問
ページング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。