2011-12-13 39 views
14

Tôi có một GridView mà trông giống như sau:GridView RowCommand sự kiện không bắn

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

Đây là RowCommand:

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

Nhấp vào nút không được bắn sự kiện RowCommand ở tất cả. Tuy nhiên, RowCommand sẽ kích hoạt khi tôi nhấp vào một chỉ mục trang trong máy nhắn tin của GridView.

+1

Khi nào bạn ràng buộc lưới của mình với Nguồn dữ liệu, chỉ 'if (! Postback)' ?! –

+0

Đúng, vấn đề là ràng buộc không được bao bọc trong câu lệnh 'if (! IsPostBack)'. –

Trả lời

43

Bạn phải không phải ràng buộc lưới của bạn trên postbacks trong Page_Load, chỉ khi có điều gì đó làm cho lưới tải lại dữ liệu (f.e. Phân loại, phân trang) và chỉ trong trình xử lý sự kiện thích hợp.

Một lý do khác có thể: Bạn đã vô hiệu hóa ViewState ở đâu đó?

+6

Không thể tin rằng điều này ám ảnh tôi trong nhiều giờ ... chỉ cần ngồi đây nhìn chằm chằm vào một số mã ASP.NET không hoạt động ... tất cả vì tôi đã đặt EnableViewState = "false": @ – series0ne

+1

Khi tôi liên kết GridView trong if (!IsPostBack), máy nhắn tin không hoạt động: ( –

+1

@MazdakShojaie Bạn phải thêm trình xử lý sự kiện cho sự kiện GridView.PageIndexChanged và rebind trong trình xử lý đó. Hãy xem bài viết MSDN này http://msdn.microsoft.com/en-us /library/system.web.ui.webcontrols.gridview.pageindexchanged(v=vs.110).aspx – Zack

4

Tôi vừa có một đồng nghiệp gặp phải vấn đề tương tự; của anh ta là do thuộc tính onrowcommand= không được đặt trong phần tử asp:GridView. Điều này nên được đặt thành tên của trình xử lý sẽ xử lý sự kiện.

... chỉ trong trường hợp ai đó có cùng vấn đề!

1

Bạn cũng có thể kiểm tra HttpContext.Current.Request.Form ["__ EVENTTARGET"] và nếu nó kết thúc bằng ID của điều khiển, hãy rebind GridView và sử dụng Page.FindControl với mục tiêu sự kiện để tìm điều khiển được kích hoạt sự kiện

3

Sử dụng CausesValidation="false" trong thẻ nút. Nó có thể giải quyết vấn đề.

2

nếu mã của bạn như thế này:

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



    } 




} 

đặt vào BindGrid() bên trong isposback {} dòng

2

Đặt grid.Databind() bên if (!IsPostBack)

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

Vấn đề của tôi là requiredfieldvalidator

Giải pháp cho t mũ là: Tôi vô hiệu hóa nó tại bài trở lại và sau đó kích hoạt lại nó sau khi lệnh hàng.

0

Đã thử các câu trả lời ở trên và vẫn không thể tải lại bài đăng. Đã kết thúc là ID duy nhất vấn đề. Tôi có hai số <ItemTemplate> với các nút có cùng id. (Trong các chế độ xem lưới khác nhau. Chế độ xem thứ hai của tôi nằm trong Điều khiển người dùng)

Thay đổi <asp:Button ID="" /> thành ID duy nhất đã giải quyết được vấn đề sau cho tôi.

Chỉ cần nghĩ rằng tôi muốn đăng bài cho bất kỳ ai khác đã thử các tùy chọn khác mà không có may mắn.

Các vấn đề liên quan