2009-08-27 8 views
7

Mam gridview asp.net, który jest pierwotnie związany z formantem sqldatasource, ale gdy użytkownik naciśnie przycisk zewnętrzny, zamiast tego pobiera zawartość z datatable, a nie Kontrola SQLdatasource. W związku z tym musiałem napisać kod w zdarzeniu PageIndexChanging widoku siatki, aby umożliwić stronicowanie. Mój kod wygląda następująco:Paging nie działa w asp.net gridview wewnątrz 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() 

To działało pięknie aż dodałem panelu aktualizacji AJAX więc cała strona nie byłoby ogłaszanie każdym razem Paged i stronicowania przestał działać. Debugowałem go i odkryłem, że faktycznie wywołuje to wydarzenie PageIndexChanging, ale nic się nie dzieje.

Przeszukałem internet i znalazłem kilka osób z tym samym problemem, ale ich rozwiązania nie sprawdziły się u mnie. Był jeden na tej stronie, której problem został rozwiązany brzmienie:

W przypadku PageIndexchanging, gdzie można powiązać dane do siatki, upewnij się, dane są ponownie pobierane z DB

I don” wiesz co to znaczy; moje dane były związane, jak wykazano powyżej. Mam "włącz stronicowanie" ustawione na true, a EnableSortingAndPagingCallbacks na false.

Byłbym bardzo wdzięczny, gdyby ktoś mógł mi pomóc. Załączam mój znacznik dla updatepanel poniżej. Dziękuję bardzo!

<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

Nie widzę nawet Twojego kodu źródła danych. –

+0

Oto część z nich (to długa sub - Nie mogę umieścić to wszystko w) searchConnection.Open() searchCommand = Nowa SqlCommand (searchString, searchConnection) searchAdapter = Nowa SqlDataAdapter (searchCommand) searchDatatable = Nowa DataTable searchAdapter.Fill (searchDatatable) Jeśli searchDatatable.Rows.Count> 0 Then gvEvents.DataSourceID = Nothing gvEvents.DataSource = searchDatatable gvEvents.DataBind() –

Odpowiedz

2

W przypadku PageIndexchanging, gdzie powiązać dane do siatki, upewnij się, dane są ponownie pobierane z DB nie wiem, co to znaczy; moje dane były związane, jak wykazano powyżej.

Oznacza to, że należy ponownie pobrać dane w kodzie za stroną. Używasz źródła danych SQL na stronie projektu/html, więc musisz je usunąć i użyć połączenia SQL, polecenia SQL itp., Aby pobrać dane, a następnie ustawić je jako źródło danych kontrolki.

Coś jak poniżej:

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

Kod powinien wyglądać mniej więcej tak

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

przykro mi, gdybym nie zrobił wyjaśnij się. Używam połączeń SQL i poleceń, aby pobrać moje dane - moje źródło danych dla widoku grid jest datatable. Mój problem polega na tym, że mój niestandardowy kod stronicowania działał poprawnie, dopóki nie umieściłem go w panelu aktualizacji, a teraz tak nie jest. Dlaczego nagle musiałbym ponownie pobrać moje dane z bazy danych? –

+0

Ponieważ dane z bazy danych nie są trwale przechowywane na gridview/stronie. Po odświeżeniu strony w panelu aktualizacji należy ponownie pobrać rekordy, aby można było załadować je do widoku siatki, ponieważ w tym momencie nie ma danych w źródle danych. –

+0

Zaktualizowałam mój pierwotny wpis, aby dołączyć przykładowy kod –

1

kontroli, które nie są zgodne z UpdatePanel Kontroluje

Poniższe kontrole są ASP.NET nie jest kompatybilny z aktualizacjami częściowej strony i dlatego nie są obsługiwane wewnątrz formantu UpdatePanel:

GridView i DetailsView kontrole gdy ich EnableSortingAndPagingCallbacks właściwość jest ustawiona na wartość true. Wartością domyślną jest fałsz.

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

1

Wystarczy zaktualizować AJAX panelu po DataBind().

zakładać id Panelu Update jest 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

Dla każdego, kto natyka się na ten temat, ja spotkałem go to AM i ten post był mylący (conajmniej do mojego scenariusza). Dla mnie po prostu musiałem dodać wywołanie PageIndexChanging Event jako wyzwalacz dla mojego datagridu dla wyzwalaczy aktualizacji i to rozwiązało mój problem.