PDA

View Full Version : پاک کردن همه کنترل های فرم یکجا



Mahdi Fahmideh
سه شنبه 04 مرداد 1384, 18:16 عصر
چطوری میشه تمام کنترل های فرم رو توسط تکنیک foreach یکجا پاک کرد؟
فرم شامل textbox , combobox میباشد.

Babak-Aghili
سه شنبه 04 مرداد 1384, 20:48 عصر
Controls.Remove
یا RemoveControl

titbasoft
سه شنبه 04 مرداد 1384, 21:21 عصر
این حالت کنترل ها رو یکی در میون حذف می کنه . اگه گفتید چرا ؟
اگر از ایندکس هم استفاده کنید ، یپغام خطای out of range خواهید گرفت . شاید این نکته جواب سوال قبلم رو کمی روشن تر کنه!
یه راه حل اینه که یه تابع بنویسید که کنترل رو با name اش برگردونه . مثلا یه تابع که روی کنترل ها می گرده و کنترلی که نامش مورد نظر شما بود رو برمیگردونه. حالا می تونید اول نام همه کنترل های فرمتون رو توی یک آرایه ذخیره کنید و بعد با استفاده از این تابع یکی یکی اونها رو حذف کنید. البته راه های دیگری هم وجود داره!

Babak-Aghili
سه شنبه 04 مرداد 1384, 22:52 عصر
نمیدونم چرا ؟؟؟
-----
من خودم عملا از Contrlos.Add استفاده کرده بودم ولی خب حدس زدم که بطور مشابه باید متد Remove ی هم وجود داشته باشد ...

حالا میگید یکی در میان حذف میکنه !! نمیدونم .. بلد نیستم .... خودت بگو چرا ؟

Kamran.K
سه شنبه 04 مرداد 1384, 23:26 عصر
با تشکر از هاشم عزیز:


private Control FindControl(Control host, string controlName)
{
foreach (Control ctrl in host.Controls)
{
if (ctrl.Name==controlName)
//یک کنترل پیدا شده
return ctrl;
}
//چیزی پیدا نشد
return null;
}
private void button1_Click(object sender, System.EventArgs e)
{
ArrayList aList = new ArrayList();
//یک لیست از نام کنترلهای مورد نظر تهیه می شود
foreach (Control ctrl in this.Controls)
{
if ((ctrl is TextBox) || (ctrl is ComboBox))
aList.Add(ctrl.Name);
}

//بر اساس نام کنترلهای تهیه شده انها را یافته و دخلشان را می اوریم :)
foreach (Object ob in aList)
{
this.Controls.Remove(this.FindControl(this, ctrl.ToString()));
}
}


البته اگر از 2005 استفاده کنید متد FindControl را بصورت کامل تر در اختیار خواهید داشت!
و اگر بخواهید FindControl را کامل کنید می‌بایست آنرا بصورت بازگشتی برای کنترلیهایی که خود حاوی کنترل هستند تکمیل کنید.

Kamran.K
سه شنبه 04 مرداد 1384, 23:36 عصر
این حالت کنترل ها رو یکی در میون حذف می کنه . اگه گفتید چرا ؟


خوب فرض کنید سه کنترل دارید به نام های a و b و c. پس ایندکس a برابر یک، b برابر دو و c برابر سه خواهد بود. وقتی در یک حلقه سعی میکنیم با متد controls.remove انها را حذف کنیم پس از حذف اولین کنترل (a) ایندکس b برابر یک و ایندکس c برابر دو خواهد شد، این درحالیست که در ادامه کار حلقه سعی می‌کنیم کنترل بعدی را حذف کنیم -یعنی کنترل با ایندکس 2- که اکنون این کنترل c خواهد بود و کنترل b به علت اینکه ایندکس آن پس از حذف یک کنترل تغییر یافته در این حلقه حذف نمی‌شود.
راه‌حل:
خوب یک راه این است که بر اساس فیلدی آنها را حذف کنیم که با حذف کنترل‌ها تغییر نکند. یک انتخاب می‌تواند نام کنترلها باشد که نمونه کد آن را در بالا ذکر کردم. درست گفتم؟؟؟؟

titbasoft
چهارشنبه 05 مرداد 1384, 12:59 عصر
بله همین طوره.
با استفاده از هر دو روش (foreach و حرکت روی ایندکس) پس از حذف هر کنترل کل collection دوباره reindex میشه . یعنی اگر شما به تعداد کنترل های موجود در صفحه کنترلی با ایندکس صفر رو حذف کنید خطا نحواهید گرفت. علت اینکه در حالت استفاده از ایندکس خطا می گیرید اینه بعد از حذف نیمی از کنترل ها ایندکس شما از حد بالای ایندکس ها خارج می شه و این خطا در foreach اتفاق نمیافته چون شما از متد remove استفاده می کنید و پارامتری که این متد قبول می کنه یک کنترله و اگر اون کنترل null هم باشه تنها اتفاقی که میافته اینه که هیچ کنترلی حذف نمیشه.

FindControl کاملا درسته. البته این امکان در asp.net در حال حاضر وجود داره و اونجا مشکلی نیست.