parametros - metodos de instancia c#
Llamar a un método en la página principal desde el control del usuario (9)
Tengo un control de usuario registrado en una página aspx
Al hacer clic en el evento de un botón en el control de usuario, ¿cómo puedo llamar a un método que está en el código subyacente de la página padre?
Gracias.
Echa la página como la página específica en tu proyecto:
((MyPageName)this.Page).CustomMethod()
Este es el ejemplo clásico que usa eventos como lo sugiere Freddy Rios (C # de un proyecto de aplicación web). Esto supone que desea utilizar un delegado existente en lugar de crear uno propio y no está pasando nada específico a la página principal por eventos args.
En el código subyacente del control de usuario (se adapta según sea necesario si no se usa código subyacente o 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
}
En la página en sí, te suscribes al evento con algo como esto:
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
}
}
Le sugiero que no llame al método de la página directamente, ya que estaría vinculando su control a la página específica.
En su lugar, exponga un evento y haga que la página se suscriba. Funciona para cualquier cantidad de páginas, se puede usar más fácilmente cuando el control es varias veces en una sola página (quizás incluso en una lista) y está más en línea con el diseño de control asp.
Me encanta la respuesta de Stephen M. Redd y tuve que convertirla a VB. Compartiéndolo aquí. Las ediciones sugeridas son bienvenidas.
En el código de control del usuario detrás:
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
En la página principal, suscríbase al evento, de modo que cuando se produzca el evento, su código se ejecutará aquí.
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
Puedes usar Session. Diga cuando haga clic en un botón en el control del usuario y cuando desee llamar al método de la página principal, en el controlador de eventos del botón, haga clic en establecer valor como
Session["CallParent"]="someValue";
como el botón publicará la página. En el evento Page_Load de Parent Page add it
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;
}
}
Es mucho más eficiente
Quiero hacer este escenario:
- Llame
LoadEditCategory
métodoLoadEditCategory
(método principal). - El método principal (
LoadEditCategory
) necesita un argumentoint
(CategoryID
). - El control de usuario
RightControlPanel
esRightControlPanel
que está en la misma carpeta de página principal.
Control de usuario infantil
1- Agregar una Action
( _LoadEditCategory
)
public Action<int> _LoadEditCategory = null;
<int>
es un argumento int
( CategoryID
).
2- Utilice este evento de Action
en el botón ( btnSave
nombre del botón) de esta manera:
void btnSave_Click(object sender, EventArgs e)
{
//123 is test integer for CategoryID
_LoadEditCategory(123);
}
Control de usuario principal o de página principal
3- Agregar método padre
private void LoadEditCategory(int CategoryID)
{
// CategoryID is 123 in my example
//Do some things with CategoryID
}
4- Agregue este código cuando cargue el control de usuario hijo ( 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);
...
}
Seguir un enfoque bueno y apropiado,
Use el concepto de evento y delegado haga delegar como la misma firma que su método en la página principal y luego asigne metadato padre a él en el evento de carga de la página padre y luego llame a este delegado a través del evento en control del usuario.
muestra de código y enlace se da a continuación.
//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);
}
}
Leer más detalles de cómo funciona (Referencia): -
Llamar a un método de página principal desde el control del usuario
Scott Allen tiene un artículo útil sobre el burbujeo del evento desde un control de usuario a la página principal, que detalla la respuesta proporcionada por :
//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