uso parametros metodos metodo los instancia importancia ejemplos declaracion consola con c# asp.net user-controls webusercontrol

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étodo LoadEditCategory (método principal).
  • El método principal ( LoadEditCategory ) necesita un argumento int ( CategoryID ).
  • El control de usuario RightControlPanel es RightControlPanel 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



//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