سلام . من میخوام user control ی برای login به فرم اصلی برنامم بسازم ,می خوام روش بهینه ی برای پیاده سازی eventهای مربوطه داشته باشم .منو راهنمایی کنید.
سلام . من میخوام user control ی برای login به فرم اصلی برنامم بسازم ,می خوام روش بهینه ی برای پیاده سازی eventهای مربوطه داشته باشم .منو راهنمایی کنید.
این حالت ساده شده ی کنترلی است که من در برنامه هام مینویسم :
public partial class LoginControl : UserControlاین کنترل 3 تا ایونت داره : (البته صرف آموزش و در عمل نیازی به پیاده سازی این 3 رخداد نیست و میشه با یک ایونت مشکل رو حل کرد)
{
public LoginControl()
{
InitializeComponent();
}
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)
OnLoginSuccess();
else
OnLoginFail();
}
private void btnCancel_Click(object sender, EventArgs e)
{
OnLoginCancel();
}
public delegate void ClickButtonHandler(object sender, EventArgs e);
public event ClickButtonHandler LoginSuccessed;
public event ClickButtonHandler LoginFailed;
public event ClickButtonHandler LoginCanceled;
public void OnLoginSuccess()
{
if (LoginSuccessed != null)
LoginSuccessed(this, new EventArgs());
}
public void OnLoginFail()
{
if (LoginFailed != null)
LoginFailed(this, new EventArgs());
}
public void OnLoginCancel()
{
if (LoginCanceled != null)
LoginCanceled(this, new EventArgs());
}
}
LoginSuccessed: زمانی که شخص موفق به لاگین میشه
LoginFailed: زمانی که شخص سعی میکنه و موفق نمیشه
LoginCanceled: زمانی که شخص از لاگین انصراف میده
روش قدم به قدم پیاده سازی یک ایونت بصورت هایلایت شده قابل ردگیری است (که این فرآیند تکراریه و همیشه یه همین شکل انجام میشه)
از طرفی هر فرمی که از این کنترل استفاده میکنه باید اینترفیس زیر رو پیاده سازی کنه :
public interface IAuthenticationبرای مثال استفاده در یک فرم :
{
bool IsAuthentic(string UserId, string Password);
}
public partial class LoginForm : Form, IAuthenticationو این هم کدی که نهایتا در شروع کار مینویسم :
{
public LoginForm()
{
InitializeComponent();
}
private int nTry = 0;
private void loginControl1_LoginFailed(object sender, EventArgs e)
{
if (nTry++ > 2)
{
MessageBox.Show("ByeBye!");
this.DialogResult = DialogResult.Abort;
}
else
MessageBox.Show(string.Format("You have {0} times to try again...", (3 - nTry + 1).ToString()));
}
private void loginControl1_LoginCanceled(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Ignore;
}
private void loginControl1_LoginSuccessed(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
public bool IsAuthentic(string UserId, string Password) { if (UserId == "user" && Password == "pass") return true; return false; }
}
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
LoginForm login = new LoginForm();
if (login.ShowDialog() == DialogResult.OK)
Application.Run(new MainForm());
}
آخرین ویرایش به وسیله Mahmoud.Afrad : چهارشنبه 17 تیر 1394 در 14:11 عصر
...مرا به خانه ام ببر، اگرچه خانه؛ خانه نیست
مرسی از جواب مفید و کاملتون . میشه توضیح بدید چرا از اینترفیس استفاده کردید ؟
امکان داره source code آپلود کنی ؟
سلام . من در استفاده از اینترفیس ها و درکشون مشکل دارم . توی این کد هم متوجه نمیشم این اینتر فیس داره چیکار میکنه ؟ پیاده سازی دیگری به غیر از استفاده از اینترفیس براش وجود داره ؟
تعریف اینترفیس بصورت خیلی خلاصه و عامیانه : قرارداد و یا واسط بین یک سرویس دهنده(Class Creator) و سرویس گیرنده های از اون(Class Consumers) که همیشه از سمت سرویس دهنده اعمال (Force) میشه.
در کد، من از تابعی از نوع بولین برای تصدیق هویت استفاده کردم و خب این طبیعیه که شرایط تصدیق هویت در هر برنامه میتونه متفاوت باشه. یکجا ممکنه کلمه عبور در دیتابیس Hash شده باشه و یا جایی دیگر ...
پس چون نمیشه تابع مشخصی برای تصدیق هویت ارائه داد پیاده سازی این تابع رو به کاربر استفاده کننده از کنترل واگذار میکنیم.
و این باعث انعطاف میشه. (چون شما هیچ اطلاعی از موجوداتی که قراره در آینده با کنترل شما کار کنند ندارید و این همون جایی ست که اینترفیسها یکه تاز میدان خواهند بود !)
100% : اما من اینترفیس رو ترجیح میدم ! :دی :پی
حتما : ASAP
<< در همون پست شماره #2 ضمیمه شد. >>
...مرا به خانه ام ببر، اگرچه خانه؛ خانه نیست
چه جوری میشه فقط از یک event استفاده کرد به گونه ای که فهمید user موفق شده ,cancel کرده یا با fail مواجه شده , در واقع یک event تمام این حالتها را در بر بگیره ؟این کنترل 3 تا ایونت داره : (البته صرف آموزش و در عمل نیازی به پیاده سازی این 3 رخداد نیست و میشه با یک ایونت مشکل رو حل کرد)
- LoginSuccessed: زمانی که شخص موفق به لاگین میشه
- LoginFailed: زمانی که شخص سعی میکنه و موفق نمیشه
- LoginCanceled: زمانی که شخص از لاگین انصراف میده
یک 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;
}
}
}
آخرین ویرایش به وسیله Mahmoud.Afrad : چهارشنبه 17 تیر 1394 در 14:14 عصر
...مرا به خانه ام ببر، اگرچه خانه؛ خانه نیست
جالب!
قدرت اینترفیسها در پیادهنسازی است نه در پیاده سازی!
همانطوری که سیناجان گفتند واگذار کردن پیاده سازی به استفاده کننده، قابلیت انعطاف پذیری را زیاد میکند . این نه فقط برایه این مثال ولی به طور کلی در برنامهنویسی صادق است.
استفاده از اینترفیس را بهش عادت کنید، یک پله دیگر در برنامهنویسی بالاتر میرید.
اگه احساس میکنید تاپیک شما به نتیجه رسیده لطفا اعلام کنید.
اینکار برای هدایت دوستان بعدی که با جستجو به تاپیکها میرسند میتونه خوب باشه.
ممنون
...مرا به خانه ام ببر، اگرچه خانه؛ خانه نیست
سلام.
وظیفه این دو تیکه ازکد چیه ؟
parent is IAuthentication
و
result = (parent as IAuthentication).IsAuthentic(tbUserId.Text, tbPassword.Text);
ممنون
آخرین ویرایش به وسیله Mahmoud.Afrad : چهارشنبه 17 تیر 1394 در 14:15 عصر
آخرین ویرایش به وسیله Mahmoud.Afrad : چهارشنبه 17 تیر 1394 در 14:16 عصر
...مرا به خانه ام ببر، اگرچه خانه؛ خانه نیست
تاپیک خوبی بود با تشکر از مدیر
سلام
نگاه کن در کد اولی اگر بخواهیم امکانی فراهم بیاوریم که کاربر بخواهد یوزر نیم و پاسوورد را عوض کند چکار باید بکنیم ...
با تشکر
با سلام
اگه امكان داره توضيح بديد كه چطوري مي توان به اجزاي user control در پروژه اي ديگر دسترسي پيدا كرد . مثلا چطور مي توان به textbox ها دسترسي پيدا كرد.لطفا سريع پاسخ بديد چون خيلي نيازش دارم .
یک سوال ، جناب sinpin
اصولاً استفاده از UserControl زمانی مفید به نظر میرسه که قراره از یک کنترل بیش از یک بار استفاده بشه !
اما در هر برنامه فقط یک LogIn وجود داره، آیا دلیل خاص دیگه ای باعث شده که شما این کنترل رو به این صورت پیاده سازی کنید ؟
متشکرم
سلام - ممنون از جناب sinpin مفید بود - ولی اینجا چند تا سوال دوستان پرسیدند که اگر جواب داده بشه - بقیه هم استفاده می کنند
با تشکر
با سلام ...
چرا LoginSuccessed همش Null هست ؟
برنامه ایی که آپلود کردید درسته ؛من این برنامه رو یه بار دیگه خودم نوشتم اما برنامه ایی که نوشتم از روی کد اصلی ، ناله ، بنابراین شرط فالس می شه و برنامه درست کار نمی کنه.