PDA

View Full Version : سوال: ایجاد Label ها در یک حلقه و مقدار دهی اندیس مشخصی از آرایه



mandanim
یک شنبه 13 آذر 1390, 12:11 عصر
سلام به دوستان عزیز
من می خوام بعنوان مثال 40 تا label در فرمم بزارم و به labelها مقدار دهی کنم
تا اینجا مشکلی نیست
حالا اگه بخواهم با یک حلقه این کارو بکنم چه باید بکنم
می خواهم label iرو مقدار دهی کنم
با اندیس i
تو اون لحظه اصلا مشخص نیست کدوم label هستش
عدد مشخص می کنه که اون label کدومه

Label I

pedramfj
یک شنبه 13 آذر 1390, 12:41 عصر
سلام
اول از همه یک flowLayoutPanel به فرم اضافه کن.
تعریف آرایه ای از نوع Label Label[] lbl=new Label[100];
for (int i = 0; i <=99; i++)
{
lbl[i] = new Label();
lbl[i].BackColor = System.Drawing.Color.Transparent;
lbl[i].ForeColor = System.Drawing.Color.DimGray;
this.label1.Location = new System.Drawing.Point(90,10);
lbl[i].Name = "label"+i;
lbl[i].Size = new System.Drawing.Size(80,50);
this.label1.TabIndex = 1;
lbl[i].BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
lbl[i].Text = ""+i;


flowLayoutPanel1.Controls.Add(lbl[i]);}
این کد به تعداد حلقه for بر روی فرم label ایجاد می کنه و خاصیت هر کدام را مقدار دهی می کنه.

mehdi.mousavi
یک شنبه 13 آذر 1390, 13:40 عصر
سلام
اول از همه یک flowLayoutPanel به فرم اضافه کن.
تعریف آرایه ای از نوع Label Label[] lbl=new Label[100];
for (int i = 0; i <=99; i++)
{
lbl[i] = new Label();
lbl[i].BackColor = System.Drawing.Color.Transparent;
lbl[i].ForeColor = System.Drawing.Color.DimGray;
this.label1.Location = new System.Drawing.Point(90,10);
lbl[i].Name = "label"+i;
lbl[i].Size = new System.Drawing.Size(80,50);
this.label1.TabIndex = 1;
lbl[i].BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
lbl[i].Text = ""+i;


flowLayoutPanel1.Controls.Add(lbl[i]);}
این کد به تعداد حلقه for بر روی فرم label ایجاد می کنه و خاصیت هر کدام را مقدار دهی می کنه.

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


می تونید از امکانات زبان بهره ببرید و جای تکرار lbl[i] به شکلی که استفاده کرده اید، یک بار اونو Reference کنید.
بهتره شرط پایانی حلقه رو 100 در نظر بگیرید و جای => از > استفاده کنید. البته بهتر از اون اینه که از lbl.Length برای گرفتن طول آرایه استفاده کنید و از تکرار عدد 100 نیز بپرهیزید (DRY).
اضافه کردن Label دونه به دونه به Flow Layout Control ایده جالبی نیست و موجب پردازش زیادی میشه. بهتره، جای Add از AddRange استفاده کنید و کل آرایه رو یکباره به تابع مربوطه بدید.

با توجه به مطالب فوق، میتونید کد رو Refactor کرده و بدین شکل بنویسید:




Label[] lbl = new Label[100];
for (int i = 0; i < lbl.Length; i++)
{
lbl[i] = new Label
{
BackColor = Color.Transparent,
ForeColor = Color.DimGray,
Location = new Point(90, 10),
Name = "label" + i,
Size = new Size(80, 50),
TabIndex = 1,
BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle,
Text = "whatever" + i,
};
}

this.flowLayoutPanel1.Controls.AddRange(lbl);



اما اگر در استفاده از LINQ محدودیتی ندارید، میتونید کد فوق رو بدین شکل نیز بنویسید:


Control[] labels = Enumerable.Range(0, 100).Select(i => new Label
{
BackColor = Color.Transparent,
ForeColor = Color.DimGray,
Location = new Point(90, 10),
Name = "label" + i,
Size = new Size(80, 50),
TabIndex = 1,
BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle,
Text = "whatever" + i,
}).ToArray();

this.flowLayoutPanel1.Controls.AddRange(labels);


موفق باشید.