PDA

View Full Version : نحوه نوشتن رویداد برای شی ساخته شده در زمان اجرا



modirmasool
یک شنبه 18 مهر 1389, 14:50 عصر
دوستان من چند دکمه رو با حلقه به صورت زیر، در زمان اجرا میسازم.


for (int i = 1; i < 10; i++)
{
Button btn = new Button();
btn.Name = "btn" + i.ToString();
...
...
و الی آخر...


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

با تشکر

na3er-faraji
یک شنبه 18 مهر 1389, 14:58 عصر
Button button1 = new Button();
button1.KeyDown += new KeyEventHandler(button1_KeyDown);
}

void button1_KeyDown(object sender, KeyEventArgs e)
{
throw new NotImplementedException();
}

البته += رو که بزنی بعد دو تا tab بزنی خودش همه چیز رو اتوماتیک میسازه

mmd2009
یک شنبه 18 مهر 1389, 16:34 عصر
با سلام

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



private void button1_Click(object sender, EventArgs e)
{
for (int i = 1; i < 10; i++)
{
Button btn = new Button();
btn.Name = "btn" + i.ToString();
btn.Click += new EventHandler(this.btn_Click);
this.flowLayoutPanel1.Controls.Add(btn);
}
}

void btn_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
MessageBox.Show("NameButton = " + btn.Name);
}

modirmasool
یک شنبه 18 مهر 1389, 18:37 عصر
ممنون. حالا چطور باید با استفاده از یه دکمه دیگه که در زمان طراحی ایجاد شده، کدی بنویسم تا مثلا text یکی از دکمه های فوق رو عوض کنم؟

Reza_Yarahmadi
یک شنبه 18 مهر 1389, 21:44 عصر
با کدی مثل کد زیر میتونید این کار رو انجام بدید.

foreach (Control ctrl in this.Controls)
if (ctrl is Button)
if (ctrl.Name == "Your Name")
ctrl.Text = "Your Text";

modirmasool
یک شنبه 18 مهر 1389, 22:08 عصر
با کدی مثل کد زیر میتونید این کار رو انجام بدید.

foreach (Control ctrl in this.Controls)
if (ctrl is Button)
if (ctrl.Name == "Your Name")
ctrl.Text = "Your Text";

ممنون. اینم روش جالبی بود. ولی نمیشه مستقیم بهش دسترسی پیدا کرد؟

Reza_Yarahmadi
یک شنبه 18 مهر 1389, 22:31 عصر
با indexer میشه راحتتر این کار رو انجام داد ولی باید حواستون باشه نام تکراری برای کنترلها نذارید.

public Control this[string ControlName]
{
get { return this.Controls[ControlName]; }
}طریقه استفاده اش هم

this["btn1"].Text = "Your Name";ولی اگر منظورتون اینه که فرضا بنویسید btn1.Text .... شدنی نیست چون زمان طراحی از نام و تعداد کنترلها اطلاعی نیست.

modirmasool
یک شنبه 18 مهر 1389, 23:41 عصر
با indexer میشه راحتتر این کار رو انجام داد ولی باید حواستون باشه نام تکراری برای کنترلها نذارید.

public Control this[string ControlName]
{
get { return this.Controls[ControlName]; }
}طریقه استفاده اش هم

this["btn1"].Text = "Your Name";ولی اگر منظورتون اینه که فرضا بنویسید btn1.Text .... شدنی نیست چون زمان طراحی از نام و تعداد کنترلها اطلاعی نیست.

برای من خطا میگیره.


Object reference not set to an instance of an object.

mmd2009
دوشنبه 19 مهر 1389, 08:39 صبح
ممنون. حالا چطور باید با استفاده از یه دکمه دیگه که در زمان طراحی ایجاد شده، کدی بنویسم تا مثلا text یکی از دکمه های فوق رو عوض کنم؟



private void button1_Click(object sender, EventArgs e)
{
for (int i = 1; i < 10; i++)
{
Button btn = new Button();
btn.Name = "btn" + i.ToString();
btn.Text = "btn" + i.ToString();
btn.Click += new EventHandler(this.btn_Click);
this.flowLayoutPanel1.Controls.Add(btn);
}
}
void btn_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
if (btn.Name == "btn1")
{
this.Text = "mmd2009";
}
}

Reza_Yarahmadi
دوشنبه 19 مهر 1389, 10:15 صبح
برای من خطا میگیره.
براي استفاده از اين روش بايد مطمئن باشيد اسم مورد نظر(btn1) وجود داشته باشه. روي سيستم من كه مشكلي نداره ولي اگه از نام كنترل مطمئنيد و بازم خطا ميده كد زير رو جايگزين كنيد.

get { return this.Controls.Find(ControlName, true)[0]; }

modirmasool
دوشنبه 19 مهر 1389, 10:52 صبح
private void button1_Click(object sender, EventArgs e)
{
for (int i = 1; i < 10; i++)
{
Button btn = new Button();
btn.Name = "btn" + i.ToString();
btn.Text = "btn" + i.ToString();
btn.Click += new EventHandler(this.btn_Click);
this.flowLayoutPanel1.Controls.Add(btn);
}
}
void btn_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
if (btn.Name == "btn1")
{
this.Text = "mmd2009";
}
}


ممنون ولی این که مثل قبلی شد!


براي استفاده از اين روش بايد مطمئن باشيد اسم مورد نظر(btn1) وجود داشته باشه. روي سيستم من كه مشكلي نداره ولي اگه از نام كنترل مطمئنيد و بازم خطا ميده كد زير رو جايگزين كنيد.

get { return this.Controls.Find(ControlName, true)[0]; }

ممنون امتحان کردم درست شد.

mmd2009
سه شنبه 20 مهر 1389, 00:02 صبح
ممنون ولی این که مثل قبلی شد!


اون یکی که فرق می کرد.

ولی به هر حال فکر کنم delegate ها بهتر باشن برای این کار

یک مثال هم میزنم تا بهتر متوجه بشید



for (int i = 1; i < 10; i++)
{
Button btn = new Button();
btn.Name = "btn" + i.ToString();
btn.Text = "btn" + i.ToString();
btn.Click += delegate
{
if (btn.Name == "btn2")
this.Text = "mmd2009";
};
this.flowLayoutPanel1.Controls.Add(btn);
}