문제

내가 읽은 모든 것에서 ListView 컨트롤에 페이징을 추가하는 것은 단순해야하지만 나에게는 효과가 없습니다. ListView 및 DataPager 컨트롤을 양식에 추가하고 함께 배선 한 후에는 매우 이상한 동작을 받고 있습니다. DataPager는 ListView의 페이지 크기를 올바르게 제한하지만 페이징 버튼을 클릭하면 ListView에 전혀 영향을 미치지 않습니다. 페이징 버튼은 마지막 페이지로 이동할 때 마지막 버튼이 비활성화되어 있기 때문에 작업을하고 있다고 생각하는 것 같습니다. 그러나 ListView는 변경되지 않습니다. 또한 DataPager를 두 번 클릭하여 무엇이든 할 수 있도록하십시오. 즉, 마지막으로 클릭하면 아무것도하지 않지만 두 번째로 클릭하면 마지막 페이지가 선택된 것처럼 데이터 게이거가 반응하게됩니다.

내가 생각할 수있는 유일한 것은 LINQDATASOURCE 컨트롤 등을 사용하지 않고 런타임 (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
도움이 되었습니까?

해결책

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는 첫 페이지로 돌아가지 만 표시된 데이터는 마지막 페이지입니다.

다른 팁

OnPrerender 이벤트에서 다시 데이터를 데이터베인트해야합니다.

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

--업데이트

ASP.NET AJAX로 몇 가지 목록보기에서 작업 한 후 위의 것보다 더 의미가있는 솔루션을 보았습니다. 일반적으로 페이지로드 방법 또는 버튼 클릭 이벤트 핸들러에서 데이터 바인드리스 뷰를 제공하며 게시되면 문제에 설명 된대로 데이터 바인딩이 손실됩니다. 따라서 목록보기의 페이지 속성이 변경된 이벤트 핸들러에서 데이터 바인드를 다시 바인드해야합니다.

ListView_PagePropertiesChanged(object sender, EventArgs e)
{
ListView.DataSource=someDatasource;
ListView.DataBind()
}

하나 더 솔루션, 단순하고 데이터베이스에서 "쿼리 스트링"에서 "id"를 얻으려면 이제 [QueryStringfield = "id"]와 같이 호출기 제어 속성으로 설정하십시오.

<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" ].

페이지로드가 아닌 DataPager의 사전 렌더 이벤트에서 ListView를 바인딩하십시오. 참조하십시오 여기에서 솔루션

또한 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);
        //}
    }
}
<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 ">

이 시도:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    ListView1.DataSource = productList;
    ListView1.DataBind();
    DataPager1.DataBind();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top