2012-06-30 22 views
5

Tôi có hai UserControls - UserControl1.ascx và UserControl2.ascx trong PageDefault.aspx:Event Bọt Từ Web User Controls trong ASP.NET

Làm thế nào tôi có thể gọi phương thức (GetLabelText() in UserControl1.ascx) từ UserControl2.ascx sử dụng sự kiện bọt?

Đây là mã ví dụ của tôi - Khi tôi nhấp vào nút (UserControl2Button1 in UserControl1.ascx) - Tôi muốn gọi phương thức GetLabelText() from UserControl2.ascx - sử dụng sự kiện bubbling.

PageDefault.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PageDefault.aspx.cs" Inherits="TelerikAjaxEvents.PageDefault" %> 
<%@ Register TagPrefix="uc" TagName="UserControl1" Src="~/UserControl1.ascx" %> 
<%@ Register TagPrefix="uc" TagName="UserControl2" Src="~/UserControl2.ascx" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Page Default</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     UserControl1: 
     <uc:UserControl1 ID="UserControl1" runat="server" /> 

     UserControl2: 
     <uc:UserControl2 ID="UserControl2" runat="server" /> 

    </form> 
</body> 
</html> 

UserControl1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserControl1.ascx.cs" Inherits="TelerikAjaxEvents.UserControl1" %> 
<asp:Label ID="UserControl1Label1" runat="server"></asp:Label> 

UserControl1.ascx.cs

public partial class UserControl1 : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     public void GetLabelText() 
     { 
      UserControl1Label1.Text = "Text is Visible"; 
     } 
    } 

UserControl2.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserControl2.ascx.cs" Inherits="TelerikAjaxEvents.UserControl2" %> 
<asp:Button ID="UserControl2Button1" runat="server" Text="Send" 
    onclick="UserControl2Button1_Click" /> 

UserControl2.ascx.cs

public partial class UserControl2 : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void UserControl2Button1_Click(object sender, EventArgs e) 
     { 
      //Call method from UserControl1 (GetLabelText()) - Show Label text - USING BUBBLE EVENT 
     } 
    } 
+0

Không có cơ chế "sự kiện sủi bọt" trong ASP.NET. Bạn sẽ phải phơi bày sự kiện bằng cách thêm một sự kiện mới trên UserControl2. – millimoose

Trả lời

5

Có nhiều cách để giải quyết vấn đề này. Câu trả lời của Mark gợi ý về những gì đã được biết đến như là sự kiện bubbling bằng cách sử dụng một phần chức năng được xây dựng trong điều khiển cơ sở System.Web.UI.Control. Tuy nhiên, đó là một bài tập đơn giản để vạch trần sự kiện của riêng bạn, liên kết với sự kiện đó và bong bóng các sự kiện thông qua hệ thống phân cấp kiểm soát. Để biết thêm chi tiết về cách sử dụng BubbleEvent trong ASP.NET, hãy đọc phần sau. Hãy ghi nhớ rằng cả hai bài viết MSDN được viết cho NET 1,1

Bubbling an Event

Event Bubbling Control Sample

K. Scott Allen làm một công việc tốt tại thể hiện chính xác những gì một "sự kiện bọt" thực hiện trông giống như trong bài đăng của mình: Event Bubbling From Web User Controls in ASP.NET (C#). Xem sửa đổi sau đây để ví dụ của bạn cho cảm hứng.

UserControl1 với GetLabelText()

public partial class UserControl1 : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public void GetLabelText() 
    { 
     UserControl1Label1.Text = "Text is Visible"; 
    } 
} 

UserControl2 với tiếp xúc BubbleClick xử lý sự kiện mà người gọi có thể đăng ký.

public partial class UserControl2 : System.Web.UI.UserControl 
{ 
    protected Button UserControl2Button1; 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public event EventHandler BubbleClick; 

    protected void OnBubbleClick(EventArgs e) 
    { 
     if(BubbleClick != null) 
     { 
      BubbleClick(this, e); 
     } 
    }  
    protected void UserControl2Button1_Click(object sender, EventArgs e) 
    { 
     // do some stuff 
     OnBubbleClick(e); 
    } 
} 

PageDefault đặt mua xử lý sự kiện BubbleClick UserControl2 và thực hiện UserControl1.GetLabelText()

public partial class PageDefault : WebPage 
{ 
    UserControl1 userControl1; 
    UserControl2 userControl2; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     UserControl2.BubbleClick += RootBubbleClickHandler; 
    } 

    protected void RootBubbleClickHandler(object sender, EventArgs e) 
    { 
     if (sender is UserControl2) 
     { 
      // subscribe UserControl1 to UserControl2 click event and do something 
      userControl1.GetLabelText(); 
     } 

     // check for other controls with "BubbleClicks"   
    } 
} 
+0

Tôi có nghĩa là một cái gì đó như thế này: http://odetocode.com/code/94.aspx Làm thế nào để sử dụng ví dụ này? – JohnMalcom

+0

Tôi hiểu. Tôi đã cập nhật câu trả lời để sử dụng mẫu được thảo luận trong bài viết này. Điều này có phù hợp hơn với những gì bạn đang nghĩ không? –

0

Bạn có thể thử tuyên bố UserControl1 như tài sản công cộng (ví dụ. "UserControl1") trên PageDefault.aspx và sau đó trong UserControl2, sử dụng Parent.Page.UserControl1.GetLabelText()?

3

Event Bọt là một khái niệm chưa được hiểu rõ trong ASP.NET WebForms. Nó tồn tại (và được sử dụng bởi hầu hết các điều khiển dữ liệu), nhưng thường bị nhầm lẫn với khái niệm đơn giản hơn về "thực hiện một sự kiện trong điều khiển người dùng" (như K Scott Allen).

Cốt lõi của sự kiện bubbling là sự kiện di chuyển lên thông qua hệ thống phân cấp kiểm soát cho đến khi nó được xử lý hoặc truy cập gốc. Điều này cho phép một số tập trung mã xử lý. Nó được thực hiện bằng cách sử dụng Control.Các phương thức RaiseBubbleEvent và Control.OnBubbleEvent. Trường hợp sử dụng chính là điều khiển với rất nhiều điều khiển con (nghĩ rằng Repeater, ListViews, vv). Thay vì đăng ký vào từng điều khiển riêng lẻ, Repeater sẽ bắt tất cả chúng trong OnBubbleEvent và tăng một ItemCommandEvent duy nhất cho chúng.

Nếu bạn thực sự muốn sử dụng sự kiện bọt (như trái ngược với ví dụ K. Scott), nó sẽ giống như thế:

class Page { 
    override bool OnBubbleEvent(object sender, EventArgs e) { 
     var btn = sender as Button; 
     if (btn == null) return false; 

     // You may want to do further checking that the source is what you want 
     // You could use CommandEventArgs to do this 
     this.uc1.GetLabelText(); 
     return true; 
    } 
} 

Chuỗi sự kiện diễn ra như sau:

- Button Clicked 
- Button RaiseBubbleEvent 
- UserControl OnBubbleEvent returns false (default, since you didn't override) 
- Page OnBubbleEvent 
Các vấn đề liên quan