PDA

View Full Version : سوال: Event انحصاری در کنترل های داینامیک



mohsenmxp
چهارشنبه 02 اسفند 1391, 12:46 عصر
با سلام
خیلی جست جو کردم اما به نتیجه نرسیدم:

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

چطور می تونم رویداد کلیک رو برای هر button داینامیک مجزا کنم ؟


private void button1_Click(object sender, EventArgs e)
{

int i=0;
for (i = 0; i <= 3; i++)
{
Button btn = new Button();
flowLayoutPanel1.Controls.Add(btn);
btn.Text = dataGridView1.Rows[i].Cells[1].Value.ToString();
btn.Click+=new EventHandler(btn_Click);

}
}

private void btn_Click(object sender, EventArgs e)
{
this.Text = btn.text.ToString();
}

youngold
چهارشنبه 02 اسفند 1391, 14:26 عصر
برای چنین خصوصی سازی باید به صورت دستی اشیاتون رو بسازید
ضمن اینکه این کارتون اصلاً منطقی نیست اما بدم نمیاد ذکر کنم که به طرز احمقانه ای با system.reflection این کار ممکنه!
حالا من از شما میپرسم واقعاً اگر قراره این متد ها برای هر شی خصوصی سازی بشه اونم برای تنها 3 شی چطور شما حاضر نیستید 3 شی رو به طور جداگانه بسازید و از حلقه for استفاده میکنید؟
من به این حالت که شما درگیرش شدید میگم دایره منطق وحشی، که بعضی مواقع برنامه نویس های حرفه ای هم به اشکال گوناگون درگیرش میشن البته این نمونه شما خیلی سادست
مسلماً اگر تعداد متد های خصوصی سازی شده در اون حد زیاد بود که از حلقه استفاده کنید نمیتونستید تعداد زیادی متد رو خصوصی سازی کنید

mohsenmxp
پنج شنبه 03 اسفند 1391, 00:29 صبح
ممنون از توجهی که کردید

درست و غلط بودن الان برای من اهمیت نداره
ضمنا این عدد 3 به صورت فرضی هستش
اگه ممکنه پاسخ مشکلم رو بدید
ممنون

مهرداد صفا
پنج شنبه 03 اسفند 1391, 08:31 صبح
با سلام.
همانطور که در این تاپیک (http://barnamenevis.org/showthread.php?366856-چطور-رویداد-کلیک-را-برای-دکمه-اضافه-کنم؟) مشاهده می کنید، میتوان با داشتن نام متود به صورت رشته آن را به رویداد کنترل برای هندل کردن آن اضافه کرد. با این حساب می توانید نام متود هایی را که برای هندل کردن رویداد کنترل ها در نظر گرفته اید را به گونه ای انتخاب کنید که بتوان با استفاده از شمارنده حلقه به آن دسترسی داشت، مثلا button1_click,button2_click....
روش کار به این صورت خواهد بود که هندلر رویداد مورد نظر را یک lambda در نظر می گیریم و در آن با استفاده از متود GetType یک Type از کلاسی که متودهای هندلر در آن تعریف شده اند (در اینجا کلاس جاری) به دست می آوریم. سپس با استفاده از نام sender و متود Type.GetMethod یک MethodInfo از متودی که برای هندل کردن رویداد در نظر گرفتیم به دست می آوریم و آن را Invoke می کنیم. به این صورت:

//in the name of god
//صل الله علی محمد و آله

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Size = new Size(640, 480);
for (int i = 1; i <= 3; i++)
{
Button newButton = new Button();
newButton.Text = "button" + i.ToString();
newButton.Top = 400;
newButton.Left = i * 120;//...
newButton.Name = newButton.Text;
newButton.Click += (sender, e) =>
this.GetType().GetMethod((sender as Control).Name + "_click").Invoke(
this, new object[2] { sender, e });
this.Controls.Add(newButton);
}

}

public void button1_click(object sender, EventArgs e)
{
MessageBox.Show("Button1 clicked!");
}

public void button2_click(object sender, EventArgs e)
{
MessageBox.Show("button2 clicked!");
}

public void button3_click(object sender, EventArgs e)
{
MessageBox.Show("button3 clicked!");
}
}
}


شاید یکی دو خطی در مورد MethodInfo.Invoke در این تاپیک (http://barnamenevis.org/showthread.php?385311-استفاده-از-فایل-resource-به-عنوان-reference) پیدا کنید.

مشکلی بود بفرمایید.

mohsenmxp
جمعه 04 اسفند 1391, 17:47 عصر
سلام

ممنون که وقت گذاشتید

در اصل برنامه ی من به این صورته :

گرید ویویی هست که پیمایش میشه و به ازاء هر رکورد اون یک button ایجاد میشه ( در این حالت ممکنه تعداد رکورد ها به 50 تا هم برسه) در ادامه نام button برابر با فیلد ID و برچسب button برابر با فیلد نام می شود

در رویداد کلیک هر button یه message box وجود داره که مقدار نام button (که همان ID هست ) رو نمایش میده

پس محتوای رویداد ها یکی نیست و از طرفی بفرض برای 50 button نمیشه 50 رویداد نوشت !

حالا به نظر شما ممکنه یک رویداد نوشت که ( با توجه به شرایطی که برای رویداد عرض کردم ) تمام button ها رو پوشش بده ؟

مهرداد صفا
یک شنبه 06 اسفند 1391, 18:28 عصر
سلام

ممنون که وقت گذاشتید

در اصل برنامه ی من به این صورته :

گرید ویویی هست که پیمایش میشه و به ازاء هر رکورد اون یک button ایجاد میشه ( در این حالت ممکنه تعداد رکورد ها به 50 تا هم برسه) در ادامه نام button برابر با فیلد ID و برچسب button برابر با فیلد نام می شود

در رویداد کلیک هر button یه message box وجود داره که مقدار نام button (که همان ID هست ) رو نمایش میده

پس محتوای رویداد ها یکی نیست و از طرفی بفرض برای 50 button نمیشه 50 رویداد نوشت !

حالا به نظر شما ممکنه یک رویداد نوشت که ( با توجه به شرایطی که برای رویداد عرض کردم ) تمام button ها رو پوشش بده ؟


سلام. خواهش می کنم.
با این حساب چون شما یک عملیات خاص و روشن را روی فرستنده رویداد (button) انجام می دهید، می توانید از یک روال مشترک برای هندل کردن رویداد تمام button ها استفاده کنید. فکر میکنم مثال زیر گویای مطلب باشد:

//in the name of god
//صل الله علی محمد و آله


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Size = new Size(640, 480);
for(int i = 1; i <= 3; i++)
{
Button newButton = new Button();
newButton.Text = "button"+ i.ToString();
newButton.Top = 400;
newButton.Left = i * 120;//...
newButton.Name = newButton.Text;
newButton.Click += new EventHandler(ButtonClick);


this.Controls.Add(newButton);
}
}

public void ButtonClick(object sender, EventArgs e)
{
MessageBox.Show((sender as Control).Text + " clicked!");
}
}
}

mohsenmxp
سه شنبه 08 اسفند 1391, 16:59 عصر
واقعا ممنونم
به کل مشکل بر طرف شد

حالا سوالی دارم : در مورد (sender as Control) میشه بیشتر توضیح بدید که چی هست و چه کاری انجام میده ؟

youngold
سه شنبه 08 اسفند 1391, 18:34 عصر
واقعا ممنونم
به کل مشکل بر طرف شد

حالا سوالی دارم : در مورد (sender as Control) میشه بیشتر توضیح بدید که چی هست و چه کاری انجام میده ؟

در event ،خود کنترل ارسال کننده هم پارامتر میشه به متد شما. با sender as Control که به نوعی همون

(Control)sender
هست نوع شی پرتاب شده رو که Control هست رو تعیین میکنید تا مقدار تکستش رو در بیارید