20

私が読んだすべてから、ListView コントロールにページングを追加するのは非常に簡単であるように見えましたが、それは私にとってはうまくいきません。ListView コントロールと DataPager コントロールをフォームに追加してそれらを接続した後、非常に奇妙な動作が発生します。DataPager は ListView のページ サイズを正しく制限しますが、ページング ボタンをクリックしても ListView にはまったく影響しません。ページングボタンは、最後のページに移動すると最後のボタンが無効になるなど、仕事をしていると思っているようですが、ListViewは決して変更されません。また、DataPager で何かを実行するには 2 回クリックする必要があります。つまり、[Last] を 1 回クリックしても何も起こりませんが、2 回目にクリックすると、DataPager は最後のページが選択されたかのように反応します。

私が考えることができる唯一のことは、LinqDataSource コントロールなどを使用せずに、実行時に DataSource を (LINQ オブジェクトに) バインドしていることです。誰もこの行動を見たことがありますか?私は何か間違ったことをしていますか?私が使用しているコードは次のとおりです。

<asp:DataPager ID="HistoryDataPager" runat="server" PagedControlID="HistoryListView" PageSize="10">
    <Fields>
        <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="true" ShowLastPageButton="true" />
    </Fields>
</asp:DataPager>

<asp:ListView ID="HistoryListView" runat="server">
    ...
</asp:ListView>

コード ビハインドで:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        HistoryListView.DataSource = From x in myContext.myTables ...
        DataBind()
    End If

End Sub
4

7 に答える 7

30

OnPreRender イベントでリスト ビューを再度データバインドする必要があります。

protected override void OnPreRender(EventArgs e)
        {
            ListView1.DataBind();
            base.OnPreRender(e);
        }

- アップデート

asp.net ajax を使用していくつかのリスト ビューに取り組んだ後、上記のソリューションよりも理にかなったソリューションを見つけました。通常は、ページ ロード メソッドまたはボタン クリック イベント ハンドラで Listview をデータ バインドします。ポスト バックがあると、上記の問題で説明したように、データ バインディングが失われます。そのため、リスト ビューのイベント ハンドラーを変更したページ プロパティで再度データ バインドする必要があります。

ListView_PagePropertiesChanged(object sender, EventArgs e)
{
ListView.DataSource=someDatasource;
ListView.DataBind()
}
于 2008-12-29T23:43:34.763 に答える
4

もう1つの解決策、その単純な、データベースから「QUERY-STRING」の「ID」を取得し、次のように[QueryStringField="ID"]としてPagerControlプロパティに設定します。

<asp:DataPager ID="DataPagerProducts" runat="server" QueryStringField="ID" PageSize="3">
                            <Fields>
                                <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
                                <asp:NumericPagerField />
                                <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
                            </Fields>
                        </asp:DataPager>

注:目覚めない場合は、も設定します[ PagedControlID="ListView_Name" ]

于 2012-11-12T05:35:22.403 に答える
1

また、ListViewのデータソースが変更された場合(たとえば、検索パラメーターに基づいてデータを表示する場合)、データソースが更新されるたびにページャーをリセットすることを忘れないでください。ListViewの場合、これは他のデータバインドコントロール(GridViewなど)ほど簡単ではありません。

private void ResetListViewPager()
{
    DataPager pager = (DataPager)ListViewMembers.FindControl("DataPager1");
    if (pager != null)
    {
        CommandEventArgs commandEventArgs = new CommandEventArgs(DataControlCommands.FirstPageCommandArgument, "");
        // MAKE SURE THE INDEX IN THE NEXT LINE CORRESPONDS TO THE CORRECT FIELD IN YOUR PAGER
        NextPreviousPagerField nextPreviousPagerField = pager.Fields[0] as NextPreviousPagerField;
        if (nextPreviousPagerField != null)
        {
            nextPreviousPagerField.HandleEvent(commandEventArgs);
        }

        // THIS COMMENTED-OUT SECTION IS HOW IT WOULD BE DONE IF USING A NUMERIC PAGER RATHER THAN A NEXT/PREVIOUS PAGER
        //commandEventArgs = new CommandEventArgs("0", "");
        //NumericPagerField numericPagerField = pager.Fields[0] as NumericPagerField;
        //if (numericPagerField != null)
        //{
        //    numericPagerField.HandleEvent(commandEventArgs);
        //}
    }
}
于 2010-01-11T13:01:02.440 に答える
1

ページの読み込み時ではなく、datapager の pre render イベントでリストビューをバインドします。解決策はこちらをご覧ください

于 2011-12-09T16:49:43.943 に答える
1

ListViewPagedDataSource を見てください。

private ListViewPagedDataSource GetProductsAsPagedDataSource(DataView dv)
{
// Limit the results through a PagedDataSource
ListViewPagedDataSource pagedData = new ListViewPagedDataSource();
pagedData.DataSource = dv;
pagedData.MaximumRows = dv.Table.Rows.Count;
pagedData.TotalRowCount = dpTop.PageSize;

if (Request.QueryString[dpTop.QueryStringField] != null)
  pagedData.StartRowIndex = (Convert.ToInt32(Request.QueryString[dpTop.QueryStringField]) - 1) * dpTop.PageSize;
else
  pagedData.StartRowIndex = 0;

return pagedData;
}

ただし、最後のページを表示するのに問題があります。DataPager は最初のページに戻りますが、表示されるデータは最後のページです。

于 2008-10-25T21:26:00.730 に答える
0
<asp:ListView ID="ListView1" runat="server" DataSourceID="sdsImages">
    <ItemTemplate>
        <div class="photo sample12">
                <asp:Image ID="img_Galerie" runat="server" ImageUrl='<%# "~/imageHandler.ashx?ID=" + Eval("ImageID") %>' />
        </div>
    </ItemTemplate>
</asp:ListView>
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="3" QueryStringField="ImageID">
    <Fields>
        <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
        <asp:NumericPagerField />
        <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
    </Fields>
</asp:DataPager>
<asp:SqlDataSource ID="sdsImages" runat="server"
    ConnectionString="<%$ ConnectionStrings:DBCS %>"
    SelectCommand="SELECT ImageID FROM  Images ">

于 2013-03-15T19:35:47.813 に答える