2011-12-13 12 views
14

Mam GridView, który wygląda mniej więcej tak:zdarzenie GridView RowCommand nie wypalanie

<asp:GridView 
    ID="GridView1" 
    AllowPaging="true" 
    OnRowCommand="RowCommand" 
    OnPageIndexChanging="gridView_PageIndexChanging" 
    Runat="server"> 
    <Columns> 
     ... 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Button ID="Button1" ButtonType="Button" CommandName="ItemExport" CommandArgument='<%# Eval("EXPORT") %>' 
        Text="Export" runat="server" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     ... 
    </Columns> 
</asp:GridView> 

Oto RowCommand:

protected void RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "ItemExport") 
    { 
     // etc. 
    } 
} 

Kliknięcie przycisku nie uruchamia zdarzenie RowCommand w ogóle. Jednak RowCommand jest uruchamiany po kliknięciu indeksu strony na pageru GridView.

+1

Kiedy łączysz sieć z DataSource, tylko 'if (! Postback)' ?! –

+0

Tak, problem polegał na tym, że powiązanie nie zostało zapakowane w instrukcję 'if (! IsPostBack)'. –

Odpowiedz

43

Musisz nie związać swoją siatkę na postbacks w Page_Load, tylko wtedy, gdy coś się zmieniło, które powoduje, że siatka przeładować dane (f.e. Sortowanie, stronicowania) i tylko w odpowiednich Event-ładowarki.

Inny możliwy powód: Czy gdzieś wyłączyłeś ViewState?

+6

Nie mogę uwierzyć, że to mnie prześladowało przez wiele godzin ... po prostu siedzę tutaj wpatrując się pusto w jakiś nie działający kod ASP.NET ... wszystko dlatego, że ustawiłem EnableViewState = "false": @ – series0ne

+1

Kiedy wiążę GridView, jeśli (!IsPostBack), pager nie działa :( –

+1

@MazdakShojaie Musisz dodać obsługę zdarzeń dla zdarzenia GridView.PageIndexChanged i ponownie powiązać w tym module obsługi. Sprawdź ten artykuł MSDN http://msdn.microsoft.com/en-us /library/system.web.ui.webcontrols.gridview.pageindexchanged(vsvs.110).aspx – Zack

4

Po prostu miałem kolegę, który napotkał ten sam problem; jego przyczyną był atrybut onrowcommand=, który nie został ustawiony w elemencie asp:GridView. Powinno to być ustawione na nazwę programu obsługi, który będzie obsługiwał zdarzenie.

... na wszelki wypadek, gdy ktoś ma ten sam problem!

1

Możesz również sprawdzić HttpContext.Current.Request.Form ["__ EVENTTARGET"] i jeśli kończy się identyfikatorem kontrolki, ponownie powiązać GridView i użyć strony Page.FindControl z celem zdarzenia, aby znaleźć kontrolkę, która wystrzeliła zdarzenie

3

Użyj w etykiecie przycisku znacznika:. Może rozwiązać problem.

2

jeśli kod tak:

protected void Page_Load(object sender, EventArgs e) 
{ 
    BindGrid(dgv); 
    if (!IsPostBack) 
    { 



    } 




} 

umieścić w BindGrid() wewnątrz isposback {} linii

2

Włóż grid.Databind() wewnątrz if (!IsPostBack)

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     grid.DataBind(); 
    } 
} 
0

Mój problem był requiredfieldvalidator

Rozwiązanie do t hat był: wyłączam go po wysłaniu, a następnie ponownie włączam po poleceniu wiersza.

0

Wypróbowałem powyższe odpowiedzi i nadal nie mogłem odzyskać wiadomości. W końcu okazało się, że jest to numer Unique ID. Miałem dwa <ItemTemplate> z przyciskami, które miały te same identyfikatory. (W różnych widokach siatki Mój drugi był w Kontroli użytkownika)

Zmiana numeru <asp:Button ID="" /> na Unikalny identyfikator rozwiązał dla mnie kwestię zwrotu.

Pomyślałem, że opublikuję dla kogoś, kto próbował innych opcji bez powodzenia.

Powiązane problemy