Pregunta

De todo lo que he leído, parecía que agregar paginación a un control ListView debería ser muy simple, pero no me funciona. Después de agregar los controles ListView y DataPager al formulario y conectarlos, obtengo un comportamiento muy extraño. El DataPager limita correctamente el tamaño de página de ListView, pero hacer clic en los botones de paginación no afecta en absoluto a ListView. Los botones de paginación parecen pensar que están haciendo su trabajo, ya que el último botón está deshabilitado cuando se accede a la última página, etc., pero el ListView nunca cambia. Además, se necesitan dos clics en el DataPager para que haga algo, es decir, hacer clic en Última vez no hace nada, pero hacer clic en él por segunda vez hace que el DataPager reaccione como si la última página estuviera ahora seleccionada.

Lo único en lo que puedo pensar es que estoy vinculando el DataSource en tiempo de ejecución (a un objeto LINQ), sin usar un control LinqDataSource ni nada. ¿Alguien ha visto este comportamiento? ¿Estoy haciendo algo mal? Aquí está el código que estoy usando:

<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>

En el código subyacente:

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
¿Fue útil?

Solución

Eche un vistazo a 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;
}

Sin embargo, tengo un problema para ver la última página. El DataPager salta a la primera página, pero los datos que se muestran son la última página.

Otros consejos

Necesitamos volver a vincular la vista de la lista de datos en el evento OnPreRender.

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

--Actualizar

Después de trabajar en algunas vistas de lista con asp.net ajax, vi una solución que tiene más sentido que la anterior. Normalmente, el enlace de datos de Listview en el método de carga de la página o un controlador de eventos de clic de botón y, cuando se devuelve la respuesta, el enlace de datos se perdería como se describe anteriormente en el problema. Por lo tanto, debemos volver a enlazar los datos en las propiedades de la página. El controlador de eventos cambió para la vista de lista.

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

Una solución más , es simple, solo obtenga '' ID '' en " QUERY-STRING " desde la base de datos, ahora configúrelo en la propiedad de control del buscapersonas como [QueryStringField = " ID " ] me gusta:

<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>

Nota: si no está activado, configure también [PagedControlID = " ListView_Name " ] .

Enlace la vista de lista en el evento de renderizado previo del datapager y no en la carga de la página. Consulte la solución aquí

Además, si se cambia la fuente de datos de su ListView (por ejemplo, si se muestran datos basados ??en parámetros de búsqueda), no olvide restablecer el buscapersonas cada vez que se actualice la fuente de datos. Con un ListView, esto no es tan sencillo como algunos otros controles enlazados a datos (por ejemplo, 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 ">

prueba esto:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    ListView1.DataSource = productList;
    ListView1.DataBind();
    DataPager1.DataBind();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top