25

次の例を見てみましょう...のデータをページングするために使用されるListViewと を含むページ:DataPagerListView

コードビハインド:

protected void Page_Load(object sender, EventArgs e)
{
    MyList.DataSource = GetSomeList();
    MyList.DataBind();
}

ソース:

<asp:ListView ID="MyList" runat="server">
    <% //LayoutTemplate and ItemTemplate removed for the example %>
</asp:ListView>

<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10">
    <Fields>
        <asp:NumericPagerField  />
    </Fields>
</asp:DataPager>

の問題DataPagerは、それがバインディングと常に後れを取っていることです。

たとえば、ページが読み込まれると、ページ番号 1 になります。その後、ページ 3 をクリックすると、ポストバック後もページ 1 にとどまります。次に、5 ページをクリックすると、ポストバック後に 3 ページに表示されます...その後、6 ページをクリックすると、5 ページに表示されます...というように続きます。

ページングが期待どおりに機能しないのはなぜですか?

4

6 に答える 6

34

解決

Page_Loadこの問題は、イベントで発生するバインディングが原因です。

これが期待どおりに機能するためには、バインディングはDataPagerOnPreRenderではなくeventPage_Loadで発生する必要があります。

ソース:

<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
    OnPreRender="ListPager_PreRender">

<Fields>
        <asp:NumericPagerField  />
    </Fields>
</asp:DataPager>

コードビハインド:

protected void Page_Load(object sender, EventArgs e)
{
    //Binding code moved from Page_Load
    //to the ListView's PreRender event
}

protected void ListPager_PreRender(object sender, EventArgs e)
{
    MyList.DataSource = GetSomeList();
    MyList.DataBind();    
}
于 2009-07-15T09:48:34.077 に答える
6

私はこれと同じ問題に遭遇しましたが、datapager prerender で毎回バインドすることは選択肢ではありませんでした。代わりに、ページングが発生したときにのみバインドすることで、ほぼ同じことを達成できました。このソリューションは、Andreas による prerender ソリューションの代替として使用できます。以下は私のために働いた:

ListView の PagePropertiesChanged イベントにアタッチすることで、データ ページャーの事前レンダリングごとにバインドする必要なく、ページングの問題を修正できました。

注:ほとんどのデータ ページャー プロパティはスキン ファイルで設定されているため、マークアップには含まれていません。

マークアップ:

<asp:DataPager ID="ListPager" runat="server" PagedControlID="MyList" />
<asp:ListView ID="MyList" runat="server">
    <% //LayoutTemplate and ItemTemplate removed for the example %>
</asp:ListView>

コードビハインド:

protected void Page_Load(object sender, EventArgs e) {
   MyList.PagePropertiesChanged += new EventHandler(MyList_PagePropertiesChanged);
}

/// <summary>
/// Handles the situation where the page properties have changed.  Rebind the data
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyList_PagePropertiesChanged(object sender, EventArgs e) {
   MyList.DataSource = GetSomeList();
   MyList.DataBind();
}
于 2009-10-01T21:03:41.253 に答える
1

データページャーに OnPreRender イベントがありません!

于 2010-11-08T02:21:59.757 に答える
0

または、 ListView のみを含むユーザー コントロールを構築する場合はPage_Load、Page_Load メソッドは他に何も実行していないため、ページャー イベント ハンドラーをメソッドにポイントするだけで済みます。

<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
OnPreRender="Page_Load">
于 2015-03-16T12:34:40.440 に答える
0

以下は私にとって完璧な作品です。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles   Me.Load
Dim ds As DataSet
ds = SQLHELPER.ExecuteDataSet(CommandType.StoredProcedure, "sp_Locations")
rs.EnableViewState = False
rs.DataSource = ds
rs.DataBind()
End Sub

Protected Sub rs_PagePropertiesChanging(ByVal sender As Object, ByVal e As    PagePropertiesChangingEventArgs)
'set current page startindex, max rows and rebind to false
Pager.SetPageProperties(e.StartRowIndex, e.MaximumRows, False)
'rebind List View
rs.DataBind()
End Sub

<asp:ListView ID="rs" runat="server" onpagepropertieschanging="rs_PagePropertiesChanging">
于 2014-04-13T21:15:51.277 に答える
-2

ページの読み込みでは、if(!IsPostBack){}の間にコードを配置する必要があります

それはあなたの問題を解決します。

于 2011-07-04T15:50:42.067 に答える