PDA

View Full Version : سوال: آيا راه حلي براي تكرار كدهاي زياد رويدادهاي كنترلها وجود دارد؟



complexcoding
دوشنبه 09 اردیبهشت 1392, 02:34 صبح
دوستان سلام
وقتي براي رويداد Mouse Enter كدي مي نويسم براي غير فعال شدنش در رويداد Mouse leave عكس همان كد رو مي نويسم حال اگر تعداد كنترل ها به 16 تا يا بيشتر برسه اونوقت يك عالمه كد زياد و سرگيجه آور داريم كه كار كدنويسي رو مشك مي كنه . من حدسم اينه كه درون يه حلقه for به تعداد كنترل هاي مربوطه اينكارو انجام بديم اما چطوريشو نميدونم ؟ ممنون اگر كسي نمونه كدي لطف كنه

mousa1992
دوشنبه 09 اردیبهشت 1392, 03:00 صبح
سلام

صبتون بخیر :D
نمونه کد زیر رو ببین

private void changeBorder(object sender)
{
TextBox textbox = ((TextBox)sender); // cast object to textbox

textbox.BorderStyle = BorderStyle.Fixed3D;
}

private void Reset(object sender)
{
TextBox textbox = ((TextBox)sender); // cast object to textbox

textbox.BorderStyle = BorderStyle.None;
}

private void textBox1_Enter(object sender, EventArgs e)
{
changeBorder(sender);
}

private void textBox1_Leave(object sender, EventArgs e)
{
Reset(sender);
}



دوتا متد تعریف شده به نام های changeborder , reset این دو متد objec ای رو به عنوان پارامتر ورودی میگیرند و اونو cast میکنن به texrbox و عملیات مورد نظر رو روی textbox انجام میدن خب حالا ما این متدها رو توی رویداد های leave , enter مربوط به textbox هایی فراخوانی کردیم و سندر رویداد رو به متدمون فرستادیم - با این کار هزارتا کنترل داشته باشی که همین عمل رو بخوان انجام بدن میتونی از یک تابع استفاده کنی
در ضمن با تعریف متدهایی به این شکل دیگه حتی نیازی به فراخوانی متد در رویداد های کنترل نیست ! کافیه که کشوی کنار نام رویداد رو باز کنی و اسم متد رو انتخاب کنی و ویژوال خودش کاراشو انجام میده

موفق باشی

nima.sh
دوشنبه 09 اردیبهشت 1392, 04:06 صبح
سلام دوست عزیز...
از Delegate ها استفاده کن...
موفق باشی...

complexcoding
دوشنبه 09 اردیبهشت 1392, 06:53 صبح
ممنون صبح شما هم بخير :-)
مي خواستم mouse enter و mouse leave رو بكار نبرم ديگه :-(

mousa1992
دوشنبه 09 اردیبهشت 1392, 10:42 صبح
سلام

فقط میخوای دوتا متد بنویسی برای رویدادهات و با ی حلقه میتونی این متدهارو به رویداد کنترل ها نسبت بدی - نمونه کد زیر رو ببین

حلقه رو تو رویداد paint نوشتم اینو ندید بگیر همینجوری ی جایی دم دستم اومد نوشتمش - شما میتونی توی سازنده فرم و یا فرم لود حلقه رو بنویسید

private void panel1_Paint(object sender, PaintEventArgs e)
{
foreach (Control control in Controls)
if (control is TextBox)
{
control.Leave += new EventHandler(textBox_Leave);
control.Enter += new EventHandler(textBox_Enter);
}
}

private void textBox_Enter(object sender, EventArgs e)
{
TextBox textbox = ((TextBox)sender); // cast object to textbox

textbox.BorderStyle = BorderStyle.Fixed3D;
}

private void textBox_Leave(object sender, EventArgs e)
{
TextBox textbox = ((TextBox)sender); // cast object to textbox

textbox.BorderStyle = BorderStyle.None;
}

از این ساده تر دیگه نمیشه
موفق باشی

complexcoding
دوشنبه 09 اردیبهشت 1392, 19:24 عصر
دوستان اين كدهاي منه ولي عمل نكرد؟؟

foreach (Control control in Controls)
if (control is Label)
{
control.Enter += new EventHandler(control_Enter);
control.Leave += new EventHandler(control_Leave);

}
//~~~~~~~~~~~~~~~~X~~~~~~~~~~~~~~~~~~~~

void control_Leave(object sender, EventArgs e)
{
Label lbl=((Label)sender);
lbl.BorderStyle = BorderStyle.None;
throw new NotImplementedException();
}

void control_Enter(object sender, EventArgs e)
{
Label lbl=((Label)sender);
lbl.BorderStyle = BorderStyle.Fixed3D;
throw new NotImplementedException();
}

mousa1992
سه شنبه 10 اردیبهشت 1392, 01:05 صبح
سلام
کدهاتون مشکلی ندارن فقط گویا این رویدادهای enter , leave مشکل داره! نمیدونم راستش تا بحال باهاشون کار نکردم در مورد label شما برای مثال رویداد click رو براشون تعریف کن جواب میده و یا بجای leave و enter میتونی از رویدادهای mouseLeave , mouse over استفاده کنی (اگه اشتباه نکنم همین دوتاست)

موفق باشی

wolf_majid
سه شنبه 10 اردیبهشت 1392, 09:30 صبح
اگر در زمان طراحی تمامی کنترل هات هست نیازی به حلقه نیست فقط کافیه تمامی کنترل ها رو انتخاب کنی و در قسمت event یک متد رو به همگی اون ها نسبت بدی
اما اگر در زمان اجرا ایجاد میشن همون لحظه ایجاد متد رخداد رو بهشون نسبت بده :
control.Enter += new EventHandler(control_Enter);
اما در مورد مشکل پست 6 :
اول از همه حلقه Foreach بسته نشده که احتمالا" توی کپی پیست به اینجا فراموش کردید (قبل از توابع باید بسته بشه)
حلقه foreach باید در سازنده کلاس فرم یا لود فرم نوشته بشه (بهتر است در سازنده و بعد از intializecomponent())
اون دستورات throw رو حذف کن

complexcoding
سه شنبه 10 اردیبهشت 1392, 15:25 عصر
اگر در زمان طراحی تمامی کنترل هات هست نیازی به حلقه نیست فقط کافیه تمامی کنترل ها رو انتخاب کنی و در قسمت event یک متد رو به همگی اون ها نسبت بدی
اما اگر در زمان اجرا ایجاد میشن همون لحظه ایجاد متد رخداد رو بهشون نسبت بده :در زمان طراحي كدهام هست اما من فقط به يه نوع از كنترل هام كه ليبل هستن مي خوام اين رويداد رو نسبت بدم.
foreach رو بستم اما افاقه اي نكرد . foreach رو در قسمت intializecomponent()) نوشتم كنترل ها رو نشناخت يا كمكي هم نكرد. دستورات throw رو پاك كردم باز هم كمكي نكرد.
درون كد control-Enter خواستم يك پيغام رو هم نمايش بدم نمايش نداد؟

mousa1992
سه شنبه 10 اردیبهشت 1392, 16:02 عصر
درون كد control-Enter خواستم يك پيغام رو هم نمايش بدم نمايش نداد؟

سلام
کدها مشکلی ندارن از رویداد MouseEnter استفاده کن حل میشه

موفق

wolf_majid
سه شنبه 10 اردیبهشت 1392, 16:59 عصر
تمامی کنترل ها در زمان طراحی وجود دارند (ضمیمه اول)
با استفاه از کد نویسی (ضمیمه دوم)