PDA

View Full Version : چگونه می شود در c# آرایه ای از کنترلی مثل textbox ساخت



morycom
سه شنبه 25 اردیبهشت 1386, 11:51 صبح
با سلام خدمت همه دوستان
چگونه می شود در c# آرایه ای از کنترلی مثل textbox ساخت

Sorenaa_s
سه شنبه 25 اردیبهشت 1386, 13:06 عصر
اگر با .Net 1.1 کار کی کنی از ArrayList استفاده کنید و اگر با .Net 2، از Generic ها.

MH2538
سه شنبه 25 اردیبهشت 1386, 14:11 عصر
کد زیر از بین تمام کنترل های موجود روی فرم فقط textbox ها رو توی یک آرایه می ریزه و بعد نشون می ده


ArrayList TxtAL = new ArrayList();

for (int i = 0; i < this.Controls.Count; i++)
{
if (this.Controls[i].GetType().ToString() == "System.Windows.Forms.TextBox")
TxtAL.Add(this.Controls[i]);
}

for (int i = 0; i < TxtAL.Count; i++)
MessageBox.Show(TxtAL[i].ToString());

iranrose63
چهارشنبه 26 اردیبهشت 1386, 08:40 صبح
اگه درست متوجه منظورت شده باشم می خوای یک آرایه داشته باشی از یک نوع کنترل خاص
با کد زیر میتونی یه آرایه از کنترل ها در زمان کد نویسی ایجاد کنی

اول باید آرایه رو تعریف کنی
;[private controlname[] name=nwe controlname[arraylenght

موقعی که میخوای از یکی از کنترلها استفاده کنی
1- ;()name[index]=new controlname
حالا اونو به کنترلهای فرمت یا یه کنترل دیگه اضافه میکنی
2- ;([parentcontrol.Controls.Add(name[index
حالا میتونی از این کنترل مثل بقیه کنترلها استفاده کنی و به خاصیت ها توابع و ... این کنترل دسترسی داشته باش
name[index].backcolor=color.red

مثلا برای ایجاد یک ارایه 10 عضوی از TextBox:
;[private TextBox[] name=nwe TextBox[10
;()name[0]=new TextBox
2- ;([this.Controls.Add(name[0
;"name[0].Text="test

mohebbi.saeed
چهارشنبه 26 اردیبهشت 1386, 09:31 صبح
]System.Windows.Forms.TextBox[] txtArray=new System.Windows.Forms.TextBox[5

morycom
یک شنبه 30 اردیبهشت 1386, 09:42 صبح
از همه بچه ها ممنونم

jome ramezani
سه شنبه 15 خرداد 1386, 05:00 صبح
سلام
امید وارم این مثال برایتون مفید باشد
در ضمن این مثال را از مثالهای موجود در دلفی 2005 میباشد

توسعه نویس
سه شنبه 04 دی 1386, 11:40 صبح
سلام به دوستان.

من این کار رو در زمان دیزاین انجام دادم. برای مثال برای درست کردن ده تا لیبل بصورت Array در form1 رفتم توی Form1.Desinger.cs و مثلا کد زیر رو در اونجا اضافه کردم:

در قسمت بیرون از توابع در کنار تعریف بقیه کنترلها:


private System.Windows.Forms.Label[] lblItem;


و بعد در تابع InitializeComponent() در جای خودش اینا رو اضافه کردم :


this.lblItem =new System.Windows.Forms.Label[10];

this.lblItem[0] = new System.Windows.Forms.Label();
. . .
this.lblItem[10] =new System.Windows.Forms.Label();


بعد خصوصیات هر کنترل توی همون تابع تنظیم شده :

//
// lblItem[0]
//
this.lblItem[0].Location = new System.Drawing.Point(7, 6);
this.lblItem[0].Name = "lblItem";
this.lblItem[0].Size = new System.Drawing.Size(38, 20);
this.lblItem[0].TabIndex = 0;
this.lblItem[0].Text = "0000";
this.lblItem[0].TextAlign = System.Drawing.ContentAlignment.MiddleCenter;


و بعد هم در آخر در قسمت تنظیم خصوصیات فرم که بقیه کنترلها به فرم Add میشوند، این کنترلها را Add کردم:


this.Controls.Add(this.lblItem[0]);
. . .
this.Controls.Add(this.lblItem[10]);


همه چیز درست کار میکنه و در دیزاین فرم هم نمایش داده میشه.
اما دو تا مشکل اساسی وجود داره :
اول اینکه در دیزاین تو ادیتور نمیشه کنترلها رو ویرایش کرد.
دوم اینکه نمیشه برای کنترلهای ایندکسی شده ایونت در نظر گرفت.(مثلا Click)
ایونت ها رو دقیقا مثل خود کدهای سی شارپ اضافه کردم ولی خطا میگیره. !

حالا سوال اینه که چطور به این کنترلها ایونت نسبت داد و باهاشون کار کرد و خطا نگیره؟

MH2538
سه شنبه 04 دی 1386, 11:57 صبح
سلام
نمی‌تونی برای یک آرایه یکباره event بدی باید تک تک اینکار رو بکنی
به مثال زیر توجه کن

روش غلط


lblItem.Click += new EventHandler(lbl1_Click);

روش صحیح


lblItem[0].Click += new EventHandler(lbl1_Click);

سار
سه شنبه 04 دی 1386, 13:38 عصر
پیشنهاد میکنم Index آرایه را در Tag هر Button ذخیره کنید و بعد به یک Event ارسال کنید همه را در Event برسی کنید که Tag چه مقداری دارد و آنگاه خواهید توانست عکس العمل مناسب را انجام دهید.

MH2538
سه شنبه 04 دی 1386, 13:48 عصر
نیازی به Index نیست. می توانید از tag استفاده کنید

توسعه نویس
سه شنبه 04 دی 1386, 23:41 عصر
خوشبختانه ایونت ها در زمان اجرا به خوبی و بدون خطا کار می کنند. ولی در صفحه دیزاین با پیغامهای Warnings بصورت زیر مواجه می شوم:

Events cannot be set on the object passed to the event binding service because a site associated with the object could not be located.

و به این صورت امکان صفحه دیزاین رو از دست می دهیم.

در مورد Tag ، من از TabIndex کنترلها استفاده می کنم که با ایندکسهای کنترلهای من یکی هستند.

البته استفاده از کنترلهای آرایه مزایای خوبی دارد. یکی از این مزایا امکان دسترسی مستقیم با استفاده از ایندکس متغییر در جاهای دیگر هست. مثلا فکر کنید شما 40 کنترل هم جنس دارید و کاربر یک شماره بین 0 تا 39 را در قالب یک آرگومان به یک تابعی غیر از ایونت ها ارسال میکنه و تابع باید بر اساس این شماره برود کنترل مورد نظر رو پیدا کنه و مثلا رنگش رو قرمز کنه. در اینجا اگر از Tag و ... برای این کار استفاده کنیم هیچ راهی نداریم جز اینکه توی یک حلقه ، Tag رو پیدا کنیم و یا از یک Switch case به تعداد 40 آیتم استفاده کنیم.
اما اگه این 40 کنترل آرایه باشد، با قرار دادن همون عدد در [ ] مربوط به کنترل، میشود مستقیم به کنترل دسترسی داشته باشیم.

توی دات نت 3 این مشکل در نظر گرفته شده و امکان ایجاد کنترلهای آرایه بصورت خاصی شده. مثلا برای ایجاد Button از ButtonArray استفاده میشود.

sinpin
چهارشنبه 05 دی 1386, 09:33 صبح
...البته استفاده از کنترلهای آرایه مزایای خوبی دارد....

در oop با استفاده از منطق Indexer نیاز به آرایه اندیس دار پوشش داده شده است.

اَرژنگ
چهارشنبه 05 دی 1386, 11:59 صبح
توی دات نت 3 این مشکل در نظر گرفته شده و امکان ایجاد کنترلهای آرایه بصورت خاصی شده. مثلا برای ایجاد Button از ButtonArray استفاده میشود.
منبع؟ (؟؟؟XAML)

یک سوال:
اگر یک کنترل در ران تایم اضافه بشد، با این روش ایندکسش و یا تگش چیه؟
اگر برنامه نویسی با این پروزه کار کند، باید بداند که بعد از اضافه کردن کنترل باید این کنترل را به آریه هم اضافه کند.

توسعه نویس
پنج شنبه 06 دی 1386, 00:26 صبح
منبع؟ (؟؟؟XAML)


توی MSDN


اگر یک کنترل در ران تایم اضافه بشد، با این روش ایندکسش و یا تگش چیه؟
اگر برنامه نویسی با این پروزه کار کند، باید بداند که بعد از اضافه کردن کنترل باید این کنترل را به آریه هم اضافه کند.

زیاد متوجه نشدم. ولی به هر حال تکنیک های متنوعی برای کد نویسی وجود داره. کنترلی که در RunTime اضافه میشه و تکی هست باید ترجیحا Array نباشه. ولی اگه قراره چند تا باشه می تونه بصورت یک Array جدید ایجاد بشه. اگر هم نیاز باشه در RunTime به آرایه موجود اضافه بشه راه حل وجود داره ولی دردسرهایی هم داره. یک راه مناسب برای این کار استفاده از نوع ArrayList هست که داینامیکه و بیشتر برای این جور وقتا استفاده میشه.


در oop با استفاده از منطق Indexer نیاز به آرایه اندیس دار پوشش داده شده است.

اگه میشه بیشتر در مورد راهنمایی کنید. اگه مثالی هم هست بگید.

sinpin
پنج شنبه 06 دی 1386, 09:24 صبح
توی MSDN
زیاد متوجه نشدم. ولی به هر حال تکنیک های متنوعی برای کد نویسی وجود داره. کنترلی که در RunTime اضافه میشه و تکی هست باید ترجیحا Array نباشه. ولی اگه قراره چند تا باشه می تونه بصورت یک Array جدید ایجاد بشه. اگر هم نیاز باشه در RunTime به آرایه موجود اضافه بشه راه حل وجود داره ولی دردسرهایی هم داره. یک راه مناسب برای این کار استفاده از نوع ArrayList هست که داینامیکه و بیشتر برای این جور وقتا استفاده میشه.
اگه میشه بیشتر در مورد راهنمایی کنید. اگه مثالی هم هست بگید.

البته نه دقیقا
ArrayList آیتمهایی از نوع آبجکت میگیره و زمانی استفاده میشه که نتونیم Type رو شناسایی کنیم ؟(پس میتونیم هرچیزی توش بریزیم) وقتی نوع رو میدونید بهتره حتما از کالکشنهای ژنریک استفاده کنید (بدلیل Performane بهتر) مثل :

List<Button>