創建基類,並在那裏實現通用邏輯。然後從這個基類繼承控件。爲了從基類級別訪問控件,抽象獲取您需要的每個控件的基類級屬性。在子控件類中實現這些屬性。
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
)您可以創建一個包含您的驗證邏輯的靜態類,而不是基類,這些方法將作爲參數傳遞給您的控件。 –