
نوشته شده توسط
az_farzaneh
چه جوری میشه فقط از یک event استفاده کرد به گونه ای که فهمید user موفق شده ,cancel کرده یا با fail مواجه شده , در واقع یک event تمام این حالتها را در بر بگیره ؟
یک enum تعریف کنید واسه تمامی حالات موجود از رخدادهای مورد نظر. برای مثال در اینجا داریم :
public enum LoginEventTypes { Successed, Failed, Cancel }
و از طرفی شما مجبور به استفاده از کلاس EventArgs نیستید و میتونید از یک کلاس مشتق شده (از EventArgs) استفاده کنید و اطلاعات مورد نظرتون رو (در اینجا همون نتیجه ی لاگین شخص)در اون نگهداری کنید.
public class LoginEventArgs : EventArgs { private LoginEventTypes eventType; public LoginEventTypes EventType { get { return eventType; } set { eventType = value; } } private string loginDate; public string LoginDate { get { return loginDate; } set { loginDate = value; } } public LoginEventArgs(LoginEventTypes _eventType) { this.loginDate = DateTime.Now.ToString(); this.eventType = _eventType; } }
البته در مثال بالا من زمان سعی کاربر به لاگین رو هم نگهداری کردم (شاید واسه Log کردن لازم بشه)
حالا به کلاس یوزرکنترل میریم و ایونتهای اضافی رو پاک میکنیم و فقط یک ایونت رو نگه میداریم. توجه داشته باشید که امضای دیلیگیت (قسمت قرمز رنگ) نیز عوض شده:
public delegate void ClickButtonHandler(object sender, LoginEventArgs e);
public event ClickButtonHandler LoginEvent;
public void OnLoginEvent(LoginEventTypes _eventType)
{
if (LoginEvent != null)
LoginEvent(this, new LoginEventArgs(_eventType));
}
و برای فراخوانی هم کافیه همین یک متود رو با پارامترهای مختلف صدا بزنیم :
private void btnLogin_Click(object sender, EventArgs e)
{
bool result = false;
Control parent = this.Parent;
if (!(parent is IAuthentication))
return;
result = (parent as IAuthentication).IsAuthentic(tbUserId.Text, tbPassword.Text);
if (result)
OnLoginEvent(LoginEventTypes.Successed);
else
OnLoginEvent(LoginEventTypes.Failed);
}
private void btnCancel_Click(object sender, EventArgs e)
{
OnLoginEvent(LoginEventTypes.Cancel);
}
و در پایان کد فرم لاگین رو نیز به این شکل تغییر بدید :
public partial class LoginForm : Form, IAuthentication
{
public LoginForm()
{
InitializeComponent();
}
public bool IsAuthentic(string UserId, string Password)
{
if (UserId == "user" && Password == "pass")
return true;
return false;
}
private int nTry = 0;
private void loginControl1_LoginEvent(object sender, LoginEventArgs e)
{
switch (e.EventType)
{
case LoginEventTypes.Successed:
this.DialogResult = DialogResult.OK;
break;
case LoginEventTypes.Failed:
if (nTry++ > 2)
{
MessageBox.Show("ByeBye!");
this.DialogResult = DialogResult.Abort;
}
else
MessageBox.Show(string.Format("{0}: You have {1} times to try again...", e.LoginDate, (3 - nTry + 1).ToString()));
break;
case LoginEventTypes.Cancel:
this.DialogResult = DialogResult.Ignore;
break;
default:
break;
}
}
}
کد نهایی این مثال نیز آپلود شد.