2009-08-27 36 views
7

Tengo un gridView asp.net que está originalmente vinculado a un control sqldatasource, pero cuando el usuario presiona un botón externo, en su lugar obtiene el contenido de una tabla de datos en lugar de una Control de SQLdatasource Por lo tanto, tuve que escribir código en el evento PageIndexChanging de la vista de cuadrícula para permitir la paginación. Mi código es el siguiente:Paginación que no funciona en gridview asp.net dentro de AJAX updatepanel

Protected Sub gvEvents_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles gvEvents.PageIndexChanging 

gvEvents.PageIndex = e.NewPageIndex 

gvEvents.DataBind() 

Esto funcionó muy bien hasta que he añadido un panel de actualización AJAX para que toda la página no sería la devolución de datos cada vez que paginado, y paginación dejado de funcionar. Lo depuré y descubrí que en realidad está llamando al evento PageIndexChanging, pero nada está sucediendo.

Realicé búsquedas en la Web y encontré algunas personas con el mismo problema, pero sus soluciones no me funcionaron. Había uno en este sitio cuyo problema fue resuelto por el siguiente texto:

En caso PageIndexchanging, donde enlazar datos a la red, asegúrese de que, los datos son de nuevo tomaron de la base de datos

I don' Sé lo que eso significa. mis datos estaban siendo vinculados como se demostró anteriormente. Tengo "enable paging" establecido en true y EnableSortingAndPagingCallbacks establecido en falso.

Realmente agradecería si alguien me puede ayudar. Estoy incluyendo mi marcado para el panel de actualización a continuación. Muchas gracias!

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional"> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="ibtnSearch" />   
     </Triggers> 

     <ContentTemplate> 

      <asp:GridView ID="gvEvents" runat="server" DataKeyNames = "intID" 
       AutoGenerateColumns="False" AllowPaging="True" GridLines="None" CellPadding="10" 
       ForeColor="#333333" PageSize="6" DataSourceID="defaultDS" > 
       <RowStyle BackColor="#FFFBD6" ForeColor="#333333" /> 

       <Columns> 
        <asp:TemplateField HeaderText="Date"> 
         <ItemTemplate> 
         <!-- put code block inside label? To set the formatter to include year if 
         it's next year? --> 
         <asp:Label ID="Label1" runat="server" 
          Text = '<%# RepeatingMethods.DetermineOngoing(CType(Eval("dtmEventStartDate"), DateTime) , CType(Eval("dtmEventEndDate"), DateTime))%>'> </asp:Label> 

        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <ItemTemplate> 
        <asp:Label ID="Label4" runat="server" Text='<%# Eval("chvAgeRange") %>'> </asp:Label> <br /> 
        <asp:Label ID="Label3" runat="server" Text= '<%# Eval("chvState") %>'> </asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:HyperLinkField DataNavigateUrlFields="intId" 
        DataNavigateUrlFormatString="EventDetail.aspx?intId={0}" 
        DataTextField="chvEventName" /> 

        <asp:BoundField DataField="chvBriefDescription" HeaderText="Description" 
         SortExpression="chvBriefDescription" /> 


      </Columns> 
        <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
        <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" /> 
        <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" /> 
        <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
        <AlternatingRowStyle BackColor="White" /> 


<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White"></FooterStyle> 

<PagerStyle HorizontalAlign="Center" BackColor="#FFCC66" ForeColor="#333333"></PagerStyle> 

<SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy"></SelectedRowStyle> 

<HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White"></HeaderStyle> 

<AlternatingRowStyle BackColor="White"></AlternatingRowStyle> 
    </asp:GridView> 



       <asp:Label ID="lblError" runat="server"></asp:Label> 

    <br /> 
    </ContentTemplate> 
    </asp:UpdatePanel> 
+0

Ni siquiera puedo ver el código de fuente de datos. –

+0

Aquí es parte de ella (que es un largo sub - No puedo poner todo en) searchConnection.Open() searchCommand = New SqlCommand (searchString que, searchConnection) searchAdapter = New SqlDataAdapter (searchCommand) searchDatatable = Nuevo DataTable searchAdapter.Fill (searchDatatable) Si searchDatatable.Rows.Count> 0 Entonces gvEvents.DataSourceID = Nada gvEvents.DataSource = searchDatatable gvEvents.DataBind() –

Respuesta

2

En caso PageIndexchanging, donde se enlaza a la red de datos, asegúrese de que, los datos se obtienen de nuevo el DB No sé lo que eso significa; mis datos estaban siendo vinculados como se demostró anteriormente.

Significa que debe volver a buscar sus datos en el código detrás de la página. Está utilizando un origen de datos SQL en su página de diseño/html, por lo que debe eliminarlo y utilizar una conexión SQL, un comando SQL, etc. para recuperar sus datos y luego configurarlos como fuente de datos de control.

Algo parecido a continuación:

http://www.aspnettutorials.com/tutorials/database/db-grid-aspnet2-vb.aspx

El código debería ser algo como esto

Protected Sub Page_Load(...) 
    gvEvents.PageIndex = 0 
    LoadData();// loads initial data 
end sub 

private sub LoadData() 
'' do your SQL Conn and Command here 
'' set your datasource of gridview here 
end sub 

Protected Sub gvEvents_PageIndexChanging(...) Handles gvEvents.PageIndexChanging 
    gvEvents.PageIndex = e.NewPageIndex 
    LoadData() 
    gvEvents.DataBind() 
end sub 
+0

lo siento si no lo hacía aclararme. Estoy usando conexiones SQL y comandos para recuperar mis datos: mi fuente de datos para gridview es una tabla de datos. Mi problema es que mi código de paginación personalizado funcionó bien hasta que lo puse en un panel de actualización, y ahora no funciona. ¿Por qué de repente tendría que volver a buscar mis datos de la base de datos? –

+0

Porque los datos de su base de datos no se almacenan de manera persistente en su vista/página de cuadrícula. Cuando realiza una devolución de datos dentro de un panel de actualización, necesita buscar los registros nuevamente para poder cargarlos en la vista de cuadrícula porque en ese momento no hay datos en su fuente de datos. –

+0

Actualicé mi publicación original para incluir el código de muestra –

1

Los controles que no son compatibles con UpdatePanel controles

Los siguientes son controles ASP.NET no es compatible con actualizaciones de páginas parciales y, por lo tanto, no se admite dentro de un control UpdatePanel:

GridView y DetailsView controles cuando sus EnableSortingAndPagingCallbacks propiedad se establece en true. El valor predeterminado es falso.

http://www.asp.net/Ajax/Documentation/Live/overview/UpdatePanelOverview.aspx

1

actualizar sólo el Panel AJAX después databind().

asumen Identificación del panel de actualización es AJAXPanel

Protected Sub gvEvents_PageIndexChanging(...) Handles gvEvents.PageIndexChanging    
    gvEvents.PageIndex = e.NewPageIndex 
    LoadData() 
    gvEvents.DataBind() 
    // The below line refreshes the update panel.. 
    AJAXPanel.Update() 
end sub 
2

Para cualquier persona que se topa con este tema, me encontré con que esta mañana y esta entrada es engañosa (al menos para mi escenario). Para mí, simplemente tuve que agregar un evento PageIndexChanging como desencadenante para mi cuadrícula de datos para los disparadores del panel de actualización, y resolvió mi problema.

Cuestiones relacionadas