PDA

View Full Version : جلوگیری از تیک زدن آیتم های CheckedListBox



iman_s52
چهارشنبه 28 شهریور 1386, 12:54 عصر
با سلام خدمت دوستان
من یه CheckedListBox دارم که نمی خوام کاربر بتونه بعضی هاشو Checked بکنه تویه رویداد کلیک تونستم مانع اینکار بشم ولی با کیبورد نمی دون چطوری جلوشو بگیرم ؟؟ کافیه روی اون آیتم Spacebar رو بزنه .

PC2st
چهارشنبه 28 شهریور 1386, 16:38 عصر
از رویداد ItemCheck استفاده کنید، مثلا:


private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if(e.Index == 2) e.NewValue = CheckState.Unchecked;
}

کد فوق باعث میشه که گزینه سوم هیچوقت checked نشه.

iman_s52
پنج شنبه 29 شهریور 1386, 08:24 صبح
خیلی ممنون دوست عزیز
یه سوال دیگه هم داشتم اگه لطف کنین !!
من تویه فرمم دوتا ‍CheckedListBox دارم که تویه لود فرمم آیتم هاشونو می سازم (Add) حالا مشکل اینه که یکی از اونا رو وقتی میرم یه آیتم رو تیک کنم می پره یا قاطی میکنه مثلا اگه تیک 2 رو می زنم 3و4 رو تیک می زنه یا اینکه اصلا نمیذاره تیک بزنم چرا اینطوری میشه ؟؟؟؟

MH2538
پنج شنبه 29 شهریور 1386, 09:20 صبح
سلام
احتمالاًشما در کدتون اشکالی وجود داره.
اگر براتون ممکنه کد مربوط به بخش پر کردن آیتم‌های چک‌لیست‌باکستون رو بزارید

PC2st
پنج شنبه 29 شهریور 1386, 17:09 عصر
من تویه فرمم دوتا ‍CheckedListBox دارم که تویه لود فرمم آیتم هاشونو می سازم (Add) حالا مشکل اینه که یکی از اونا رو وقتی میرم یه آیتم رو تیک کنم می پره یا قاطی میکنه مثلا اگه تیک 2 رو می زنم 3و4 رو تیک می زنه یا اینکه اصلا نمیذاره تیک بزنم چرا اینطوری میشه ؟؟؟؟
چون کدها رو در رویداد Load مینویسید، پس یعنی اینکه رویداد ItemCheck رو قبلا برای CheckedListBox ایجاد کردید و در اینصورت، وقتی که یک آیتم رو Add میکنید، و سریعا اون رو تیک بزنید، ممکنه مشکلی پیش بیاد. در هر صورت همانطور که MH2538 گفتند، از روی کد میشه تشخیص داد که چرا اینطور میشه.

iman_s52
جمعه 30 شهریور 1386, 03:43 صبح
مشکلم حل شد ولی نمی دونم چه ربطی داشت ؟؟؟
اونجاییکه آیتم هام رو Add می کردم Trim که گذاشتم حل شد.

iman_s52
شنبه 31 شهریور 1386, 04:05 صبح
یه سوال دیگه :
چطوری میشه برای تک تک آیتم های CheckedListBox خاصیت Tag تعریف کرد ؟؟؟

PC2st
شنبه 31 شهریور 1386, 04:39 صبح
در حالت معمولی، آیتم های CheckedListBox چنین قابلیتی ندارند، آیتم های CheckedListBox از نوع Object خواهند بود، پس بر اساس آیتمی که در CheckedListBox قرار میگیره، یک آیتم میتونه حاوی خاصیت Tag باشه و آیتم دیگر میتونه این خاصیت رو نداشته باشه، مثلا اگر یک شیئ از نوع Control رو در آیتم های آن قرار بدید، میتونید از خاصیت Tag برای آن آیتم استفاده کنید، مثلا:


Control A = new Control();
A.Tag = "SYYYYYYYYS";
checkedListBox1.Items.Add(A);
this.Text = (string)((Control)checkedListBox1.Items[0]).Tag;

iman_s52
یک شنبه 01 مهر 1386, 13:39 عصر
چطوری میشه یه این آیتم هایی که اضافه شده متن هم اضافه کرد ؟؟؟؟

PC2st
یک شنبه 01 مهر 1386, 18:14 عصر
چطوری میشه یه این آیتم هایی که اضافه شده متن هم اضافه کرد ؟؟؟؟
این سوالی که پرسیدی برای من هم یک مشکل شد! من هم نمیدونم چرا اینطور شده؟

وقتی که یک شیئ رو در آیتمهای CheckedListBox قرار میدیم، متد ToString از این آیتمها صدا زده میشه و با توجه به خروجی این متد، یک متن متناظر با آن شیئ در لیست ایتمها نمایش داده میشه، مثلا کلاس زیر رو در نظر بگیرید:


public class TEST
{
private string text;
public TEST(string text)
{
this.text = text;
}
public override string ToString()
{
return this.text;
}
}

و یک شیئ از نوع کلاس TEST (کلاس مذکور) را در آیتمهای CheckedListBox قرار میدیم:


TEST test = new TEST("Hello");
checkedListBox1.Items.Add(test);

که همانطور که میبینید، برای نمایش شیئ test، متد ToString رو صدا میزنه.

اما نفهمیدم چرا برای کلاس Controls چنین حالتی رخ نمیده؟
از دوستان کسی تجربه ای در این زمینه داره که به چه دلیلی این حالت رخ میده؟ :متفکر:

iman_s52
دوشنبه 02 مهر 1386, 04:16 صبح
من اینجوری تکست اضافه می کنم ولی تویه Cast کردن گیر میده :


private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
Control tmp = new Control();
tmp.Tag = i.ToString();
checkedListBox1.Items.Add(tmp);
checkedListBox1.Items[i] = string.Format("ItemNo {0}", i.ToString());
}
}

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
this.Text = (string)((Control)checkedListBox1.Items[e.Index]).Tag;
}

فکر کنم روشش غلطه ؟؟؟؟

PC2st
دوشنبه 02 مهر 1386, 05:03 صبح
آقا کم کم داریم از موضوع این تاپیک می پریم به یک موضوع دیگه :لبخند: :متفکر:

راستش وقتی که کد زیر رو مینویسید، یک شیئ کنترل در آیتمها قرار میگیره:


checkedListBox1.Items.Add(tmp);

و وقتی که در خط بعد کد زیر رو مینویسید، یک شیئ string جایگزین شیئ کنترل میشه!


checkedListBox1.Items[i] = string.Format("ItemNo {0}", i.ToString());

در واقع در آیتم شماره i دیگه شیئ tmp وجود نداره و یک string بجای اون قرار گرفته.
پس آیتم شماره i یک داده از نوع string خواهد بود و نمیشه این نوع داده رو به نوع Control تغییر داد.

iman_s52
دوشنبه 02 مهر 1386, 07:55 صبح
پس می کین چکار میشه کرد دیگه روی Tag حساب نکنم ؟؟؟؟ روشم رو عوض کنم ؟؟؟

PC2st
دوشنبه 02 مهر 1386, 15:02 عصر
متاسفانه دلیل عدم نمایش متن آیتمهای از نوع کنترل رو نمیدونم. (چه نیازی به خاصیت Tag دارید؟)

در هر صورت چون موضوع مورد بحث با موضوع تاپیک متفاوت شده، بهتره برای یافتن دلیل یا راه حل، یک تاپیک جدید برای آن ایجاد کنید تا این موضوع در یک تاپیک جدید به بحث گذاشته بشه تا سایر دوستان هم از آن مطلع شده و مباحث موجود در تاپیکها بصورت مرتب تری آرشیو شوند که در نتیجه جستجوی مطالب گذشته رو برای سایر افراد ساده تر میکنه.

من و شما و سایر دوستان در اون تاپیک بحث رو با هم ادامه بدیم :-)