может быть, вам нужно рекурсивно найти ваш элемент управления с помощью FindControl, а затем вызвать себя?
private static Control FindNestedControl(string id, Control parent)
{
Control item = parent.FindControl(id);
if(item == null)
{
foreach(var child in parent.Controls)
{
item = child.FindNestedControl(id, child);
if(item != null)
{
return item;
}
}
}
return null;
}
И вызвать его, передав текущий экземпляр страницы через:
Control item = FindNestedControl("bob", this);
Однако это может быть медленно - так что следите за этим, если на странице есть целая куча элементов управления:)
Другим способом сделать это было бы просто представить элементы управления в качестве свойств вашего базового класса:
public abstract class BasePage : Page
{
#region Properties
/// Gets the textbox for editing in derived classes.
protected TextBox SomeTextBox
{
return this.textBox; }
}
#endregion
}
И последний способ сделать это - подключиться к производным классам в вашем базовом классе:
public abstract class BasePage : Page
{
/// <summary>
/// Called when loading the page.
/// </summary>
/// <param name="e">The event arguments.</param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// Do some basic setup.
// Now pass the controls to the derived classes.
this.ConfigureControl(this.mainText);
this.ConfigureControl(this.nameDropDown);
this.ConfigureControl(this.someOtherControl);
}
/// <summary>
/// Provides hook for derived classes.
/// </summary>
/// <param name="control">The core control.</param>
protected virtual void ConfigureControl(Control control)
{
}
}
А затем переопределить на вашей производной странице:
protected override void ConfigureControl(Control control)
{
switch(control.ID)
{
case "mainText":
TextBox mainText = (TextBox)control;
mainText.Text = "works";
break;
}
}
Из них я, вероятно, использовал бы второе, если бы не так много элементов управления. Первый способ полезен при работе с ретрансляторами и т. П.