2009-11-30 33 views
8

Có thể dừng một ItemCommand hoặc sự kiện kiểm soát từ sủi bọt lên hệ thống phân cấp điều khiển không? Tôi có một điều khiển có chứa các điều khiển người dùng con mà có thể hoặc có thể chưa có mã xử lý các sự kiện ItemCommand của họ. Những gì tôi muốn làm là để cho phép kiểm soát con để quyết định không vượt qua ItemCommand cùng với điều khiển cha mẹ trong trường hợp nó đã xử lý sự kiện trong mã của nó.Làm cách nào để hủy sự kiện bubbling trong ASP.net?

Cảm ơn,

Mike

Trả lời

11

Trong lớp điều khiển người dùng của bạn, ghi đè OnBubbleEvent(). Nếu bạn trả về true, bạn sẽ dừng "bong bóng" lên các điều khiển chính.

protected override bool OnBubbleEvent(object source, EventArgs args) 
    { 
     //handled 
     return true; 

     //uncomment line below to bubble up (unhandled) 
     //return base.OnBubbleEvent(source, args); 
    } 

Một điều hơi gọn gàng để suy nghĩ về điều đó tôi thấy trong khi mày mò về vấn đề này, mà có thể có ích trong một số trường hợp ... bạn có thể thay đổi tên lệnh đó là bong bóng lên 'trong heirachy kiểm soát là tốt. Trong điều khiển người dùng con của bạn, sử dụng OnCommand, thay vì Onclick.

Vì vậy, nói rằng bạn có một nút kiểm soát người dùng của bạn, thay đổi mã từ này:

<asp:button id="mySpecialButton" 
      onClick="mySpecialButton_OnClick" runat="server"> 

này:

<asp:Button id="mySpecialButton" 
      CommandName="mySpecialCommand" 
      CommandArgument="myArgument" 
      OnCommand="mySpecialButton_Command" 
      runat="server"/> 

sau đó trong codebehind,

protected void mySpecialButton_Command(object sender, CommandEventArgs e) 
     { 
      RaiseBubbleEvent(this, new CommandEventArgs("Handled", e)); 
     } 

Vì vậy, trong trình điều khiển ItemCommand của trình điều khiển cha bạn, bạn sẽ nhận được tên lệnh mới này thay vì lệnh gốc e từ điều khiển con, mà bạn có thể thực hiện khi bạn thấy phù hợp.

0

Set e.Handled = true (nếu e là tên của sự kiện của bạn).

+0

James, Tôi dường như không thể tìm thấy thuộc tính Handled mà bạn đề cập đến. Hiện tại tôi đang cố gắng thực hiện điều này trong sự kiện nhấp chuột vào nút điều khiển của người dùng. Phương thức có chữ ký sau: Được bảo vệ Sub btnAddToCart_Click (Người gửi ByVal Là Đối tượng, ByVal e Là System.EventArgs) Xử lý btnAddToCart.Click e trong trường hợp này chỉ là EventArgs và nó không có thuộc tính được xử lý. Có nơi nào khác tôi nên cố gắng truy cập vào tài sản này không? – mclark1129

1

Sự kiện nhấp chuột về mặt kỹ thuật không phải là bong bóng. Sự kiện đó được nâng lên và xử lý bởi mã của bạn nhưng điều khiển danh sách cũng đang xem sự kiện Click và nâng cao một sự kiện ItemCommand. Không có cách nào để ngăn chặn điều đó bởi vì bạn thậm chí không thể đảm bảo xử lý sự kiện nào sẽ được gọi trước.

Bạn có một CommandName được liên kết với nút mà bạn không muốn tăng sự kiện đó không? Bạn có lẽ nên loại bỏ hoàn toàn sự kiện Button_Click của bạn và làm xử lý lệnh của bạn trong sự kiện ItemCommand, kiểm tra sự kiện args cho CommandName và phản ứng một cách thích hợp.

Nói cách khác, sử dụng CommandName để xác định những gì bạn muốn xảy ra, sau đó trong sự kiện ItemCommand, chỉ thực hiện hành động khi bạn thấy một CommandName mà bạn chịu trách nhiệm xử lý.

+0

Không có đề cập đến trong câu hỏi của một sự kiện Click, nhưng của một ItemCommand. * Bong bóng * nào. Câu trả lời của Morgan cho thấy cách xử lý điều này. – Ruben

+0

Nó đã được đề cập trong một theo dõi để trả lời của JamesL. Có câu trả lời của Morgan là tốt hơn vì vậy tại sao nó được bình chọn. StackOverflow đang hoạt động như được thiết kế. – Josh

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