PDA

View Full Version : کدهای متفاوت برای یک رویداد



mahdi_7610
شنبه 04 آذر 1391, 16:46 عصر
سلام دوستان

فرض کنید من برای رویداد textBox1_TextChanged یک کدی نوشته ام

و قصد دارم یک کد دیگر بنویسم از قضا که این کد هم باید در رویداد textBox1_TextChanged نوشته شود

اما من قصد دارم هر کدام در یک TextChanged جدا باشد

چطور میشه این کار رو کرد؟

nima.sh
شنبه 04 آذر 1391, 19:09 عصر
سلام،اگه منظورتون رو واضح تر بیان کنید،شاید بهتر بتونم کمک کنم...

Mozhdeh.Hemati
شنبه 04 آذر 1391, 19:13 عصر
سلام،

به صورت زیر این کار امکان پذیر است:

private void Form1_Load(object sender, EventArgs e)
{
textBox1.TextChanged += new EventHandler(textBox1_TextChanged1);
textBox1.TextChanged += new EventHandler(textBox1_TextChanged2);
}

private void textBox1_TextChanged1(object sender, EventArgs e)
{
MessageBox.Show("دستورات بخش اول");
}

private void textBox1_TextChanged2(object sender, EventArgs e)
{
MessageBox.Show("دستورات بخش دوم");
}

gwbasic
یک شنبه 05 آذر 1391, 00:44 صبح
سوالتون چندان واضح نیست. اگر درست متوجه شده باشم شما قصد اجرای دو بخش کد رو در رویداد TextChanged دارید. در این صورت کافیه دو متد جداگانه برای این دو بخش تعریف کنید و سپس هر دوی این متدها رو در هندلر مربوط به رویداد TextChanged صدا بزنید.


سلام،

به صورت زیر این کار امکان پذیر است:

private void Form1_Load(object sender, EventArgs e)
{
textBox1.TextChanged += new EventHandler(textBox1_TextChanged1);
textBox1.TextChanged += new EventHandler(textBox1_TextChanged2);
}

private void textBox1_TextChanged1(object sender, EventArgs e)
{
MessageBox.Show("دستورات بخش اول");
}

private void textBox1_TextChanged2(object sender, EventArgs e)
{
MessageBox.Show("دستورات بخش دوم");
}

به لحاط فنی Attach کردن چند Handler به یک رویداد امکان پذیر است اما دو مورد رو باید در نظر داشت:
1- تضمینی به اجرای Handler ها به همان ترتیبی که Attach شده اند وجود ندارد و مهمتر از آن اینکه احتمال اجرای هم زمان وجود دارد.
2- هندل کردن خطاهای احتمالی و در کل نگهداری کد سخت می شود. چندان عرف نیست که در برای یک رویداد در یک فرم چندین Handler وجود داشته باشد.

Mozhdeh.Hemati
یک شنبه 05 آذر 1391, 10:06 صبح
بله با نظر آقای gwbasic موافقم. از این زاویه قضیه رو ندیده بودم!

پس با این تفاسیر این کار رو به صورت زیر انجام بدید بهتره:

private void textBox1_TextChanged(object sender, EventArgs e)
{
this.commands1();
this.commands2();
}

private void commands1()
{
MessageBox.Show("دستورات بخش اول");
}

private void commands2)
{
MessageBox.Show("دستورات بخش دوم");
}

mahdi_7610
یک شنبه 05 آذر 1391, 11:13 صبح
سلام
1- قصد داشتم خالی بودن TextBox ها را چک کنم . خب این کار رو با رویداد TextChanged مربوط به تکست باکس 1 انجام دادم
2- قصد داشتم کاربر فقط عدد در تکست باکس 1 بتونه وارد کنه . بنابراین باید کدها را در رویداد TextChanged مربوط به تکست باکس 1 قرار بدم.

از طرفی احتمال وجود مشکلاتی که gwbasic فرمودند وجود داشت.

بنابراین توی کلاس Designer.cs مربوط به فرم، همون قسمتی که خود ویژوال استادیو کدها را Generate می کنه یک رویداد جدید به نام textBox1_TextChanged1 ایجاد کردم .


textBox1.TextChanged += new EventHandler(textBox1_TextChanged1);

اما همچنان مشکل وجود داشت .

بنابراین مجبور شدم برای هر کدام یک روال جداگانه تعریف کنم .

gwbasic
دوشنبه 06 آذر 1391, 07:12 صبح
ببینید هرچی سوالتون رو کاملتر و جامع تر مطرح کنید سریعتر به نتیجه مطلوب می رسید.
ج1- نمی دونم هدفتون از چک کردن خالی بودن TextBox ها در رویداد TextChanged یک TextBox دیگه چیه؟ معمولا خالی بودن رو هنگام ذخیره تغییرات و Validation نهایی انجام می دن البته سناریو بسیار زیاد هست واستثنا وجود داره در هر صورت منطقتون رو در یک یا چند متد می تونید پیاده سازی کنید تا اصل Dry رو رعایت کرده باشید و کد تکراری ننویسید.
ج2- برای این منظور هم کافیه یک Inherited control از روی TextBox بسازید با نام NumericTextBox تا فقط عدد وارد شود و باز منطق رو یکبار وفقط در این کنترل بنویسید و بارها ازش استفاده کنید. نمونه برای NumericTextBox زیاد هست نیاز به نوشتن هم نیست می تونید جستجو کنید و کنترلی مناسب نیازتون پیدا کنید