PDA

View Full Version : سوال: لیست تمام آبجکت های درون فرم



sajaaaaad
دوشنبه 18 فروردین 1393, 20:46 عصر
با سلام و خسته نباشید.
.
راستش من توی زبان دلفی دیدم ک ی آرایه وجود داره که لیست تمام کنترل هایی که شما درون برنامه داری رو نشون میده، به عنوان مثال میگم اولین عنصر آرایه یک دکمس، عنصر دومش یک لیبل عنصر سوم یک تکست باکس و ....
.
و جالب اینجا بود که با شماره اندیس و استفاده از نام اون آرایه میشد به خاصیت های کنترل ها دسترسی داشته باشی.، حالا سوال اینجاس تو سی شارپم داره همچین چیزی یا نه..!؟
.
من مثلا میگم، 20 تا لیبل دارم، نمیخوام بیست تا if استفاده کنم، یه آرایه باشه که با اندیسش بتونم با یک حلقه فور به تک تکشون دسترسی داشته باشم، آیا میشه یا نه..!؟
.
با تشکر.

us1234
دوشنبه 18 فروردین 1393, 20:51 عصر
اینجا هم هست Controls مثل زیر هم میشه پیمایشش کرد و مثلا در شرط من یک تکس باکس را پیدا کردم . اسم ش هم میتونید پیدا کنید .


foreach (var item in this.Controls)
{
if (item.GetType() == typeof(CheckBox))
{


}
}

sajaaaaad
دوشنبه 18 فروردین 1393, 22:29 عصر
منظورتون چک باکسه دیگه.!؟
.
اما خب الان من اینو تست کردم ولی خب جواب نمیده این چیزی ک من میخوام، به عنوان مثال میگم من میخوام حالا که چک باکسه پیدا شد، نامرئیش کنم، یا نمیدونم enablesho فالس کنم، الان با متغیر item من به خاصیتاش دسترسی ندارم که..!؟!
مثلا بگم item.enable=false این جواب نمیده ک..!

تو دلفی مثلا میگم یک فرم بود ک 50 تا تکست باکس داشت، بعد یک کد طرف زده بود که آقا هرجا ک فوکوس شد، اگ کنترل تکست باکس بود، بگراندش زرد بشه..! کاری ک من میکنم اینه که مثلا توی خاصیت اینتر میگم زرد بشه، تو خاصیت خروجش میگم سفید بشه، یعنی واسه پنجاه تا تکست باکس 100 تا تابع باید فراخوانی کنی.
.
اما دلفی خیلی ساده کرده بود

البته کاری که الان میخوام بکنم اینه که...
.
من 20 تا لیبل دارم (لیبل هایی که قراره به ترتیب روشن بشه..!) البته لیبل های ثابت دیگه ام دارم توی برنامه..! حالا میخوام بدونم میشه کاری کرد که مثلا با یک تایمر کاری کرد که بگم از عنصر مثلا 20 تا عنصر 40 ام با هر تیک تایمر روشن بشه..!
.
البته به شرطی که بشه لیست 20 تا لیبلمو در بیارم ک عنصر چندم توی آرایه اند.

behzadkhan
دوشنبه 18 فروردین 1393, 22:52 عصر
با سلام

ببین این کمکت می کنه:


foreach (Control item in this.Controls)
{
if (item is Label)
{
item.Text = "متن مورد نظر";
}
}



البته اینو به رویداد کلیک یک Button اختصاص دادم و دو تا Label به فرم اضافه کردم.
متن هر دو لیبل را عوض کرد.

با تشکر

sajaaaaad
دوشنبه 18 فروردین 1393, 23:06 عصر
آره دیدم چی شد، پس چرا تو کد قبلی نمیشد به خاصیت ها دسترسی داشت..!؟ جالبه..!
.
اما مرسی، همین Controls خیلی جالبه دنبال همین بودم، الان دارم باهاش کار میکنم، با اندیسم میشه باهاش کار کارد مثلا گفت

this.Controls[15].Visible = false;
اما خب حالا از کجا بفهمم کدوم کنترلم کدوم عنصره.!؟ برنامه رو وسط کار پاز کردمو توی لوکالش نشستم به شماردن ولی ترتیبی که اونجا نشون میده با ترتیب توی Controls یکی نیست :-(

NASA's Spaceman
دوشنبه 18 فروردین 1393, 23:11 عصر
میشه یه نمونه برنامه بزارین
با سپاس

sajaaaaad
دوشنبه 18 فروردین 1393, 23:20 عصر
برنامه خاصی نداره..! مثال میگم فک کنید من 20 تا لیبل دارم و میخوام با یک تایمر به ترتیب با هر تیک روشن بشه..!
اینجوری مثلا..!

int M = 1;


private void timer2_Tick(object sender, EventArgs e)
{
this.Controls[M++].Visible = true;
}


.
حالا سوال اینجاس من چطور اندیس لیبل هامو پیدا کنم! مثال میگم بجای لیبلی که مد نظرمه یکی دیگه غیب نشه..!!!! یا چجوری لیبلایی ک مد نظرمه توی Controls به ترتیب بذارم، یعنی چطوری بچینم تو فرم ک به ترتیب بیاد.

sajaaaaad
دوشنبه 18 فروردین 1393, 23:31 عصر
من ی توضیح دیگه بدم شاید بهتر باشه..
.
من یه فرم دارم، داخلش یک تعداد از لیبل های خاصی ک وجود داره، همشون نه..! مثلا میگم 40 تا لیبله! من 20 تاشو ک مد نظرمه میخوام به ترتیب روشن بشه..!
.
فک کنید 20 تا لیبل گذاشتم از عدد یک تا بیست..! حالا می خوام با هر تیک تایمر یکی یکی روشن بشه..! یکیش اینکه من یگم مثلا اگ تیک اول بود لیبل اول، اگر تیک دوم بود لیبل دوم..! به عبارتی 20 تا if بذارم تا مشکلم حل شه..!
حالا من میگم اینکارو نکنم..! یه مغیر سراسری داشته باشم..! مثل M که با هربار تیک زدن تایمر کنترل m موم ویزیبلش ترو بشه..!
.
حالا مشکلی که دارم اینکه چکار کنم ک ترتیبی که من میخوام همون ترتیب توی Controls باشه و از کجا بفهمم اندیسشون چنده اصلا..!
.
ببخشید یکمی طولانی شد :-)
با تشکر

us1234
دوشنبه 18 فروردین 1393, 23:42 عصر
من ی توضیح دیگه بدم شاید بهتر باشه..
.
من یه فرم دارم، داخلش یک تعداد از لیبل های خاصی ک وجود داره، همشون نه..! مثلا میگم 40 تا لیبله! من 20 تاشو ک مد نظرمه میخوام به ترتیب روشن بشه..!
.
فک کنید 20 تا لیبل گذاشتم از عدد یک تا بیست..! حالا می خوام با هر تیک تایمر یکی یکی روشن بشه..! یکیش اینکه من یگم مثلا اگ تیک اول بود لیبل اول، اگر تیک دوم بود لیبل دوم..! به عبارتی 20 تا if بذارم تا مشکلم حل شه..!
حالا من میگم اینکارو نکنم..! یه مغیر سراسری داشته باشم..! مثل M که با هربار تیک زدن تایمر کنترل m موم ویزیبلش ترو بشه..!
.
حالا مشکلی که دارم اینکه چکار کنم ک ترتیبی که من میخوام همون ترتیب توی Controls باشه و از کجا بفهمم اندیسشون چنده اصلا..!
.
ببخشید یکمی طولانی شد :-)
با تشکر

یه روش ابتکاری میگم . توی خاصیت تگ tag هر لیبل یه عدد بذار مثلا از 0 شروع کن . بعد به شکل زیر میشه پیمایشش کنی :
فقط اون i را باید مدیریت کنی مثلا بسته به این سناریو که گفتی میشه تو هر تیک زیاد بشه به صورت عمومی تعریف ش کن .


foreach (Control item in this.Controls)
{
if (item is Label)
{
if (item.Tag == i.ToString())
{
item.Text = "OK";
}
}
}

behzadkhan
دوشنبه 18 فروردین 1393, 23:54 عصر
با سلام مجدد

می تونی از خاصیت TabIndex کمک بگیرید.

حالا به ترتیبی که می خواهید مقدار TabIndex هر کنترل را تغییر بدید.


private void timer2_Tick(object sender, EventArgs e)
{
Counter++;

foreach (Control item in this.Controls)
{
if (item is Label && item.TabIndex == Counter)
{
item.Text = "gdsf";
}
}
}


با تشکر

sajaaaaad
سه شنبه 19 فروردین 1393, 20:51 عصر
با تشکر از دوستان عزیز... راهنمایی های ک کردین عالی بود.
.
اما یه چیزی نمیشه کاری کرد که این کنترل ها به ترتیب باشن توی آرایه و با اندیسش به همه دسترسی داشت..! یعنی یه کاری کرد که مثلا 20 تا لیبل من توی آرایه از اندیس مثلا 10 شروع شه تا 29 باشه..!؟ اصلا میشه مانور داد و اندیسارو خودت مرتب کنی که احتیاجی به گشتن کل آرایه نباشه..!؟

Mousavmousab
سه شنبه 19 فروردین 1393, 23:45 عصر
با سلام و خسته نباشید.
.
راستش من توی زبان دلفی دیدم ک ی آرایه وجود داره که لیست تمام کنترل هایی که شما درون برنامه داری رو نشون میده، به عنوان مثال میگم اولین عنصر آرایه یک دکمس، عنصر دومش یک لیبل عنصر سوم یک تکست باکس و ....
.
و جالب اینجا بود که با شماره اندیس و استفاده از نام اون آرایه میشد به خاصیت های کنترل ها دسترسی داشته باشی.، حالا سوال اینجاس تو سی شارپم داره همچین چیزی یا نه..!؟
.
من مثلا میگم، 20 تا لیبل دارم، نمیخوام بیست تا if استفاده کنم، یه آرایه باشه که با اندیسش بتونم با یک حلقه فور به تک تکشون دسترسی داشته باشم، آیا میشه یا نه..!؟
.
با تشکر.


بله میشه راه درستش اینه که دوستمون بالا گفت:



foreach (Control item in this.Controls) {
if (item is Label && item.TabIndex == Counter)
{
item.Text = "gdsf";
}
}










یه کاری کرد که مثلا 20 تا لیبل من توی آرایه از اندیس مثلا 10 شروع شه تا 29 باشه..!؟ اصلا میشه مانور داد و اندیسارو خودت مرتب کنی که احتیاجی به گشتن کل آرایه نباشه..!؟



دوست عزیز این چیزی که شما می گین اصلاٌ جایی کاربرد نداره و لازم نیست. برای چی شما توی برنامه ات لازم داری که به جای 1 تا 20 از 20 تا 40 شروع بشه؟ (حالا هر اندیسی مهم نیست)؟

دلیلش را می تونی بگی؟ چرا به این امکان شما نیاز داری؟
حلقه Foreach در سی شارپ جامع و عالی است و مانور دادن روی کنترل ها از همه زبان ها بهتر نباشه کمتر نیست. به نظر من خیلی عالی کار شده. (من که اینطوری فکر میکنم)

حالا شما مشکلت چیه؟

sajaaaaad
چهارشنبه 20 فروردین 1393, 00:18 صبح
من اصلا مشکلی با اندیسش ندارم!!! چرا دعوا میکنی :قهقهه:
.
میگم ی جوری باشه ک من دسترسی داشته باشم با اندیس..! لازم نباشه کلشو بگردم..! همین..! ی جوری باشه که ب ترتیب باشه..! فک کنید من بخوام اینجوری فراخوانی کنم..! البته به شرطی ک همه با همون ترتیبی ک من میخوام باشن! البته مهم نیست! من گفتم ک به جواب رسیدم! اینا صرفا جهت یادگیریه..!
.
بعدشم الان مثال میگم فک کن توی ی فرم 40 تا تکست باکس داریم! من میخوام مکان نما اومد داخلش زرد بشه..! خارج شد سفید بشه..! من دیدم تو دلفی با چار خط کد حله این جریان..! حالا سی شارپ باید چکار کرد..! بهینش چیه..!؟ نمیخوام 80 تا ایونت فراخونی کنم. باید بشه ی کارایی کرد..! این سوالاتم جهت رسیدن ب اینه..! وگر نه من مشکلم حل شد داداش.

sajaaaaad
چهارشنبه 20 فروردین 1393, 00:19 صبح
int M = 1;
private void timer2_Tick(object sender, EventArgs e)
{
this.Controls[M++].Visible = true;
if(M>20)
timer.enable=false;
}

این واسه قبلیه ک گفتم..! فک کنید من میخوام اینجوری بنویسم..! میشه اصلا..!؟ میشه کاری کرد ک کنترل ها به همون ترتیبی ک من میخوام اندیس داشته باشن یا نه..! حالا m هرچی میخواد باشه..! مهم نیست! مهم اینه ب ترتیب دلخواه من باشه..! عددش مهم نیست هرچی بود.

behzadkhan
پنج شنبه 21 فروردین 1393, 17:14 عصر
با سلام

امکان این کار وجود دارد.

ولی

روشی که من بلدم نمی توان کنترل ها را در حالت دیزاین ویرایش کرد(یعنی نمی توان دید).

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

---------------------------------------------

اگر خواستید کدش را براتون می زارم.

با تشکر

Mahmoud.Afrad
پنج شنبه 21 فروردین 1393, 18:47 عصر
میتونی ارجاعی از کنترلهای مورد نظر رو در یک لیست داشته باشی تا بتونی راحت تر باهاش کار کنی.

List<CheckBox> lstChb;
int counter;
private void button1_Click(object sender, EventArgs e)
{
lstChb = new List<CheckBox>();
foreach (Control c in this.Controls)
{
if (c is CheckBox)
{
CheckBox chb = c as CheckBox;
lstChb.Add(chb);
}
}

timer1.Interval = 1000;
timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
if (counter < lstChb.Count)
{
lstChb[counter].Checked = true;
counter++;
}
else
{
timer1.Stop();
}
}

Mousavmousab
پنج شنبه 21 فروردین 1393, 19:02 عصر
من اصلا مشکلی با اندیسش ندارم!!! چرا دعوا میکنی :قهقهه:
.
میگم ی جوری باشه ک من دسترسی داشته باشم با اندیس..! لازم نباشه کلشو بگردم..! همین..! ی جوری باشه که ب ترتیب باشه..! فک کنید من بخوام اینجوری فراخوانی کنم..! البته به شرطی ک همه با همون ترتیبی ک من میخوام باشن! البته مهم نیست! من گفتم ک به جواب رسیدم! اینا صرفا جهت یادگیریه..!
.
بعدشم الان مثال میگم فک کن توی ی فرم 40 تا تکست باکس داریم! من میخوام مکان نما اومد داخلش زرد بشه..! خارج شد سفید بشه..! من دیدم تو دلفی با چار خط کد حله این جریان..! حالا سی شارپ باید چکار کرد..! بهینش چیه..!؟ نمیخوام 80 تا ایونت فراخونی کنم. باید بشه ی کارایی کرد..! این سوالاتم جهت رسیدن ب اینه..! وگر نه من مشکلم حل شد داداش.


دوست عزیز من یه مقدار روشن و شفاف حرف می زنم ظاهراٌ ناراحت شدی. شرمنده

خوب توی دلفی هر کاری میشه کرد اینجا هم میشه ، شاید راحت تر

برای اینکه رنگ Background یک TextBox به اون حالتی که گفتی سفید و زرد بشه بهترین راه ساخت یک User Control هست.
با 2 خط کد میشه این کار را انجام داد.

بهتره Dll کنی بعد از ساخت
پس یه ClassLibrary باز کن و به پروژه ات System.Windows.forms را AddReference کن و بعد کلاس جاری شما باید از TextBox ارث ببره و تا تمام ویژگی های TextBox مایکروسافت را داشته باشه +

.... چیز های دیگه

2 تا رنگ به نام GotColor و LostColor را به این Component اضافه کردم.

زمان طراحی مشخص میکنیئ که وقتی کنترل فوکس میگیرد به چه رنگی درآید و وقتی کنترل از فوکوس خارج می شود به چه رنگی در آید!!!

دانلود سورس کامپوننت (http://www.parsgig.com/f/lCIYc)

sajaaaaad
یک شنبه 24 فروردین 1393, 22:13 عصر
خیلی ممنون... واقعا عالی بود. ببخشید من چند روزه اینترنت نداشتم، نشد تشکر کنم ازتون. ممنون لطف کزدین.
.
واسه اون سوال دیگه ک مطرح کردم راه کاری ندارین.!؟


"فک کنید توی ی فرم 40 تا تکست باکس داریم! من میخوام مکان نما اومد داخلش زرد بشه..! خارج شد سفید بشه..! من دیدم تو دلفی با چار خط کد حله این جریان..! حالا سی شارپ باید چکار کرد..! بهینش چیه..!؟ نمیخوام 80 تا ایونت فراخونی کنم. باید بشه ی کارایی کرد..!"

us1234
یک شنبه 24 فروردین 1393, 22:37 عصر
"فک کنید توی ی فرم 40 تا تکست باکس داریم! من میخوام مکان نما اومد داخلش زرد بشه..! خارج شد سفید بشه..! من دیدم تو دلفی با چار خط کد حله این جریان..! حالا سی شارپ باید چکار کرد..! بهینش چیه..!؟ نمیخوام 80 تا ایونت فراخونی کنم. باید بشه ی کارایی کرد..!"


نیاز نیست 80 تا ایونت تعریف کنید با 2 تا ایونت هم انجام میشه .1 - Enter برای وقتی که کلیک میکنید ( که مثلا میگید رنگش را عوض کنه ) 2 - Leaveبرای وقتی که ازش خارج میشید

Mousavmousab
دوشنبه 25 فروردین 1393, 12:43 عصر
خیلی ممنون... واقعا عالی بود. ببخشید من چند روزه اینترنت نداشتم، نشد تشکر کنم ازتون. ممنون لطف کزدین.
.
واسه اون سوال دیگه ک مطرح کردم راه کاری ندارین.!؟


"فک کنید توی ی فرم 40 تا تکست باکس داریم! من میخوام مکان نما اومد داخلش زرد بشه..! خارج شد سفید بشه..! من دیدم تو دلفی با چار خط کد حله این جریان..! حالا سی شارپ باید چکار کرد..! بهینش چیه..!؟ نمیخوام 80 تا ایونت فراخونی کنم. باید بشه ی کارایی کرد..!"



بابا من که برات توضیح دادم ، مثال هم زدم ، گفتم یک Component بساز و با 2 خط مسکلت حل میشه

موفق باشی

sajaaaaad
دوشنبه 22 اردیبهشت 1393, 10:14 صبح
با عرض سلام. داداش من امروز کارم گیره این جریانه.! من دقیق نفهمیدم باید چکار کنم. چطور Dll کنمش.! یک مورد اجرایی نمیشه واسم بفرستی.!؟ واسه این موردی که میگی.! الان این سورسی که گذاشتی خودش از TextBox ارث میبره، بعد من اینو باید Dll کنم و توی فرم های خودم TextBox هامو بگم ازین ارث ببرن.!؟ بعدشم من دقیق نمیدونم چطور DLL کنم. یک توضیحی بدین ممنون میشم.
.
2- من واسه درس شبیه سازی (سیمپلکس) میخوام فرمولو از کابر بیگیرم مثلا فرمول اینه.!
2x1 + 4x2 + 3x3
حالا چطوره میشه اینارم از هم تفکیک کنم که هم بتونم ضرایبو داشته باشم هم متغیرهارو.! مثلا داشته باشم 2 و ایکس یک...، 4 و ایکس 2....، تک تکشونو جدا میخوام.! هم ضریب هم متغیرش..! طول رشته ام مشخص نیست..!
.
با تشکر

irartesh
دوشنبه 22 اردیبهشت 1393, 11:59 صبح
این کد کمکت میکنه...فقط کافیه نام این دو ایونت رو در ایونت های موس لیو و موس اینتر (MouseEnter و MouseLeave) وارد کنید

private void textBox2_MouseEnter(object sender, EventArgs e)
{
((TextBox)sender).BackColor = Color.Red;
}

private void textBox2_MouseLeave(object sender, EventArgs e)
{
((TextBox)sender).BackColor = Color.White;
}

sajaaaaad
چهارشنبه 24 اردیبهشت 1393, 10:10 صبح
داداش اینجوری ک میشه، سادس، من میخواستم اینکارو نکنم دیگه! البته مشکلم با Dev Commponent حل شد. واسه فرموله کسی نظری نداره..!؟ لطفا کمک کنید

Pedram_Parsian
شنبه 27 اردیبهشت 1393, 11:51 صبح
با سلام

ببین این کمکت می کنه:


foreach (Control item in this.Controls)
{
if (item is Label)
{
item.Text = "متن مورد نظر";
}
}



البته اینو به رویداد کلیک یک Button اختصاص دادم و دو تا Label به فرم اضافه کردم.
متن هر دو لیبل را عوض کرد.

با تشکر

حالا من دارم از کامپوننت های devExpress استفاده می کنم. برای اون باید چی بنویسید در متن شرط؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟