PDA

View Full Version : Lost focus در c#



alireza1384
شنبه 02 تیر 1386, 11:38 صبح
سلام. می خواهم زمان خروج از maskedTextBox فرمت مقدارورودی را چک کنم . در visual 6 این کاررادر LostFocus انجام می دادم . اما درحال حاضر c# نصب شده روی سیستم این event را ندارد. هرچند در مثالهای MSDN این event آورده شده است . از روی داد Leave هم که استفاده می کنم (همراه با روی داد keyPress ) دستورموجود در keypress باعث قفل شدن برنامه می گردد. کد مربوطه به شکل زیر است که در قسمت sendkeyss برنامه قفل می کند. لازم به ذکر است که هرکدام ازدستورات به طور مستقل بدون مشکل اجرا می شوند . اگر راه حل بهتری با event دیگری بود پیشنهاد دهید :

private void txtDate_KeyPress(object sender, KeyPressEventArgs e)
{
char key;
key = e.KeyChar;
if (key == 13)
{
SendKeys.Send("{TAB}");
}
}

private void txtDate_Leave(object sender, EventArgs e)
{
txtDate.Text = RepairTextFormat(txtDate.Text);
}

leilav_1984
شنبه 02 تیر 1386, 12:01 عصر
از رویداد validating استفاده کن

mehdi.mousavi
شنبه 02 تیر 1386, 12:09 عصر
سلام. می خواهم زمان خروج از maskedTextBox فرمت مقدارورودی را چک کنم . در visual 6 این کاررادر LostFocus انجام می دادم . اما درحال حاضر c# نصب شده روی سیستم این event را ندارد. هرچند در مثالهای MSDN این event آورده شده است . از روی داد Leave هم که استفاده می کنم (همراه با روی داد keyPress ) دستورموجود در keypress باعث قفل شدن برنامه می گردد. کد مربوطه به شکل زیر است که در قسمت sendkeyss برنامه قفل می کند. لازم به ذکر است که هرکدام ازدستورات به طور مستقل بدون مشکل اجرا می شوند . اگر راه حل بهتری با event دیگری بود پیشنهاد دهید :

private void txtDate_KeyPress(object sender, KeyPressEventArgs e)
{
char key;
key = e.KeyChar;
if (key == 13)
{
SendKeys.Send("{TAB}");
}
}

private void txtDate_Leave(object sender, EventArgs e)
{
txtDate.Text = RepairTextFormat(txtDate.Text);
}



سلام.
LostFocus Event اینجا هم وجود داره، اما چون BrowsableAttribute است false است، در محیط VS نمایش داده نمیشه. کافیه در خود کد بنویسید: txtWhatever.LostFocus و بقیه ماجرا... در مورد Validating هم باید حواستون به Property ی AutoValidate باشه... چون اگه disable باشه، این event فراخوان نمیشه.

alireza1384
شنبه 02 تیر 1386, 12:52 عصر
باتشکر، اما تا جاییکه من می دانم چون LostFocus یک event است نمی توان آن را در کد آنگونه که دوست گرامی mehdi6755 توضیح داده اند استفاده کرد. اگرممکن است بیشتر راهنمایی کنید.

mehdi.mousavi
شنبه 02 تیر 1386, 13:07 عصر
باتشکر، اما تا جاییکه من می دانم چون LostFocus یک event است نمی توان آن را در کد آنگونه که دوست گرامی mehdi6755 توضیح داده اند استفاده کرد. اگرممکن است بیشتر راهنمایی کنید.

سلام.
در Constructor فرم (یا هر جای دیگه که لازم میدونید) میتونید ازین کد استفاده کنید:



this.textBox1.LostFocus += new EventHandler(delegate(object sender, EventArgs e)
{
MessageBox.Show("the control lost the focus!");
});

این مساله در مورد تمامی event ها صادقه. وقتی شما در محیط VS روی event مورد نظرتون دو بار Click میکنید، در واقع همین کد در متود InitializeComponent فرم اضافه میشه و ...

alireza1384
شنبه 02 تیر 1386, 13:31 عصر
باتشکراز mehdi6755 .
1. راه حلی که بیان کرده اید فقط درخصوص event هایی که وجود دارند اما در vs نشان داده نمی شوند صادق است یا می توان به همان روش event دلخواهی را نیز طراحی کرد ؟
2. مرجعی که event هایی را که وجود دارند اما در vs نمایش داده نمی شوند و جهت استفاده از آنها بایستی راه حل مذکور را بکار برد سراغ دارید ؟

mehdi.mousavi
شنبه 02 تیر 1386, 14:10 عصر
باتشکراز mehdi6755 .
1. راه حلی که بیان کرده اید فقط درخصوص event هایی که وجود دارند اما در vs نشان داده نمی شوند صادق است یا می توان به همان روش event دلخواهی را نیز طراحی کرد ؟
2. مرجعی که event هایی را که وجود دارند اما در vs نمایش داده نمی شوند و جهت استفاده از آنها بایستی راه حل مذکور را بکار برد سراغ دارید ؟



سلام.
1. نمایش یا عدم نمایش یک event در Property Page های VS اهمیتی نداره. شما همیشه میتونید از طریق کد همه کار کنید.

2. در مورد این مساله باید عرض کنم که چون استفاده از LostFocus مستلزم دقت نمودن به مسائل دیگه ای هم هست، اونو در لیست event های قابل نمایش در VS نیاوردن که هنگام استفاده از اون دقت کنید. بعنوان مثال امروزه خیلی از ایرانیها وقتی میخوان یه event handler برای event ای بنویسن، بلافاصله روی event مورد نظر در VS دوبار click میکنن و .... این راه درست نیست اگر چه کار میکنه. مثلا برای Load شدن فرم، event ای داریم به اسم Load. جای اینکه دوبار روی این event تو VS بزنیم که handler اش رو برامون بنویسه، بهتره که متود Onload رو در کلاسمون override کنیم. اینطوری هم event مورد نیازمون رو گرفتیم، هم سرعت اجرای کدمون بالاتره...

Mrs.Net
شنبه 02 تیر 1386, 15:59 عصر
... امروزه خیلی از ایرانیها وقتی میخوان...
woow!!!

هم سرعت اجرای کدمون بالاتره... میشه دلیل این حرفتونو بگین من هم بدونم؟
و اینکه اگه override کردن OnLoad بهتر از استفاده از Load هست چرا مایکروسافت این رویداد(البته برای ما ایرانیها) ساخته؟


سلام. می خواهم زمان خروج از maskedTextBox فرمت مقدارورودی را چک کنم در ضمن میشه بگین چرا از رویداد Leave برای چک کردن مقدارتون استفاده نمیکنید؟ این رویداد هنگامی که از masked خارج میشید (یاهمون lost focus میشه) صدا زده میشه

mehdi.mousavi
شنبه 02 تیر 1386, 16:22 عصر
woow!!!
میشه دلیل این حرفتونو بگین من هم بدونم؟
و اینکه اگه override کردن OnLoad بهتر از استفاده از Load هست چرا مایکروسافت این رویداد(البته برای ما ایرانیها) ساخته؟

در ضمن میشه بگین چرا از رویداد Leave برای چک کردن مقدارتون استفاده نمیکنید؟ این رویداد هنگامی که از masked خارج میشید (یاهمون lost focus میشه) صدا زده میشه


سلام.
از این woow خیلی خوشم اومد. اما بریم سر اصل مطلب:

چرا استفاده از OnLoad سریعتر از گرفتن Load Event هستش؟ برای جواب به این سوال اول باید بدونیم که Event ها چی هستن و چطوری در CLR اونها رو Implement کردن. اینا رو میتونید رو سایت msdn پیدا کنید. اگر همه میدونستیم که Register کردن یه event handler چه کار پر هزینه ای هستش (در مقابل override کردن یک متود) اونوقت همینطوری ازش استفاده نمیکردیم.

اما مایکروسافت چرا این رویدادها رو ساخته؟ اگر دقت کنید این رویداد ها public هستن. این داره چی رو میگه؟ داره میگه اگه کسی خارج از یه کلاس خواست این event رو بگیره، میتونه. کد زیر رو در نظر بگیرید:



Form1 frm = new Form1();
frm.Load += new EventHandler(delegate(object sender, EventArgs e) { });
همونطوری که میبینید، کسی که داره از frm استفاده میکنه، میتونه Load رو بگیره و کارش رو انجام بده. واسه اینه که مایکروسافت Load رو گذاشته. اما وقتی شما دارید کلاس Form1 رو درست میکنید، همه اون کلاس و قابلیتهایی که داره دست شماست. درسته که میتونید event رو بطریق مشابه بگیرید و ... اما در داخل یک کلاس override کردن یک متود ارجحیت داره.

در مورد مساله آخر هم باید بگم که LostFocus و Leave به دو طریق متفاوت کار میکنن، درست مثل Enter و GotFocus و هر کدوم کاربرد های خودشون رو دارن. بازم اگه به msdn رجوع کنید تفاوتهاشون رو میتونید بخونید.