2009-08-27 6 views
7

Ho un gridview di asp.net che è originariamente associato a un controllo di sqldatasource, ma quando l'utente preme un pulsante esterno, ottiene invece il contenuto di un datatable piuttosto che un Controllo SQLdatasource. Ho quindi dovuto scrivere codice nell'evento PageIndexChanging di gridview per consentire il paging. Il mio codice è il seguente:Il paging non funziona in asp.net gridview all'interno del pannello di aggiornamento AJAX

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

questo ha funzionato splendidamente fino a quando ho aggiunto un pannello di aggiornamento AJAX così l'intera pagina non postback ogni volta che paging, e il paging smesso di funzionare. Ho eseguito il debug e ho scoperto che in realtà sta chiamando l'evento PageIndexChanging, ma non succede nulla.

Ho cercato sul Web e ho trovato alcune persone con lo stesso problema, ma le loro soluzioni non funzionavano per me. C'era uno su questo sito il cui problema è stato risolto dal seguente:

Nel caso in PageIndexchanging, in cui si associano i dati alla rete, assicurarsi che i dati è ancora una volta prelevato dal DB

I don' so cosa significa; i miei dati erano vincolati come dimostrato sopra. Ho "abilita il paging" impostato su true e EnableSortingAndPagingCallbacks impostato su false.

Sarei davvero grato se qualcuno mi può aiutare. Sto includendo il mio markup per il pannello di aggiornamento qui sotto. Grazie mille!

<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

Non riesco nemmeno a vedere il codice dell'origine dati. –

+0

Ecco parte di essa (è una lunga sub - non riesco a mettere tutto in) searchConnection.Open() searchCommand = nuovo SqlCommand (searchString, searchConnection) searchAdapter = nuovo SqlDataAdapter (searchCommand) searchDatatable = Nuovo DataTable searchAdapter.Fill (searchDatatable) Se searchDatatable.Rows.Count> 0 Then gvEvents.DataSourceID = Nothing gvEvents.DataSource = searchDatatable gvEvents.DataBind() –

risposta

2

Nel caso in PageIndexchanging, in cui si associano i dati alla rete, assicurarsi che i dati è ancora una volta prelevato dal DB Non so che cosa significa; i miei dati erano vincolati come dimostrato sopra.

Significa che è necessario recuperare nuovamente i dati nel codice dietro la pagina. Si sta utilizzando una fonte SQLdatasource nella pagina design/html, quindi è necessario rimuoverlo e utilizzare una connessione SQL, SQL Command, ecc. Per recuperare i dati e impostarli come origine dati del controllo.

Qualcosa come di seguito:

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

Il codice dovrebbe essere simile a questo

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

mi dispiace se non ho fatto rendi chiaro. Sto usando connessioni e comandi SQL per recuperare i miei dati - la mia origine dati per il gridview è databile. Il mio problema è che il mio codice di paging personalizzato funzionava bene fino a quando non lo metto in un pannello di aggiornamento, e ora non funziona. Perché dovrei improvvisamente recuperare i miei dati dal database? –

+0

Poiché i dati del tuo db non vengono memorizzati in modo permanente nella griglia/pagina. Quando si effettua un postback all'interno di un pannello di aggiornamento, è necessario recuperare nuovamente i record in modo da poterli caricare su gridview perché in quel momento non ci sono dati nell'origine dati. –

+0

Aggiornato il mio post originale per includere il codice di esempio –

1

I controlli che non sono compatibili con UpdatePanel Controlli

i seguenti controlli ASP.NET sono non è compatibile con gli aggiornamenti di pagine parziali e pertanto non è supportato all'interno di un controllo UpdatePanel:

GridView e DetailsView controlli quando i loro EnableSortingAndPagingCallbacks proprietà è impostata su true. Il valore predefinito è falso.

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

1

solo aggiornare il Pannello di AJAX dopo DataBind().

assumere id del pannello di aggiornamento è 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

Per chi si imbatte in questo problema, ho incontrato in questo AM e questo post era ingannevole (almeno per il mio scenario). Per quanto mi riguarda, ho semplicemente dovuto aggiungere un evento PageIndexChanging come trigger per il mio datagrid per il trigger updatepanel, e ha risolto il mio problema.