C# 从用户控件调用父页面中的方法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/623136/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Calling a method in parent page from user control
提问by Jeremy Thomson
I've a user control registered in an aspx
page
On click event of a button in the user control, how do i call a method which is there in the parent page's codebehind?
我在aspx
页面中注册了一个用户控件在用户控件中的按钮的单击事件中,我如何调用父页面代码隐藏中的方法?
Thanks.
谢谢。
回答by Rex M
Cast the page as the specific page in your project:
将页面转换为项目中的特定页面:
((MyPageName)this.Page).CustomMethod()
回答by eglasius
I suggest you don't call the page method directly, as you would be tying your control to the specific page.
我建议您不要直接调用 page 方法,因为您会将控件绑定到特定页面。
Instead expose an event, and have the page subscribe to it. It works for any number of pages, can more easily be used when the control is multiple times on a single page (perhaps even on a list) and is more in line with asp.control design.
而是公开一个事件,并让页面订阅它。它适用于任意数量的页面,当控件在单个页面上多次(甚至可能在列表中)时更容易使用,并且更符合asp.control设计。
回答by Stephen M. Redd
Here is the classic example using events as suggested by Freddy Rios (C# from a web application project). This assumes that you want to use an existing delegate rather than make your own and you aren't passing anything specific to the parent page by event args.
这是使用 Freddy Rios(来自 Web 应用程序项目的 C#)建议的事件的经典示例。这假设您想使用现有委托而不是自己制作委托,并且您没有通过事件参数传递任何特定于父页面的内容。
In the user control's code-behind (adapt as necessary if not using code-behind or C#):
在用户控件的代码隐藏中(如果不使用代码隐藏或 C#,则根据需要进行调整):
public partial class MyUserControl : System.Web.UI.UserControl
{
public event EventHandler UserControlButtonClicked;
private void OnUserControlButtonClick()
{
if (UserControlButtonClicked != null)
{
UserControlButtonClicked(this, EventArgs.Empty);
}
}
protected void TheButton_Click(object sender, EventArgs e)
{
// .... do stuff then fire off the event
OnUserControlButtonClick();
}
// .... other code for the user control beyond this point
}
In the page itself you subscribe to the event with something like this:
在页面本身中,您可以使用以下内容订阅事件:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// hook up event handler for exposed user control event
MyUserControl.UserControlButtonClicked += new
EventHandler(MyUserControl_UserControlButtonClicked);
}
private void MyUserControl_UserControlButtonClicked(object sender, EventArgs e)
{
// ... do something when event is fired
}
}
回答by MagicAndi
Scott Allenhas a useful article on event bubbling from a user control to the parent page, which elaborates on the answer provided by Stephen M. Redd:
Scott Allen有一篇关于从用户控件到父页面的事件冒泡的有用文章,其中详细说明了Stephen M. Redd提供的答案:
回答by Suhail
You can use Session . Say when you click on a button in user control and when you want to call Parent page method then in event handler of button click set value as
您可以使用 Session 。假设当您单击用户控件中的按钮时,当您想调用父页面方法时,然后在按钮单击的事件处理程序中将值设置为
Session["CallParent"]="someValue";
as button will post back the page . On Page_Load event of Parent Page add it
as 按钮将回发页面。在父页面的 Page_Load 事件上添加它
protected void Page_Load(object sender,EventArgs e)
{
if(Session["CallParent"]!=null)
{
// here call the Parent Page method
Method1();
// now make the session value null
Session["CallParent"]=null;
}
}
It is much more efficient
它更有效率
回答by Rohit
Follow good and appropriate approach,
遵循良好和适当的方法,
Use event and delegate concept make delegate as same signature as your method in parent page and then assign parent methad to it in parent page load event then call this delegate through event in user control.
使用事件和委托概念使委托与父页面中的方法具有相同的签名,然后在父页面加载事件中为其分配父方法,然后通过用户控件中的事件调用此委托。
code sample and link is given below.
下面给出了代码示例和链接。
//Parent Page aspx.cs part
public partial class getproductdetails : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ucPrompt.checkIfExist += new uc_prompt.customHandler(MyParentMethod);
}
bool MyParentMethod(object sender)
{
//Do Work
}
}
//User control parts
public partial class uc_prompt : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public delegate bool customHandler(object sender);
public event customHandler checkIfExist;
protected void btnYes_Click(object sender, EventArgs e)
{
checkIfExist(sender);
}
}
Read more details how it works (Reference) :-
阅读更多详细信息它是如何工作的(参考):-
回答by Güven Acar
//c#
//In parent page
public void test(string S)
{
Label1.Text = S;
}
//In user control
protected void Button1_Click(object sender, System.EventArgs e)
{
//Calling "test method" of parent page from user control
((object)this.Page).test("Hello!!");
}
'VB.Net
'In parent page
Sub test(ByVal S As String)
Label1.Text = S
End Sub
'In user control
Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
'Calling "test method" of parent page from user control
DirectCast(Me.Page, Object).test("Hello!!")
End Sub
回答by Ali Soltani
I want to do this scenario:
我想做这个场景:
- Call
LoadEditCategory
method (parent method). - Parent method (
LoadEditCategory
) needs aint
argument (CategoryID
). - Child user control is
RightControlPanel
that is in same parent page folder.
- 调用
LoadEditCategory
方法(父方法)。 - 父方法 (
LoadEditCategory
) 需要一个int
参数 (CategoryID
)。 - 子用户控件
RightControlPanel
位于同一个父页面文件夹中。
Child User control
子用户控制
1- Add a Action
(_LoadEditCategory
)
1- 添加一个Action
( _LoadEditCategory
)
public Action<int> _LoadEditCategory = null;
public Action<int> _LoadEditCategory = null;
<int>
is int
argument (CategoryID
).
<int>
是int
参数 ( CategoryID
)。
2- Use this Action
in button event (btnSave
button name) like this:
2-Action
在按钮事件(btnSave
按钮名称)中使用它,如下所示:
void btnSave_Click(object sender, EventArgs e)
{
//123 is test integer for CategoryID
_LoadEditCategory(123);
}
Parent Page or parent user control
父页面或父用户控件
3- Add parent method
3- 添加父方法
private void LoadEditCategory(int CategoryID)
{
// CategoryID is 123 in my example
//Do some things with CategoryID
}
4- Add this code when load child user control (RightControlPanel
)
4-加载子用户控件时添加此代码(RightControlPanel
)
//Load child user control
RightControlPanel si = this.LoadControl(this.ControlPath + "RightControlPanel.ascx") as RightControlPanel;
if (si != null)
{
...
//For call parent method in child user control
si._LoadEditCategory = c => LoadEditCategory(c);
...
}
回答by Taylor Brown
I love Stephen M. Redd's answer and had to convert it to VB. Sharing it here. Suggested edits welcome.
我喜欢 Stephen M. Redd 的回答,不得不将其转换为 VB。在这里分享。欢迎建议修改。
In the user control's code-behind:
在用户控件的代码隐藏中:
Public Class MyUserControl
Inherits System.Web.UI.UserControl
'expose the event publicly
Public Event UserControlButtonClicked As EventHandler
'a method to raise the publicly exposed event
Private Sub OnUserControlButtonClick()
RaiseEvent UserControlButtonClicked(Me, EventArgs.Empty)
End Sub
Protected Sub lbtnApplyChanges_Click(sender As Object, e As EventArgs) Handles lbtnApplyChanges.Click
'add code to run here, then extend this code by firing off this event
'so it will trigger the public event handler from the parent page,
'and the parent page can hanlde it
OnUserControlButtonClick()
End Sub
End Class
In the parent page subscribe to the event, so when the event is raised, your code will run here.
在父页面订阅事件,所以当事件被引发时,你的代码会在这里运行。
Public Class SalesRecord
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'hook up event handler for exposed user control event to handle this
AddHandler MyUserControl.UserControlButtonClicked, AddressOf MyUserControl_UserControlButtonClicked
End Sub
''' <summary>
''' code to run when user clicks 'lbtnApplyChanges' on the user control
''' </summary>
Private Sub MyUserControl_UserControlButtonClicked()
'this code will now fire when lbtnApplyChanges_Click executes
End Sub
End Class
回答by Stewart
I posted something that works here: Access control > page > master nested > master
我在这里发布了一些有用的东西:访问控制>页面>主嵌套>主
Or if you want access to a control you can also do this:
或者,如果您想访问控件,您也可以这样做:
Update parent page Where parent has an update panel named "UpdatePanel1"
更新父页面父页面有一个名为“UpdatePanel1”的更新面板
Control
控制
UpdatePanel onParent1 = (UpdatePanel)Parent.FindControl("UpdatePanel1");
onParent1.Update();