PDA

View Full Version : مشکل با remove کردن کنترل .



harani
جمعه 07 مهر 1391, 11:27 صبح
دوستان من یک user conter شامل یک تکست باکس و یک چک باکس .
تو فرمم دو تا دکمه دارم .یکی Add و یکیم Remove و یک چک باکس به نام Check All.با Add یوزر کنترل ایجاد شده تو کنترل Flow Layout Panel موجود در فرمم اضافه میشه . تا اینجاش OK ????????

با چک باکس Check All همه ی چک باکسای یوزر کنترلهای اضافه شده انتخاب میشن.
من برای پاک کردن کنترلهایی که در کنترل flow Layout Panel فرمم اضافه شدن از کد زیر استفاده میکنم :


private void btnRemove_Click(object sender, EventArgs e)//f
{

foreach (Control ctrl in flpControl.Controls)//d
{
if ((ctrl as MyControl).CheckBox1.Checked)//c
flpControl.Controls.Remove(ctrl);//b
}


if (CheckAll.Checked) { flpControl.Controls.Clear(); CheckAll.Checked = false; //a}


}


مشکلم اینجاست زمانیکه کاربر چک باکس کنترل مورد نظرش را تیک میزند و میخواهد آن را پاک کند بدرست این عمل انجام نمیشود و باید چندین بار برای پاک کردن آنها دکمه remove را بفشارد . چگونه مشکل رو حل کنم .


جان هر کی دوست دارین راهنمایی کنید .

pedram.11
جمعه 07 مهر 1391, 12:25 عصر
به نظر من به جای حلقه foreacch از for استفاده کنید، چون توی حلقه foreach پیمایش همیشه ترتیبی نیس(فک کنم) و اینکه توی خود حلقتون با حذف کنترل ها indexها تغییر میکنن امکان داره حذف نشدن بعضی از کنترلها به خاطر همین باشه

Mahmoud.Afrad
جمعه 07 مهر 1391, 17:23 عصر
به اینصورت امتحان کن
//using System.Linq;

if (CheckAll.Checked)
{
flpControl.Controls.Clear();
CheckAll.Checked = false;
}
else
{
foreach (MyControl ctrl in flpControl.Controls.OfType<MyControl>())//d
{
if (ctrl.CheckBox1.Checked)
{
flpControl.Controls.Remove(ctrl);
//or ctrl.Dispose();
}
}
}

harani
جمعه 07 مهر 1391, 17:40 عصر
ممنون ولی بازم حل نشد اینا رو امتحان کردم ولی برای پاک شدن من باید چندین بار کلید Remove را بزنم تا همه ی کنترلهای تیک خورده پاک بشن .خوشحالم که شما جناب mafaman 2003 رو دوباره میبینم . منتظر جوابای کاملتون هستیم .

Mahmoud.Afrad
شنبه 08 مهر 1391, 02:24 صبح
یک tolist اضافه کنید
foreach (MyControl ctrl in flp.Controls.OfType<MyControl>().ToList())

harani
شنبه 08 مهر 1391, 09:34 صبح
ممنون فکر کنم درست شد .واقعاً هر وقت جواب منو دادین بیشتر اوقات به نتیجه رسیدم . بازم متشکر .

harani
شنبه 08 مهر 1391, 22:23 عصر
دوستان یه سوال دیگه چطوری میشه که اگر حتی یکی از چک باکسهای یوزر کنترلهای اضافه شده در کنترل Flow Layout Panel دستکاری شد تیک چک باکس CheckAll برداشته بشه .
ممنون لطفاً راهنمایی کنید.

Mahmoud.Afrad
یک شنبه 09 مهر 1391, 00:25 صبح
حالا که چک باکس رو پابلیک کردید و در دسترس هست ، موقع اضافه کردن کنترل به flp یک رویداد به چک باکس یوزرکنترل نسبت بدید:
MyControl mc = new MyControl();
mc.checkBox1.CheckedChanged += new EventHandler(checkBox1_CheckedChanged);
flp.Controls.Add(mc);

رویداد رو هم به اینصورت بنویسید:
void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if ((sender as CheckBox).Checked == false)
{
this.checkBoxAll.Checked = false;
}
}

harani
یک شنبه 09 مهر 1391, 01:35 صبح
ممنون ولی درست کار نمیکنه یعنی زمانی که بوسیله check All همه ی چک باکسا رو انتخاب میکنم در صورتی که مثلاً تیک یکی از چک باکسای موجود در یوزر کنترلهای اضافه شده رو برمیدارم .چک باکس Check All برداشته میشه ولی تیکهای چک باکسای کنترلهای اضافه شده هم برداشته میشه .لطفاً بازم راهنمایی کنید .

Mahmoud.Afrad
یک شنبه 09 مهر 1391, 17:18 عصر
باید کدی که در رویداد چک باکس Check All نوشتی رو اصلاح کنی. چیزی شبیه این
private void checkBoxAll_CheckedChanged(object sender, EventArgs e)
{
if (checkBoxAll.Checked)
{
foreach (MyControl mc in flp.Controls.OfType<MyControl>().ToList())
{
mc.checkBox1.Checked = true;
}
}
}

harani
یک شنبه 09 مهر 1391, 23:00 عصر
ممنون اُستاد درست شد . تشکر از پاسخ جامعتون .

harani
یک شنبه 09 مهر 1391, 23:25 عصر
به عنوان سوال آخر میخواستم بگم که کدی که شما دادید کاملاً درسته ولی من میخوام در حالی که با برداشتن تیک یک کنترل CheckAll نیز تیکش برداشته میشه میخوام اگرم تیک CheckAll نیز برداشته شد تمامی تیکهای کنترلها رو برداره ولی یک تداخلی داره . یعنی اگه بخوام از کد زیر استفاده کنم .با برداشتن تیک یکی از کنترلها تیک CheckAll هم برداشته میشه که موجب میشه تیک تمامی کنترلها برداشته بشه که من اینو نمیخوام .


private void CheckAll_Exp_CheckedChanged(object sender, EventArgs e)//k
{
foreach (Experience_control ec in flpControl_Exp.Controls.OfType<Experience_control>().ToList())//h
{
if (CheckAll_Exp.Checked)//v
ec.Chk_Exp.Checked = true;//b

else
ec.Chk_Exp.Checked = false;//a

}
}
اگه راهی را هم میدانید که زمانیکه کاربر خودش تمامی تیکهای کنترلها را فعال کرد خودبخود تیک CheckAll نیز فعال بشه .

با سپاس فراوان

Mahmoud.Afrad
دوشنبه 10 مهر 1391, 01:01 صبح
توی هیچ برنامه ای ندیدم که با یک چک باکس دو کار غیرهمسان انجام بدن مخصوصا با چنین تداخلی. معمولا برای این کار یه چک باکس دیگه برای UncheckedAll اضافه میکنند.
(درضمن من استاد نیستم.)

harani
دوشنبه 10 مهر 1391, 11:59 صبح
راستش گوشی من همچین کاری رو میکنه یعنی مثلاً میخوام Sms ها رو پاک کنم روی دکمه ی Delete که کلیک میکنم بغل آنها یک چک باکس ایجاد میکنه . یک چک باکس در بالای آنها نیز به نام Select All هم تشکیل میشه . با Select All هم تمامی تیکهای چک باکسا انتخاب و هم حذف میشن . .سپس اگر یکی از چک باکسا false شد چک باکس Select All هم false میشه . در نهایتم اگر کاربر خودش تمامی چک باکسا رو فعال کرد Select All هم بصورت اتومات تیک میخورد .