PDA

View Full Version : سوال: جلوگیری از تکرار کد برای رویداد هر شیء در روی فرم



hanis29268
یک شنبه 16 مرداد 1390, 00:13 صبح
سلام
روزه نمازها قبول
دوستان من برای هر textboxدر رویداد enter کد زیر رو مینویسم،مثلا برای texttbox10 این رو مینویسم:
textBox10.BackColor = Color.Yellow;
textBox10.SelectAll();
حالا چه طوری میتونم این کد رو طوری بنویسم که مجیور نشم برای تک تک TEXTBOXهام تکرارش کنم آخه این فرمم 73تاtextbox داره؟؟
ممنون از لطفتون

quantomquery
یک شنبه 16 مرداد 1390, 01:16 صبح
سلام
میتونی از linq و delegate استفاده کنی با 3 یا 4 خط میتونی کار 70-80 خط رو انجام بدی
خودم وقتی یادم میآد که یه بار برای 100 تا دکمه این کارا رو کردم حرصم در می اد -- بی کار بودیم ه اااااااا

بالای فرمت linq رو یوزینگ کن :



using System.Linq;


بعد تو لود فرمت بنویس :


Controls.OfType<TextBox>().Select(N => N).ToList().ForEach(n => n.Enter += new EventHandler(textBox_Enter));


بعد این متد رو تو بدنه فرمت بنویس (مثلا بعد از بسته شدن آکولات فرم لود) :


private void textBox_Enter(object sender, EventArgs e)
{
((TextBox)sender).BackColor = Color.Yellow;
((TextBox)sender).SelectAll();
}




موفق باشی

@000002@
یک شنبه 16 مرداد 1390, 01:45 صبح
با سلام خدمت دوستان
ما روی فرممون 5 textbox داریم که باید فقط عدد بگیرن ، درست
حالا بجای که برای هر 5 تا ، کد مربوطه رو بنویسیم میشه با این روش یک بار نوشتش که هر 5 تا فقط عدد بگیرن

mmd2009
یک شنبه 16 مرداد 1390, 02:12 صبح
با سلام

بهتره از یک یوزرکنترل استفاده بکنید و از TextBox ارث ببرید و کدهای که میدونید رو اونجا قرار بدید و کلا دیگه تو محیط برنامه نویسی خودتون درگیر همچنین کدهای نشید و برنامتون رو شلوغ نکنید

موفق باشید

@000002@
یک شنبه 16 مرداد 1390, 02:52 صبح
سلام دوست عزیز میشه بیشتر توضیح بدی و چند تا کد همراه با توضیحاتت قرار بدی
بسیار ممنون میشم

saman6384
یک شنبه 16 مرداد 1390, 13:00 عصر
ینی مثلا این :


using System;
using System.Windows.Forms;
namespace Random
{
class SampleTextBox : TextBox
{
protected override void OnEnter(EventArgs e)
{
this.SelectAll();
base.OnEnter(e);
}
protected override void OnClick(EventArgs e)
{
this.SelectAll();
base.OnClick(e);
}
}
}

quantomquery
یک شنبه 16 مرداد 1390, 13:40 عصر
سلام
بابت لطفتون تشکر
من معنی کدی ک باید توی لود فرم بنویسم رو نفهمیدم؟؟؟
اگه ممکن هست توضیح بدید یا یه فایل آموزشی برام بفرستید.
ممنون

معنی (همینطور کلمه به کلمه میگم - خودمونی) :
برو تو کنترلهای روی فرم (که داخل controls نگهداری می شن) و تکست باکس ها رو بگیر و انتخاب کن و توی لیست بزار و به هر کدوم از اونها یه event handler به نام textBox_Enter اظافه کن (یعنی دنبال تابع textBox_Enter بگرد)

باید بری دنبال linq و یاد بگیری - البته من خودم هم تازه کارم توش - خیلی جا ها بدرد می خوره

موفق باشید

wolf_majid
یک شنبه 16 مرداد 1390, 14:29 عصر
یک تابع تعریف کنید
سپس رویداد enter تمام جعبه متن ها رو به اون نسبت بدید
مثل زیر :

private void AllTxt_Enter(object sender, EventArgs e)
{
((TextBox)sender).BackColor = Color.Yellow;
((TextBox)sender).SelectAll();
}

حالا برای اضافه شدن این تابع به رویداد کلیک جعبه متن ها :

private void Form1_Load(object sender, EventArgs e)
{
AddEnterEventForTxt(this);
}

private void AddEnterEventForTxt(Control _ctrl)
{
try
{
foreach (Control ctrl in _ctrl.Controls)
{

if (ctrl is GroupBox || ctrl is Panel)
AddEnterEventForTxt(ctrl);
else if (ctrl is TextBox)
ctrl.Enter += new System.EventHandler(AllTxt_Enter);
}
}
catch { }
};


ببخشید من پست دوست عزیز جناب quantomquerry رو ندیدم
لطفا" این پست حذف بشه

man_iran
یک شنبه 16 مرداد 1390, 15:17 عصر
سلام
میتونی از linq و delegate استفاده کنی با 3 یا 4 خط میتونی کار 70-80 خط رو انجام بدی
خودم وقتی یادم میآد که یه بار برای 100 تا دکمه این کارا رو کردم حرصم در می اد -- بی کار بودیم ه اااااااا

بالای فرمت linq رو یوزینگ کن :



using System.Linq;


بعد تو لود فرمت بنویس :


Controls.OfType<TextBox>().Select(N => N).ToList().ForEach(n => n.Enter += new EventHandler(textBox_Enter));


بعد این متد رو تو بدنه فرمت بنویس (مثلا بعد از بسته شدن آکولات فرم لود) :


private void textBox_Enter(object sender, EventArgs e)
{
((TextBox)sender).BackColor = Color.Yellow;
((TextBox)sender).SelectAll();
}




موفق باشی

ببخشید من متوجه نشدم هدف از استفاده از دستور linq توی این مثال چی هست؟
می شه فقط از تابع نوشته شده استفاده کنیم بعد همان طور که خودتون هم گفتید تمام تکست باکس هایی که می خوایم این اعمال روشون اتفاق بیفته رو انتخاب کرده و توی رویداد مورد نظر، این تابع رو درج کنیم. همین.

پس برای چی linq نوشتید؟

quantomquery
یک شنبه 16 مرداد 1390, 15:31 عصر
سلام

اگه بخوای برای 100 تا تکست باکس این کارو انجام بدی چند بار باید انجام بدی == 100 بار

ولی با این یک خط کد توی فرم لود 1000 تا تکست باکس هم داشته باشی باز هم خودش انجام می ده

man_iran
یک شنبه 16 مرداد 1390, 15:37 عصر
سلام

اگه بخوای برای 100 تا تکست باکس این کارو انجام بدی چند بار باید انجام بدی == 100 بار

ولی با این یک خط کد توی فرم لود 1000 تا تکست باکس هم داشته باشی باز هم خودش انجام می ده

با این جمله مخالفم. اگر 100 تا تکست باکس داشته باشیم 100تاش رو انتخاب می کنیم (سلکت می کنیم) بعد فقط یکبار رویداد enter رو تنظیم می کنیم خودبه خود برای همه تنظیم می شه.

quantomquery
یک شنبه 16 مرداد 1390, 16:11 عصر
خب این هم شد همون دیگه
یعنی 100 خط تو دیزاین فرمت اظافه شد نه یک خط

man_iran
یک شنبه 16 مرداد 1390, 17:36 عصر
خب این هم شد همون دیگه
یعنی 100 خط تو دیزاین فرمت اظافه شد نه یک خط

درسته ولی وقتی linq می زنید اون هم همین کار رو انجام می ده ولی وقتی برنامه اجرا می شه پس باعث کند شدن برنامه هم ممکنه بشه

saman6384
یک شنبه 16 مرداد 1390, 18:13 عصر
خوب چرا خودتونو اینقد اذیت میکنید :لبخند:
یه کلاس ارث بری شده درست کنید
5 خط کد همش میخاد :لبخند:

man_iran
یک شنبه 16 مرداد 1390, 18:31 عصر
خوب چرا خودتونو اینقد اذیت میکنید :لبخند:
یه کلاس ارث بری شده درست کنید
5 خط کد همش میخاد :لبخند:

بله صحبت شما کاملا درست هست.
وقتی قراره از این امکان در تمام پروژه استفاده کنیم می شه کدها را با کمی تغییر توی یه کلاس گذاشت و از آنها ارث بری کرد.
ولی صحبت من در مورد استفاده از linq توی این نوع مثال بود که به نظر کار اشتباهیه (البته این نظر منه دوستان ممکنه نظرات مختلفی داشته باشن)

gwbasic
دوشنبه 17 مرداد 1390, 08:59 صبح
ولی صحبت من در مورد استفاده از linq توی این نوع مثال بود که به نظر کار اشتباهیه (البته این نظر منه دوستان ممکنه نظرات مختلفی داشته باشن)
استفاده از linq هیچ اشکالی نداره و دقیقا همون کاری رو انجام می ده که designer کد نویسی می کنه موضوع اتصال یک متد به یک رویداد که در هر دو حالت داره انجام می شه کوچکترین فرقی با هم ندارند. کدی که توسط designer ایجاد می شه درست موقع نمونه گرفتن شی این اتصال رو ایجاد می کنه و در حالت استفاده از linq این اتفاق برای همه اشیاء در یک حلقه می افته پس جای هیچ نگرانی نیست

quantomquery
دوشنبه 17 مرداد 1390, 11:40 صبح
درسته ولی وقتی linq می زنید اون هم همین کار رو انجام می ده ولی وقتی برنامه اجرا می شه پس باعث کند شدن برنامه هم ممکنه بشه


استفاده از linq هیچ اشکالی نداره و دقیقا همون کاری رو انجام می ده که designer کد نویسی می کنه موضوع اتصال یک متد به یک رویداد که در هر دو حالت داره انجام می شه کوچکترین فرقی با هم ندارند. کدی که توسط designer ایجاد می شه درست موقع نمونه گرفتن شی این اتصال رو ایجاد می کنه و در حالت استفاده از linq این اتفاق برای همه اشیاء در یک حلقه می افته پس جای هیچ نگرانی نیست

سلام
این دوتا قسمت قرمز رنگ رو تا حالا نمی دونستم و الان یه چیزی یاد گرفتم ممنون .
حالا یه سوال ایا استفاده از linq برنامه رو کند تر از حالت استفاده از دیزاینر می کنه ؟(ابی رنگ)

gwbasic
دوشنبه 17 مرداد 1390, 12:51 عصر
تفاوت بسیار ناچیزه و اصلا قابل لمس نیست

man_iran
دوشنبه 17 مرداد 1390, 15:26 عصر
یه چیز کلی:
بهتره از هر امکان در جای مناسب خودش استفاده بشه. وقتی می توان عملی رو بخوبی توی زمان کامپایل برنامه ایجاد کرد بهتر است دیگه اون رو به زمان اجرای برنامه منتقل نکنیم. (که توی برنامه های بزرگ باعث کند شدن برنامه میشه)
بطور مثال: شما می تونید مثال همین تاپیک رو توی دو حالت انجام بدید حالت اول) زمان کدنویسی رویداد مورد نظر رو به تمام کنترل ها ست کنید. حالت دوم) زمان اجرای برنامه رویداد مورد نظر رو به تمام کنترل ها ست کنید (با استفاده از همان دستوراتی که نوشتید)
تویه نگاه اول ممکنه تصور کنید حالت دوم کدهای کمتری توی برنامه داره ولی اینطور نیست!! چون همان کدهایی که توی حالت اول ایجاد می شه تویه حالت دوم هم در زمان اجرای برنامه ایجاد میشه

این چیزها توی برنامه های کوچیک حس نمی شن ولی توی برنامه های بزرگ به مشکل بر می خورید.

راستی در مورد linq به هیچ وجه نمی شه گفت باعث کندشدن برنامه می شه البته اگر در جای درستش استفاده بشه. اصلا یکی از هدف های linq بالابردن سرعت برنامه است.

gwbasic
دوشنبه 17 مرداد 1390, 15:54 عصر
بهتره از هر امکان در جای مناسب خودش استفاده بشه. وقتی می توان عملی رو بخوبی توی زمان کامپایل برنامه ایجاد کرد بهتر است دیگه اون رو به زمان اجرای برنامه منتقل نکنیم. (که توی برنامه های بزرگ باعث کند شدن برنامه میشه)


دوست عزیز متوجه نمی شم منظور شما از زمان کامپایل و زمان اجرا چیه یعنی کدی که Designer ویژوال استودیو می نویسه با کدی رو که ما نوشتیم (linq) یکی در زمان کامپایل و دیگری زمان اجرا ، اجرا می شه!!!!!!!!!!
فکر می کنم مفهوم این دو رو خوب متوجه نشدید ، زمان کامپایل سینتکس بررسی می شه و کد کامپایل می شه و کد IL ایجاد می شه و این زمان اجرا هست که اشیاء ایجاد می شه مثل فرم و کنترل ها و همونجا متد ها به رویدادهای مورد نظر متصل می شه بنابراین هیچ فرقی وجود نداره و هر دو زمان اجرا ایجاد می شن
احتمالا نمی گین که textbox ها زمان کامپایل ایجاد می شن!!!!!!!!!

hanis29268
دوشنبه 17 مرداد 1390, 16:25 عصر
SELECT میکنه ولی تغییر رنگ نمیده؟؟؟؟؟؟؟؟؟؟؟؟

سلام
میتونی از linq و delegate استفاده کنی با 3 یا 4 خط میتونی کار 70-80 خط رو انجام بدی
خودم وقتی یادم میآد که یه بار برای 100 تا دکمه این کارا رو کردم حرصم در می اد -- بی کار بودیم ه اااااااا

بالای فرمت linq رو یوزینگ کن :

1
2
using System.Linq;


بعد تو لود فرمت بنویس :
1
2
Controls.OfType<TextBox>().Select(N => N).ToList().ForEach(n => n.Enter += new EventHandler(textBox_Enter));


بعد این متد رو تو بدنه فرمت بنویس (مثلا بعد از بسته شدن آکولات فرم لود) :
1
2
3
4
5
6
7
private void textBox_Enter(object sender, EventArgs e)
{
((TextBox)sender).BackColor = Color.Yellow;
((TextBox)sender).SelectAll();
}



موفق باشی

man_iran
دوشنبه 17 مرداد 1390, 23:37 عصر
دوست عزیز متوجه نمی شم منظور شما از زمان کامپایل و زمان اجرا چیه یعنی کدی که Designer ویژوال استودیو می نویسه با کدی رو که ما نوشتیم (linq) یکی در زمان کامپایل و دیگری زمان اجرا ، اجرا می شه!!!!!!!!!!
فکر می کنم مفهوم این دو رو خوب متوجه نشدید ، زمان کامپایل سینتکس بررسی می شه و کد کامپایل می شه و کد IL ایجاد می شه و این زمان اجرا هست که اشیاء ایجاد می شه مثل فرم و کنترل ها و همونجا متد ها به رویدادهای مورد نظر متصل می شه بنابراین هیچ فرقی وجود نداره و هر دو زمان اجرا ایجاد می شن
احتمالا نمی گین که textbox ها زمان کامپایل ایجاد می شن!!!!!!!!!

ببینید من در مورد ست کردن رویداد به کنترل ها اون موضوع رو گفتم نه برای اجرای اون. توی حالتی که با linq این کار رو می کنیم کد linq در زمان کامپایل ترجمه می شه (به کد میانی) ولی رویداد رو برای تمام کنترل ها ست نمی کنه (به نظر من). وقتی فرم لود می شه و تمام کنترل ها ایجاد می شند (اشیا و...) رویداد مورد نظر هم به تمام کنترل ها ست می شه.
تویه حالتی که کد توی Designer ثبت میشه وقتی کد کامپایل میشه توی کد میانی مشخص می شه که این رویداد برای فلان کنترل هاست. ولی وقتی از اون دستور linq استفاده می کنیم توی زمان کامپایل فقط دستور linq به کد میانی تبدیل میشه ولی رویداد برای کنترل ها ست نمیشه و ست کردن زمان لود فرم انجام میشه

یه سوال: ما می تونیم یه کنترل مثل لیبل رو زمان اجرا ایجاد کنیم. یعنی مثلا یه باتون بزاریم و هر وقت روش کلیک کنیم یه لیبل ایجاد بشه. حالا این چه فرقی با لیبلی که ما توی کد نویسی ایجاد کردیم می کنه؟

gwbasic
سه شنبه 18 مرداد 1390, 08:54 صبح
ببینید من در مورد ست کردن رویداد به کنترل ها اون موضوع رو گفتم نه برای اجرای اون. توی حالتی که با linq این کار رو می کنیم کد linq در زمان کامپایل ترجمه می شه (به کد میانی) ولی رویداد رو برای تمام کنترل ها ست نمی کنه (به نظر من). وقتی فرم لود می شه و تمام کنترل ها ایجاد می شند (اشیا و...) رویداد مورد نظر هم به تمام کنترل ها ست می شه.
تویه حالتی که کد توی Designer ثبت میشه وقتی کد کامپایل میشه توی کد میانی مشخص می شه که این رویداد برای فلان کنترل هاست. ولی وقتی از اون دستور linq استفاده می کنیم توی زمان کامپایل فقط دستور linq به کد میانی تبدیل میشه ولی رویداد برای کنترل ها ست نمیشه و ست کردن زمان لود فرم انجام میشه

یه سوال: ما می تونیم یه کنترل مثل لیبل رو زمان اجرا ایجاد کنیم. یعنی مثلا یه باتون بزاریم و هر وقت روش کلیک کنیم یه لیبل ایجاد بشه. حالا این چه فرقی با لیبلی که ما توی کد نویسی ایجاد کردیم می کنه؟

بحث خیلی داره به درازا می کشه فکر می کنم یکمی کدهایی رو که Designer نوشته رو بررسی کنید بتونید متوجه منظورم بشید اما بذارید من یه سناریو رو بگم
وقتی یک فرم new می شه یه نمونه ازش ساخته می شه و سازنده فرم صدا زده می شه تو سازنده متدی صدا زده می شه به نام InitializeComponent توی این متد کدهایی رو که designer تولید کرده اجرا می شه این کد ها چی هستند به فرض یک button به نام button1 روی فرم انداختیم توی متد یک نمونه از شی Button ایجاد می شه و بعد موقعیت اون روی فرم مقدار دهی می شه و در نهایت این کنترل به کنترل های فرم اضافه می شه خوب این تا اینجا
(قبل ار ادامه یه مطلبی در مورد رویدادها بگم : ببینید رویدادها از قبل نوشته شدن برای هر کنترلی مثل Button یعنی اینکه وقتی روی button1 کلیک می کنیم رویداد کلیک اتفاق می افته چه ما متدی رو به این رویداد وصل کرده باشیم چه نه)
خوب اگه ما تو Designer متدی رو به رویداد کلیک وصل کنیم کدی که DEsigner می نویسه هنگام new شدن button1 این کد هم نوشته می شه پس ببینید ابتدا شی button1 ایجاد می شه بعد متد به رویداد کلیک وصل می شه همه این اتفاق ها در سازنده می افته حالا وقتی که ما متد Show یا ShowDialog فرم رو صدا می زنیم رویداد FormLoad اتفاق می افته و فرم نمایش داده می شه.

خوب اگه ما تو سازنده فرم یک متد صدا بزنیم به نام مثلا InitializeClickEvents و کد مربوط به وصل کردن رویداد کلیک کنترل ها رو اونجا بنویسیم به نظر شما چه فرقی می کنه ؟ هیچ فرقی نمی کنه فرقش در اینه که متد ما یکجا به همه رویداد ها وصل میشه
Designer فقط کارش اینه که ما برای ساخت فرم درگیر کد نویسی نشیم ما به صورت Visual فرم رو طراحی کنیم و اون برامون کدشو بنویسه دقت کنید که همه این کارارو ما خودمون هم بدون استفاده از DEsigner می تونیم انجام بدیم
امیدوارم که جوابتون رو گرفته باشید

در مورد سوالی هم که پرسیدید فرقش اینه که وقتی فرم load میشه لیبلی وجود نداره بلکه هنگامی که روی button کلیک می شه ، ایجاد می شه همین

man_iran
سه شنبه 18 مرداد 1390, 18:15 عصر
نمی دانم چرا مفهوم نوشته های مرا جور دیگه متوجه می شید (احتمال من بد توضیح دادم) بزارید جور دیگه و ساده تر بگم.
ببینید وقتی ما برنامه ای می نویسیم به کد میانی تبدیل می شه تا اینجا که با هم مشکلی نداریم حالا نحوه ایجاد اشیا و.. بماند. ولی اگر ما در کد نویسی (مثلا در دیزاینر) گفته باشیم فلان رویداد برای فلان تکست باکس هست این هم به کد میانی تبدیل می شود. حالا وقتی فرم لود می شه و متد InitializeComponent فراخوانی میشه، تمام کدهای میانی لازم برای آن فرم اجرا شده تا فرم مورد نظر لود بشه.
خب حالا اینجا توجه کنید:
وقتی ما مستقیما در کدنویسی مشخص کنیم رویداد textBox_Enter برای تکست باکس با نام txt8 است این کد میانی در InitializeComponent تولید میشه:



InitializeComponent

IL_0482: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox TB1.Form1::txt8
IL_0487: ldarg.0
IL_0488: ldftn instance void TB1.Form1::textBox_Enter(object,
class [mscorlib]System.EventArgs)


البته کد بالا خلاصه ای از کل کد میانی موجود در InitializeComponent هست. همان طور که می بینید مشخص شده رویداد مورد نظر برای txt8 است.
حالا توی حالتی که از اون دستور linq استفاده می کنیم چنین کدی تولید نمی شه و به جای آن دستور linq در متد لود فرم بصورت زیر به کد میانی تبدیل میشه:




IL_0002: call instance class [System.Windows.Forms]System.Windows.Forms.Control/ControlCollection [System.Windows.Forms]System.Windows.Forms.Control::get_Controls()
IL_0007: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0> [System.Core]System.Linq.Enumerable::OfType<class [System.Windows.Forms]System.Windows.Forms.TextBox>(class [mscorlib]System.Collections.IEnumerable)
IL_000c: ldsfld class [mscorlib]System.Func`2<class [System.Windows.Forms]System.Windows.Forms.TextBox,class [System.Windows.Forms]System.Windows.Forms.TextBox> TB1.Form1::'CS$<>9__CachedAnonymousMethodDelegate2'
IL_0011: brtrue.s IL_0026
IL_0013: ldnull
IL_0014: ldftn class [System.Windows.Forms]System.Windows.Forms.TextBox TB1.Form1::'<Form1_Load>b__1'(class [System.Windows.Forms]System.Windows.Forms.TextBox)
IL_001a: newobj instance void class [mscorlib]System.Func`2<class [System.Windows.Forms]System.Windows.Forms.TextBox,class [System.Windows.Forms]System.Windows.Forms.TextBox>::.ctor(object,
native int)
IL_001f: stsfld class [mscorlib]System.Func`2<class [System.Windows.Forms]System.Windows.Forms.TextBox,class [System.Windows.Forms]System.Windows.Forms.TextBox> TB1.Form1::'CS$<>9__CachedAnonymousMethodDelegate2'
IL_0024: br.s IL_0026
IL_0026: ldsfld class [mscorlib]System.Func`2<class [System.Windows.Forms]System.Windows.Forms.TextBox,class [System.Windows.Forms]System.Windows.Forms.TextBox> TB1.Form1::'CS$<>9__CachedAnonymousMethodDelegate2'
IL_002b: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!1> [System.Core]System.Linq.Enumerable::Select<class [System.Windows.Forms]System.Windows.Forms.TextBox,class [System.Windows.Forms]System.Windows.Forms.TextBox>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>,
class [mscorlib]System.Func`2<!!0,!!1>)
IL_0030: call class [mscorlib]System.Collections.Generic.List`1<!!0> [System.Core]System.Linq.Enumerable::ToList<class [System.Windows.Forms]System.Windows.Forms.TextBox>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>)
IL_0035: ldarg.0
IL_0036: ldftn instance void TB1.Form1::'<Form1_Load>b__0'(class [System.Windows.Forms]System.Windows.Forms.TextBox)
IL_003c: newobj instance void class [mscorlib]System.Action`1<class [System.Windows.Forms]System.Windows.Forms.TextBox>::.ctor(object,
native int)
IL_0041: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [System.Windows.Forms]System.Windows.Forms.TextBox>::ForEach(class [mscorlib]System.Action`1<!0>)
IL_0046: nop
IL_0047: ret

کد بالا هم وقتی متد لود فرم اجرا می شه مجبوره رویداد textBox_Enter را به تمام تکست باکس ها ست کنه (یعنی مشخص کنه این رویداد برای فلان تکست باکس است).

ببینید یکی از تفاوت دو روش: روش اول توی کد میانی مشخص شده رویداد textBox_Enter برای txt8 است ولی در حالتی که از linq استفاده می کنیم وقتی فرم لود می شه ابتدا باید این قضیه مشخص بشه (رویداد textBox_Enter برای txt8 است) بعد تمام اتفاقات مشترک برای لود فرم اتفاق بیفته.

شاید فکر کنید فرقی نمی کنه به هر حال روش دوم هم همان کار رو می کنه ولی حالت اول حداقل یک گام از حالت دوم جلوتر است. چونکه توی حالت دوم اول باید دستور linq اجرا بشه و بعد از ترجمه آن مشخص بشه رویداد textBox_Enter برای txt8 است. در صورتی که در حالت اول همان ابتدا این قضیه مشخص شده.
در حالت اول کد میانی طولانی تری خواهیم داشت مثلا فرض کنید اگر 100 تا تکست باکس داشته باشیم 100 بار کد اول تکرار میشه اما در حالت دوم هر چندتا تکست باکس داشته باشیم کد میانی تغییر نمی کنه ولی کدهای حالت اول سریعتر (هر چند خیلی ناچیز) به کد نهایی تبدیل می شند. پس برنامه سریعتری خواهیم داشت.

:::توجه کنید که مورد صحبت من نوع کد میانی تولید شده در هر دو حالت است:::

gwbasic
سه شنبه 18 مرداد 1390, 20:04 عصر
ضمن تشکر از شما با این پستتون کاملا موافقم. موردی که من بهش اشاره کردم این بود که هر دوی اینها زمان اجرا هست که اشیاء رو می سازه ودر کامپایل اولیه مطمئنا کدها متفاوت هست

wolf_majid
چهارشنبه 19 مرداد 1390, 01:56 صبح
سلام به همگی
اکثر پست ها رو خوندم و برام خیلی جالب بود
اما چیزی که از مطالب شما برداشت کردم
اولا" بگم ارث بری از نظر من اصلا" جالب نیست چون اگر یک تغییر کوچیک بخوایم بدیم یک دردسر بزرگ درست می شه (مثلا" تغییر رنگ از زرد به آبی )

دوما" به نظر من بهتره همیشه محکم کاری کنیم یعنی به جای اینکه تمامی جعبه متن ها رو انتخاب و یک تابع را به عنوان رخداد بهشون اختصاص بدیم یک تابع برای اختصاص رخداد به همه جعبه متن ها در نظر می گیریم چون اگر هر بار یک جعبه متن اضافه کنیم دوباره باید اون تابع را به رخداد مورد نظرش معرفی کنیم و ممکنه بر حسب اتفاق یادمون بره چنین کاری کنیم

سوما" من هم با نظر شما موافقم که دستور اختصاص رخداد نباید توی لود فرم باشه پس به جای لود فرم توی سازنده کلاس به کار می بریمش :
public Form1()
{
InitializeComponent();
AddEnterEventForTxt(this);
}

private void Form1_Load(object sender, EventArgs e)
{
// AddEnterEventForTxt(this);
}
که این کار باعث میشه دقیقا" مانند design عمل کنه و دیگه یک کد زمان اجرا نباشه