I have two usercontrols: UserControl1
and UserControl2
, these controls are added in the Page.aspx.
UserControl1
:
This usercontrol contains method for hidden textboxes in this usercontrol. This method is called "HideTextbox
"
UserControl2
:
I want to call method "HideTextBox
" from UserControl2
.
How can I call method HideTextBox
from UserControl2
?
ascx file, also known as a user control, requested from a server that hosts an ASP.NET Web application. The file must be called from a Web Forms page or a parser error will occur.
User controls are containers into which you can put markup and Web server controls. You can then treat the user control as a unit and define properties and methods for it. Custom controls. A custom control is a class that you write that derives from Control or WebControl.
Only if both are usercontrols or servercontrols, or you're looking for a servercontrol from a usercontrol will this work. (not from a servercontrol because you can't get a reference to the asp.usercontrol_xx assembly)
First get a reference to the parent page (usually this can be done with this.Parent
.
Next do a recursive FindControl on the parent to find a control whose type is UserControl2
.
Example code:
//this for extension method
public static UserControl2 FindUserControl2Recursive(this Control root)
{
var uc2 = root as ASP.UserControls_UserControl2_ascx;
if (uc2 != null)
{
return uc2;
}
foreach (var control in root.Controls)
{
uc2 = control.FindUserControl2Recursive();
if (uc2 != null)
{
return uc2;
}
}
return null;
}
Once you have your Usercontrol2 reference, you can easily call your public method.
This problem can be solved by creating a custom event in UC2 and consuming that event on the main page to invoke the hide method on UC1.
You declare a delegate in your user control
public delegate void HideTextBoxEventHandler(object sender, EventArgs e);
Then define the event for the delegate you created
public event HideTextBoxEventHandler HideTextBox;
At the point in the code where you want to hide text box you need to invoke that event:
if (this.HideTextBox != null) // if there is no event handler then it will be null and invoking it will throw an error.
{
EventArgs e = new EventArgs();
this.HideTextBox(this, e);
}
Then from the main page create an event handling method
protected void UserControl2_HideTextBox(Object sender, EventArgs e)
{
UC1.InvokeHideTextBox(); // this is the code in UC1 that does the hiding
}
You will need to add to the page load or where ever you are loading UC2
UC2.HideTextBox += new UserControl2.HideTextBoxEventHandler(this.UserControl2_HideTextBox);
I would declare interface on control that knows how to hide text boxes, something like this :
public interface ITextBoxHider
{
void HideTextBoxes();
}
after that implement this interface on UserControl1, when you want to hide text boxes enumerate all controls on a form and find one that implements ITextBoxHider, and then simply call that method :
helper method that will enumerate all controls :
public static IEnumerable<Control> GetAllChildren(Control parent)
{
foreach (Control control in parent.Controls)
{
foreach (Control grandChild in GetAllChildren(control))
yield return grandChild;
yield return control;
}
}
using that method and calling HideTextBoxes from UserControl2 :
var hider = GetAllChildren(this.Page).FirstOrDefault(ct => ct is ITextBoxHider);
if (hider != null)
(hider as ITextBoxHider).HideTextBoxes();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With