2012-04-17 78 views
1

我有一个用户控件是在另一个用户控件内,我想要做的是在某个进程运行后,找到父按钮控件并运行OnClick事件。usercontrol在父母找到按钮控制

用户控件1

protected void btnReload_Click(object sender, EventArgs e) 
{ 
    //reloads data 
} 

用户控件2(内嵌在用户控件1)

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    Button btnReload = (Button)Parent.FindControl("btnReload"); 
    //here fire the btnReload onclick even 
} 

这是不是我拿recomendations最好的办法,因为我要拉我的头发点在此。我这样做的原因是因为我有8个页面都需要创建一个新用户,所以我想使用1个用户控件,但是用新创建的用户重新加载他们所在的页面。

回答

1

有两种方法可以做到这一点:

1.在服务器端。

你想要做的是体系明智错误,孩子不应该试图在父母中找到控制,也不应该父母。因此,子控件可以有一个自定义事件,父母可以注册它,你可以在子控件的按钮点击事件上触发该事件。

这里有一篇文章,让你开始:http://codebetter.com/brendantompkins/2004/10/06/easily-raise-events-from-asp-net-ascx-user-controls/

这也被这里讨论:How do you determine when a button is clicked in the child on the parent - ASP.NET

2.客户端:

使用jQuery,你可以捕捉孩子控制的按钮点击事件,并从那里你可以触发父母的按钮的点击。您可以使用隐藏变量共享父按钮的ID。

+0

好吧,这是工作就像我需要它,但有没有办法通过事件参数传递一个字符串值从usercontrol回aspx? – Andres 2012-04-17 21:01:31

+0

是的。如果你看看代码更新的例子,他们有一个从EventArgs类继承的类TabClickEventArgs。只要遵循这个类,无论你想传递什么值,为它创建一个属性,在触发事件之前设置它,父类应该得到它。 – 2012-04-17 21:03:33

+0

找到它,但即时通讯在这一行得到一个错误:MyControl.TabClicked + = new EventHandler(btnNewUser_Click); – Andres 2012-04-17 21:34:50

4

不要这样做。
UserControl应该是一个独立的块,不需要知道其周围环境。

相反,在您的UserControl中创建一个事件并在父页面中处理它。您可以将点击处理程序移至单独的方法,并从按钮点击事件和新的自定义事件中调用该方法。