نمایش نتایج 1 تا 7 از 7

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

  1. #1

    پاک کردن همه کنترل های فرم یکجا

    چطوری میشه تمام کنترل های فرم رو توسط تکنیک foreach یکجا پاک کرد؟
    فرم شامل textbox , combobox میباشد.

  2. #2
    محروم شده آواتار Babak-Aghili
    تاریخ عضویت
    اسفند 1383
    محل زندگی
    در خاطرات شما
    پست
    801
    Controls.Remove
    یا RemoveControl

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

  4. #4
    محروم شده آواتار Babak-Aghili
    تاریخ عضویت
    اسفند 1383
    محل زندگی
    در خاطرات شما
    پست
    801
    نمیدونم چرا ؟؟؟
    -----
    من خودم عملا از Contrlos.Add استفاده کرده بودم ولی خب حدس زدم که بطور مشابه باید متد Remove ی هم وجود داشته باشد ...

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

  5. #5
    کاربر دائمی
    تاریخ عضویت
    آبان 1383
    محل زندگی
    تهران
    پست
    133
    با تشکر از هاشم عزیز:

    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 را کامل کنید می‌بایست آنرا بصورت بازگشتی برای کنترلیهایی که خود حاوی کنترل هستند تکمیل کنید.

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

  7. #7
    بله همین طوره.
    با استفاده از هر دو روش (foreach و حرکت روی ایندکس) پس از حذف هر کنترل کل collection دوباره reindex میشه . یعنی اگر شما به تعداد کنترل های موجود در صفحه کنترلی با ایندکس صفر رو حذف کنید خطا نحواهید گرفت. علت اینکه در حالت استفاده از ایندکس خطا می گیرید اینه بعد از حذف نیمی از کنترل ها ایندکس شما از حد بالای ایندکس ها خارج می شه و این خطا در foreach اتفاق نمیافته چون شما از متد remove استفاده می کنید و پارامتری که این متد قبول می کنه یک کنترله و اگر اون کنترل null هم باشه تنها اتفاقی که میافته اینه که هیچ کنترلی حذف نمیشه.
    FindControl
    کاملا درسته. البته این امکان در asp.net در حال حاضر وجود داره و اونجا مشکلی نیست.
    هر که بر مرکب باطل نشیند ، در سراى پیشمانى فرودش مى‏آورند

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •