PDA

View Full Version : سوال: انتخاب فقط و فقط یک آیتم از CheckListBox



kh1387
سه شنبه 23 مهر 1387, 10:35 صبح
سلام
من می خوام چک لیستی داشته باشم که کاربر فقط و فقط بتونه یک گزینه رو از اون انتخاب کنه. مثل RadioButton
لطفا کمکم کنید.
متشکرم

Moslemu
سه شنبه 23 مهر 1387, 12:46 عصر
سلام.
يه راه اينه كه شما هر موقع كاربر گزينه‌اي رو انتخاب كرد، همه‌ي آيتم هاي تيك خورده‌ي ديگه تيكشون برداشته شه؛ كه راه مطمئني هست و شما مطمئن هستيد كه هميشه فقط يه گزينه انتخاب شده اما يه كم وقت گيره.

راه دوم و بهتر اينكه يه متغير داشته باشيد كه Index گزينه‌ي انتخاب شده رو نگهداره و وقتي كه گزينه‌ي جديدي انتخاب شد، گزينه‌ي انتخاب شده‌ي قبلي رو از حالت انتخاب خارج كنيد.

kh1387
سه شنبه 23 مهر 1387, 15:57 عصر
خیلی ممنونم از توجه تون اما:
می خوام بدونم خودش قابلیتی خاصیتی چیزی نداره؟

SMRAH1
چهارشنبه 24 مهر 1387, 06:26 صبح
سلام

دوست من ،فلسفه وجودی ListBox این بوده که کاربر بتونه یک گزینه رو از گزینه های موجود انتخاب کنه (شبیه ComboBox البته با کمی تفاوت).بعدها لازم شد که کاربر بتونه چند گزینه رو انتخاب کنه که ListBox با خاصیت های MultiSelection اومد.البته این نوع ListBox ایراد هایی هم داشت که مهمترینش عدم Friendly User بودنش بود (کاربر اگر می خواست فقط یک گزینه رو کم کمه یا باید دوباره همه رو از اول انتخاب می کرد - به خاطر اینکه با اولین کلیک همه گزینه ها می پرید - یا باید با کلید Ctrl اینکاررومی کرد که برای کاربران کمی خسته کننده است به اینها اشتباهات کاربر در کار رو هم اضافه کنید).برای همین CheckedListBox وجود داره که کاربر بتونه در هر لحظه چند گزینه رو انتخاب کنه که اول Select و Unselect راحتی داشته باشه (و مستقل باشند) ،ثانیا به شکل آشکارتری متوجه اننتخابهاش باشه و ...
این نکته ای که شما می فرمایید (انتخاب یکتا از check ها)،به نظر بنده با فلسفه وجودی CheckListBox مغایره و پیشنهاد می کنم که از خوده ListBox در این زمینه استفاده کنید.
البته قطعا در موارد نادری این گونه نیاز ها (مثلا در CheckListBox فقط یک گزینه رو Checked داشته باشه) نیازه.برای این منظور به راحتی می تونید برنامه بنویسید(با توجه به توضیحات بالا،قطعا متوجه عدم وجود یک چنین موردی شده اید).اگر نمی خواهید یک کنترل جدید را پیاده سازی کنید باید پیغام ItemChecked رو بگیرید و چون در هر لحظه صفر تا یا حداکثر یکی از گزینه ها Checked خوده با CheckedItems پیداش کنی و بعد از حالت انتخاب برداریش.
اگر می خواهی یک کنترل سفارشی پیاده سازی کنی (که من اینو سفارش می کنم) ،یک کنترل از CheckListBox مشتق می کنی و در رویداد OnItemCheck،همون فرایندی که خدمتتون عرض کردم،انجام بدید.

موفق باشی

kh1387
چهارشنبه 24 مهر 1387, 16:52 عصر
دوست خوبم ممنون از توضیح کاملتون
اما چیزی که همه بچه های برنامه نویس می گویند مشتق کردنه، میشه راجع به این هم توضیحی بدهید؟
ممنون

SMRAH1
پنج شنبه 25 مهر 1387, 17:06 عصر
سلام

براي ساختن يک کنترل سفارشي بايد مراحل زير رو انجام بدهيد.براي مثال ما يک کنترل MyCheckedListBox رو به پروژه اضافه مي کنيم که همون CheckedListBox معمولي است با اين تفاوت که فقط يک عنوان قابل انتخاب شدن است:

1) در پروژه مورد نظر ،منوي Project رو زده و گزينه Add New Item رو انتخاب کنيد(Project>Add New Item) تا پنجره Add New Item باز شود.

2) در قسمت Categories عنوان Windows Forms رو انتخاب کنيد .سپس در قسمت Template عنوان Custom Control رو انتخاب کنيد.

3) الان در قسمت Name پنجره مذکور،نام Custom Control.cs رو مي بينيد.اين نام رو به MyCheckedListBox.cs تغيير بديد و Ok کنيد.الان شما بايد صفحه طراحي رو با نام

MyCheckedListBox.cs[Design](البته با نوشته هايي در وسط آن که دلالت بر عدم قابليت طراحي دارد) ملاحظه کنيد.

4) منوي View>Code رو بزنيد تا وارد کد کنترل سفارشي خود شويد.در اين صفحه کد کلاس پياده سازي از کنترل وجود دارد.عبارت

public partial class MyCheckedListBox : Controlبه منزله آن است که شما در حال پياده سازي کلاس MyCheckedListBox هستيد با توجه به اين مطلب که از کلاس Control مشتق شده است.براي ارث بري کلاسMyCheckedListBox از کلاس CheckedListBox ،کافيست کلمه Control رو به CheckedListBox تغيير بدهيد.

5) در اين کلاس مي توانيد Property ها،متغيرها و همچنين متد مدنظرتون رو پياده سازي کنيد.همچنين مي توانيد رويداد هاي مد نظر در کنترل را هم دريافت و پردازش کنيد.براي دريافت رويداد ها کافيست به پنجره طراحي رفته و در فهرست رويدادهاي کنترل (پنجره Properties) مورد نظر را درخواست کنيد تا به شکل اتوماتيک رويداد مد نظر به کلاس شما اضافه شود.

6) شما مي توانيد برخي متدهاي کلاسهاي پايه که به شکل Virtual معرفي شده اند را (و معمولا با رويداد ها در ارتباط هستند) نيز در کلاس پياده سازي کنيد.براي دريافت فهرست اين رويداد ها به مشخصات کلاس پايه (در مثال ما CheckedListBox Members ) در MSDN مراجعه کند.
براي نمونه ما تابع

protected virtual void OnItemCheck(
ItemCheckEventArgs ice
)را که در هنگام کليک بر CheckBox ها اجرا مي شود،باز نويسي مي کنيم.تابع باز نويسي به اين شکل است:

protected override void OnItemCheck(ItemCheckEventArgs ice)
{
}که کد مورد نظر را (در مثال ما در هر بار بايد ابتدا چک کند که آيا کد ديگري داراي Check هست يا نه و در صورت يافتن آن را از حالت Check خارج کند).

نکته : متد OnPaint که به شکل پيشفرض در هنگام ساخت کنترل سفارشي به آن اضافه مي شود،به برنامه نويس اجازه مي دهد که در شکل بصري کنترل نيز دخالت کند.اما چون در اين پروژه ما قصد دخالت در طراحي ظاهري کنترل رو نداريم،يا مي توانيد اين متد را حذف کنيد يا اصلا در آن تغييري ندهيد.



بعد از پايان پياده سازي (يا در حين پياده سازي) مي توان از کنترل ساخته شده در فرم خود استفاده کنيد.براي اين منظور مراحل زير را دنبال کنيد:

1) اگر بعد از ايجاد کنترل سفارشي،هنوز برنامه کامپايل نکرده ايد،يک بار برنامه را کامپايل کنيد (حتي اگر برنامه داراي خطا است اشکالي ندارد فقط کافيست که يک بار عمل کامپايل را انجام دهيد).

2) پنجره طراحي فرم مورد نظر را باز کنيد.

3) در پنجره ToolBox (پنجره اي که تمام کنترل هاي طراحي مثل Button،TextBox و ... در آن است) ،در بالاترين قسمت آن مي توانيد نام کنترل مورد نظر خود (MyCheckedListBox) رو با يک آيکون چرخدنده آبي رنگ ملاحظه کنيد.

4) کنترل را انتخاب و در روي فرم ترسيم کنيد.

5) کار تمام است.با کامپايل برنامه از کنترل سغارشي خود لذت ببريد!

در ضمن در کد ضميمه،هم کنترل MyCheckListBox پياده سازي شده است و هم يک کنترل ساده ديگر با نام MyButton از Button (براي ملاحظه نحوه استفاده و کارکرد متد OnPaint) قرار گرفته است.


موفق باشيد