PDA

View Full Version : ایجاد تعدادی label در یک حلقه for



smt1383
جمعه 20 فروردین 1389, 15:38 عصر
با سلام
من می خواستم در یک حلقه for تعدادی مثلاً 20 تا از یک کلاس (مثلاً کلاس Label ) ایجاد کنیم. به طوریکه نام label های ایجاد شده به ترتیب label1 تا Label20 باشد. اما نمی دانم اختصاص اسم به این label ها چگونه باید باشد.

mohammad diba
جمعه 20 فروردین 1389, 16:01 عصر
for (int i = 1; i < 10; i++)
{
Label a = new Label();
a.Name = "Label" + i.ToString();
a.Text = a.Name;
a.Top = (i + 1) * 20;
this.Controls.Add(a);
}

smt1383
جمعه 20 فروردین 1389, 17:09 عصر
ممنون از راهنمایی شما دوست عزیز. اما من می خواهم پس از ایجاد این کنترل ها با نامهای label1 تا ... به آنها دسترسی داشته باشم. مثلاً بتوانم کد label1.text="123" یا کدهای مشابه را بنویسم اما برنامه پیغام خطا می دهد که کنترلی به نام label1 وجود ندارد.

Netsky
جمعه 20 فروردین 1389, 17:18 عصر
سلام .
دوست عزیز ، دیباگر ویژوال استدیو درست میگه . چون این کنترل های که با کد جناب دیبا درست میشن همگی به صورت Runtime درست میشن . خودمم یه چند مدتی دنبال همین موضوع ( کد نویسی برای کنترل های ) ران تایم بودم . ولی .....
حالا اگه کسی از دوستان راه حلش رو میدونه به ما هم یاد بده .
با تشکر ...............

Marzieh_A
جمعه 20 فروردین 1389, 17:24 عصر
این کنترلها چون runtime ساخته می شن، نمی شه به طور مستقیم بهشون دسترسی پیدا کرد.
اما می تونی با کدی شبیه به کد زیر این کار رو انجام بدی.


for (int i = 0; i < this.Controls.Count; i++)
{
Control CurrentControl = this.Controls[i];
if (CurrentControl.Name == "Label1")
{
CurrentControl.Text = "123";
}
}

exlord
جمعه 20 فروردین 1389, 17:28 عصر
Label lable1 = this.Controls.Cast<Control>().First(n => n.Name == "lable1") as Label;

alireza_s_84
جمعه 20 فروردین 1389, 18:19 عصر
ممنون از راهنمایی شما دوست عزیز. اما من می خواهم پس از ایجاد این کنترل ها با نامهای label1 تا ... به آنها دسترسی داشته باشم. مثلاً بتوانم کد label1.text="123" یا کدهای مشابه را بنویسم اما برنامه پیغام خطا می دهد که کنترلی به نام label1 وجود ندارد.

سلام دوست عزیز:
شما به مجموعه کنترلهای هر کانتینری که این لیبل ها رو اضافه کردی میتونی دسترسی داشته باشی پس اگر مستقیما روی فرم قرار گرفتن اینجوری میتونی بهش دسترسی داشته باشی:

Label lbl = this.Controls["Label1"] as Label;
مدیریت خطا میمونه با خودت موفق باشی

alireza_s_84
جمعه 20 فروردین 1389, 18:21 عصر
این کنترلها چون runtime ساخته می شن، نمی شه به طور مستقیم بهشون دسترسی پیدا کرد.
اما می تونی با کدی شبیه به کد زیر این کار رو انجام بدی.


for (int i = 0; i < this.Controls.Count; i++)
{
Control CurrentControl = this.Controls[i];
if (CurrentControl.Name == "Label1")
{
CurrentControl.Text = "123";
}
}

این کد شما کار بسیار اشتباهیه چون در مجوعه کنترلهای فرم میچرخه و خیلی روی سرعت برنامه تاثیر میذاره.
موفق باشید

Himalaya
جمعه 20 فروردین 1389, 18:40 عصر
if (Controls["Label1"] != null)
{
Controls["Label1"].Text = "hi";
((Label)Controls["Label1"]).TextAlign = ContentAlignment.MiddleCenter;
}

smt1383
جمعه 20 فروردین 1389, 18:53 عصر
با تشکر از دوستان فکر کنم استفاده از خاصیت controls فرم یا container بهترین راه حل باشد . اما اگر به جای label ما در حلقه for یک کلاسی که خودمان نوشته ایم و از کنترلهای فرم نیست را بسازیم فکر نکنم دیگر این را جواب بدهد.

exlord
جمعه 20 فروردین 1389, 21:16 عصر
با تشکر از دوستان فکر کنم استفاده از خاصیت controls فرم یا container بهترین راه حل باشد . اما اگر به جای label ما در حلقه for یک کلاسی که خودمان نوشته ایم و از کنترلهای فرم نیست را بسازیم فکر نکنم دیگر این را جواب بدهد.


Dictionary<string, Class1> d = new Dictionary<string, Class1>();
d.Add("Class1_1", new Class1());
d.Add("Class1_2", new Class1());


Class1 cc = d["Class1_1"];