PDA

View Full Version : دسترسی به کنترل های فرم با حلقه for



morteza_bn
دوشنبه 15 شهریور 1389, 02:38 صبح
سلام دوستان
من یه فرم دارم که توش حدود 30 تا , checkbox وجود داره حالا می خوام با یه حلقه for به اینا دسترسی داشته باشم تا بتونم مقدار شو تغییر بدم میشه بگید چجوری میشه این کار رو انجام داد
من با خاصیت controls از form این کار رو می خواستم انجام بدم ولی پیغام خطا داد که مشخص می شد هیچی تو این خاصیت وجود نداره کد تقریبا بصورت زیر بود

form1.controls[i].text="xxxxx"

flash118
دوشنبه 15 شهریور 1389, 02:52 صبح
دوست عزيز اولا بايد نوع كنترلتون رو مشخص كنيد دوم هم اين روش شما محدود هست براي بهينه تر كردن و زيبا سازي درخواست شما ميتونيد از حلقه foreach استفاده كنيد البته اگه سايت رو بگرديد نمونه هايي رو پيدا ميكنيد اگه بازم مشكلتون حل نشد براتون با سورس كد توضيح مي دم فقط ببخشيد چون وقت نكردم سورس بزارم
اگه باز مشكل داشتين بفرماييد با سورس توضيح ميدم

shask00l
دوشنبه 15 شهریور 1389, 04:10 صبح
این مثال برای تغییر متن تمامی textbox های روی فرم نوشته شده . برای بقیه کنترل ها یا کارهای پیچیده تر از خلاقیت خودت استفاده کن . ضمنا موضوع تکراریه و با سرچ میتونستی جواب های خیلی بهتری پیدا کنی . من این کارو با سرچ کردن توی همین سایت یاد گرفتم رفیق .


foreach (Control X in this.Controls) if (X is TextBox) { (TextBox)X.Text = "xx"; }

Mohandes2009
دوشنبه 15 شهریور 1389, 05:05 صبح
بیا


for (int i = 0; i < this.Controls.Count; i++)
{
if (this.Controls[i] is CheckBox)
{
this.Controls[i].Text = "xxxx";
}
}

mmd2009
دوشنبه 15 شهریور 1389, 05:30 صبح
با سلام.

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



foreach (Control c in Controls)
{
if (c.GetType() == typeof(TextBox))
{
c.Text = "";
}
}


کد زیر برای شناسایی کنترل تکست باکس تو در تو




// حلقه ای برای شناسایی کنترل ها
foreach (Control c in Controls)
{
// حلقه ای برای شناسنایی کنترل های تو در تو
// که مناسب هستش برای کنترل هایی که درون کونتاینرها قرار دارن
foreach (Control d in c.Controls)
{
// شناسایی ایا اینکه کنترل مربوطه از نوع تکست باکس است
if (d.GetType() == typeof(TextBox))
{
// پاک کردن خاصیت تکست ان
d.Text = "";
}
} // end Foreach 2

} // end Foreach 1

zayens
دوشنبه 15 شهریور 1389, 10:16 صبح
جناب morteza_bn گمون کنم سرت کلاه رفت!
هیچ کدوم از کدهای بالا جواب سوال شما نیست.
در واقع با روش های بالا نخواهید توانست خاصیت CheckState چک باکس خود را تغییر دهید.
دوستان لطف کنن اگه میتونن کدی که CheckBox را checked یا Unchecked میکنه قرار بدن نه صرفا تغییر text لیبل ها رو.

Salar Ashgi
دوشنبه 15 شهریور 1389, 11:04 صبح
این کد رو هم امتحان کنید :



foreach (Control ct in this.Controls)
{
if (ct.GetType() == typeof(CheckBox))
{
if ((ct as CheckBox).Checked)
{
MessageBox.Show((ct as CheckBox).Name);
}
}
}

Mohandes2009
دوشنبه 15 شهریور 1389, 12:13 عصر
جناب morteza_bn گمون کنم سرت کلاه رفت!
هیچ کدوم از کدهای بالا جواب سوال شما نیست.
در واقع با روش های بالا نخواهید توانست خاصیت CheckState چک باکس خود را تغییر دهید.
دوستان لطف کنن اگه میتونن کدی که CheckBox را checked یا Unchecked میکنه قرار بدن نه صرفا تغییر text لیبل ها رو.
جگرت شم نوشته خودش کد :
form1.controls[i].text="xxxxx" را نوشته و غلطه خوب یعنی می خواسته تکستش را تغییر بده در ضمن جایی نگفته تو سوال چک داشته باشه یا نه!!!:لبخند:

nextnet
دوشنبه 15 شهریور 1389, 12:25 عصر
سلام
راحت ترين راه اينه كه به كنترل مورد نظر اشاره كني تا فعال بشه بعد از اون استفاده كني


Controlname.focus();

zayens
دوشنبه 15 شهریور 1389, 12:40 عصر
جگرت شم نوشته خودش کد :
form1.controls.text="xxxxx" را نوشته و غلطه خوب یعنی می خواسته تکستش را تغییر بده در ضمن جایی نگفته تو سوال چک داشته باشه یا نه!!!:لبخند:
به سوالش دقت کنین

سلام دوستان

من یه فرم دارم که توش حدود 30 تا , checkbox وجود داره حالا می خوام با یه حلقه for به اینا دسترسی داشته باشم تا بتونم مقدار شو تغییر بدم میشه بگید چجوری میشه این کار رو انجام داد
من با خاصیت controls از form این کار رو می خواستم انجام بدم ولی پیغام خطا داد که مشخص می شد هیچی تو این خاصیت وجود نداره کد تقریبا بصورت زیر بود

form1.controls.text="xxxxx"
[i]جمله ی " [I]تقریبا بصورت زیر بود " یعنی : یه چیزایی تو این مایه ها بود

درضمن: اگر صد تا چک باکس هم در یک فرم باشه در صورتی که همش در GroupBox باشه ویژوال،تعداد کنترل ها را برابر 1 میداند.(با دستور count امتحان کنید)

این هم کد چک مارک کردن همه ی چک باکس ها
نقل قول می گردد که کد، مال Salar Ashgi میباشد(صرفا جهت احترام به حقوق):لبخند:
البته کمی با تغییر


foreach (Control c in this.Controls)
{
if (c.GetType() == typeof(CheckBox))
{
if ((c as CheckBox).CheckState == CheckState.Unchecked)
{
(c as CheckBox).CheckState = CheckState.Checked;
}
}
}

Salar Ashgi
دوشنبه 15 شهریور 1389, 12:49 عصر
کاربر zayens (http://www.barnamenevis.org/forum/member.php?u=81735) ، یه نقل قولی هم میزدید بد نبود ، عینا کد رو کپی و پیست کردید و همینطوری نوشتید ،
سعی کنید به حقوق دیگران احترام بگذارید ./

Mohandes2009
دوشنبه 15 شهریور 1389, 19:19 عصر
کاربر zayens (http://www.barnamenevis.org/forum/member.php?u=81735) ، یه نقل قولی هم میزدید بد نبود ، عینا کد رو کپی و پیست کردید و همینطوری نوشتید ،
سعی کنید به حقوق دیگران احترام بگذارید ./
دورت بگردم بیچاره نوشت که مال تو هست :لبخند:خونت را رنگی نکن:بوس:

mohsen_csharp
دوشنبه 15 شهریور 1389, 22:16 عصر
سلام
پس این توابع بازگشتی واسه چی ساخته شده
که تو این جور مواقع ازش استفاده کنیم دیگه


privatevoid button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < this.Controls.Count; i++)
{
this.setCheck(this.Controls[i], true);
}
}
void setCheck(Control c,bool b)
{
if (c isCheckBox)
{
(c asCheckBox).Checked = b;
}
for (int i = 0; i < c.Controls.Count; i++)
{
this.setCheck(c.Controls[i], true);
}
}

Salar Ashgi
دوشنبه 15 شهریور 1389, 22:40 عصر
پس این توابع تودرتو واسه چی ساخته شده


دوست عزیز ، ما اصلا در خانواده C از جمله : C#,C++,C ، اصلا مفهومی بنام توابع تودرتو نداریم ، چون قانونا
تو این زبانها تابع رو نمیشه داخل تابع تعریف کرد !
در ضمن ، الگوریتم شما هم سربار زیادی روی سیستم داره و اینکار حتما باید با حلقه انجام بشه و شما
این حلقه ها رو فقط داخل یک تابع بکار بردید ، همین و بس ، و اینکار هیچ کمکی به بهینه کردن مساله
نمیکند ! البته اینا توصیه دوستانه بود ، امیدوارم پذیرا باشید ./
با امید موفقیت ./

mohsen_csharp
سه شنبه 16 شهریور 1389, 00:49 صبح
از دوستان عذرخواهی می کنم
به جای توابع بازگشتی نوشته بودم توابع تودوتو
منظور من بازگشتی بود که اشتباه شد
مثالی هم که زدم توابع بازگشتی هست

میلاد قاضی پور
سه شنبه 16 شهریور 1389, 01:16 صبح
اما با استفاده از توابع بازگشتی که کد باید اینجوری میشد !!!




void setCheck(int i)
{
if (i==(this.controls.count))
return;
if (this.controls[i] is CheckBox)
this.controls[i] as CheckBox.Checked = true;
i++;
setCheck(i);
}


private void button1_Click( object sender, EventArgs e)
{
this .setCheck(0);
}



البته آقا محسن استاد من بودن جسارت کردم و معذرت میخوام به خاطر این مسأله .فقط به خاطر اینکه ایرادات خودم برطرف بشه این کد رو گذاشتم.