创建基类,并在那里实现通用逻辑。然后从这个基类继承控件。为了从基类级别访问控件,抽象获取您需要的每个控件的基类级属性。在子控件类中实现这些属性。
public abstract class BaseControl : UserControl
{
public abstract TextBox FirstName { get; }
public void SomeLogicExample()
{
FirstName.Text = "Something";
}
}
public class ControlA : BaseControl
{
public override TextBox FirstName
{
// txtFirstNameA is ID of TextBox, so it is defined in ControlA.designer.cs
get { return txtFirstNameA; }
}
}
public class ControlB : BaseControl
{
public override TextBox FirstName
{
// txtFirstNameB is ID of TextBox, so it is defined in ControlB.designer.cs
get { return txtFirstNameB; }
}
}
另一种方法是,在运行时定位控件;因为你付出的搜索整个控件树,你必须处理的控制没有发现的情况:
public abstract class BaseControl : UserControl
{
public T GetControlByType<T>(Func<T, bool> predicate = null) where T : Control
{
var stack = new Stack<Control>(new Control[] { this });
while (stack.Count > 0)
{
var control = stack.Pop();
T match = control as T;
if (match != null)
{
if (predicate == null || predicate(match))
{
return match;
}
}
foreach (Control childControl in control.Controls)
{
stack.Push(childControl);
}
}
return default(T);
}
public TextBox FirstName
{
get { return GetControlByType<TextBox>(t => t.ID == "txtFirstName"); }
}
public void SomeLogicExample()
{
FirstName.Text = "Something";
}
}
你在代码隐藏中有很多业务逻辑吗?如果是这样,可以将它放置在一个单独的类中,并由代码隐藏用于两个用户控件? –
不是“业务逻辑”,而是验证控件和处理输入等。由于此代码严重访问控件,并且无法从基类中看到控件,所以我认为这不会很好解决问题的方法:( – NickG
)您可以创建一个包含您的验证逻辑的静态类,而不是基类,这些方法将作为参数传递给您的控件。 –