組合控件 Login 由現有伺服器控件組成,子控件事件需「冒泡」為父控件事件。例如點擊「提交」按鈕,實際觸發 Login 的驗證事件。
public class ValidateEventArgs : EventArgs
{
public string UserName { get; private set; }
public string UserPassword { get; private set; }
public ValidateEventArgs(string username, string userpassword)
{
UserName = username;
UserPassword = userpassword;
}
}
在 Button.Click 事件中:
protected void SubmitButton_Click(object sender, EventArgs e)
{
string userName = UserNameTextBox.Text;
string password = PasswordTextBox.Text;
OnValidate(new ValidateEventArgs(userName, password));
}
protected virtual void OnValidate(ValidateEventArgs e)
{
EventHandler<ValidateEventArgs> handler = Validate;
if (handler != null) handler(this, e);
}
頁面使用者只需訂閱 Login.Validate 事件,無需知悉內部結構。這是封裝與解耦的典範。