در این پست قصد داریم نحوه ساخت یک کنترل سفارشی (Custom Control) شده را با زبان برنامهنویسی C# در .Net با هم پیش ببریم. ما به کنترل ComboBox ویندوز قابلیت Read-Only شدن متن انتخاب شده را اضافه میکنیم.
اگر دقت کرده باشید کنترل TextBox دارای خاصیتی بنام ReadOnly از نوع Boolean میباشد که با تنظیم مقدار true برای آن، متن وارد شده غیر قابل ویرایش میشود. دقت شود که این خاصیت با خاصیت Enabled در کنترلها تفاوت دارد. خاصیت Enabled تمام کنترل را غیر فعال میکند و امکان انتخاب آن توسط کاربر وجود ندارد. خب بریم سراغ اصل مطلب.
نحوه ساخت کنترل ReadOnlyComboBox
چندی پیش که روی یک پروژه کار میکردم نیاز به یک لیست آبشاری (ComboBox) داشتم که وقتی غیر فعال میباشد کاربر امکان کپی کردن متن آیتم انتخاب شده را داشته باشد. کنترل ComboBox چنین قابلیتی را ارائه نمیدهد. دقت کنید که این کنترل همانند سایر کنترلها دارای خاصیت Enabled میباشد اما با فعال کردن آن تمام کنترل غیر فعال میشود و دیگر امکان انتخاب آن وجود ندارد. به شکل زیر دقت کنید.
همانطور که در شکل بالا مشاهده میکنید کنترل Combox پیشفرض ویندوز هنگامی که غیر فعال میباشد دیگر امکان انتخاب متن را از کاربر سلب میکند. کنترل با کادر نارنجی رنگ نشان داده شده است.
برای حل این مشکل یک کنترل سفارشی به نام ReadOnlyComboBox طراحی کردیم که از کلاس ComboBox ارثبری دارد. در این کلاس یک فیلد خصوصی از نوع TextBox تعریف کردیم و یک خاصیت ReadOnly از نوع bool به آن افزودیم.
هنگامی که مقدار این متغیر تنظیم میشود ما کنترل ComboBox را مخفی میکنیم و بجای آن کنترل TextBox را نشان میدهیم. حقهای جالب اما بسیار ساده!!!
خب بریم سراغ کدنویسی کنترل ReadOnlyComboBox.
مراحل انجام کار
ابتدا یک پروژه از نوع ClassLibrary ایجاد کنید. عنوان پروژه را ReadOnlyComboBox قرار دهید. یک کلاس پیشفرض به پروژه اضافه میشود، عنوان ReadOnlyComboBox را برای آن برگزینید.
به محیط کدنویسی رفته و تغییرات زیر را برای ارثبری کلاس ReadOnlyComboBox از کلاس ComboBox انجام دهید.
public class ReadOnlyComboBox : ComboBox
به کلاس فوق دو متغیر زیر را اضافه کنید.
private TextBox textBox; private bool readOnly;
متغیر textBox برای زمانی است که اگر مقدار readOnly برابر true قرار گیرد به کاربر نشان داده میشود و کنترل ComboBox مخفی میشود.
حال خاصیت زیر را به کلاس اضافه کنید
public bool ReadOnly { get { return readOnly; } set { this.readOnly = value; if (textBox == null) { textBox = new TextBox { Text = base.Text, Visible = false, ReadOnly = true }; } if (textBox.Parent == null && this.Parent != null) { textBox.Parent = this.Parent; textBox.Parent.Controls.Add(textbox); } if (this.readOnly) { textBox.Text = this.Text; textBox.Location = this.Location; textBox.Size = this.Size; textBox.Dock = this.Dock; textBox.Anchor = this.Anchor; textBox.Enabled = this.Enabled; textBox.RightToLeft = this.RightToLeft; textBox.Font = this.Font; textBox.TabStop = this.TabStop; textBox.TabIndex = this.TabIndex; } textBox.Visible = this.readOnly; this.Visible = !this.readOnly; } }
این خاصیت قلب کنترل ReadOnlyComboBox میباشد. وقتی که کاربر مقدار این خاصیت را با true تنظیم کند، ابتدا کنترل textBox را بصورت زیر ایجاد میکند:
if (textBox == null) { textBox = new TextBox { ReadOnly = true, Text = base.Text, Visible = false}; }
دقت شود که خاصیت ReadOnly مربوط به کنترل textBox را برابر true قرار دادهایم. همچنین دقت کنید که در تمام طول دوره حیات کنترل ReadOnlyComboBox، کنترل textBox تنها یک بار ایجاد میشود و هر بار ما چک میکنیم که اگر این کنترل برابر با null نباشد دیگر نیازی به ایجاد مجدد آن نمیباشد. این کار باعث صرفهجویی در مصرف حافظه کنترل ReadOnlyComboBox میشود. دقت شود که به این نحوه ساخت اشیاء در اصلاح Lazy Load گفته میشود. یعنی یک شئ تا زمانی که نیاز به آن نباشد ساخته نمیشود و در نتیجه هیچ حافظهای را هم مصرف نمیکند. و بهنگام ساخت هم، همیشه از همان مقادیر قبلی استفاده میکند. دقت کنید که کنترل textBox تنها زمانی ایجاد میشود که کاربر مقدار خاصیت ReadOnly کنترل ReadOnlyComboBox را تنظیم کند و این یعنی اینکه اگر در طی روال برنامه، شما هیچ کاری با این خاصیت انجام ندهید، کنترل textBox هم هیچ وقت ساخته نمیشود.
در مرحله بعدی کد، ما دو شرط را بصورت زیر بررسی میکنیم:
if (textBox.Parent == null && this.Parent != null) { textBox.Parent = this.Parent; textBox.Parent.Controls.Add(textbox); }
اگر شئ this یعنی همان شئ از نوع ReadOnlyComboBox دارای Parent باشد، یعنی به فرم اضافه شده باشد و یا اینکه در کد به یک کنترل Containerایی دیگر افزوده شده باشد و همچنین Parent شئ textBox یعنی همان Parent شئ this مقداری نداشته باشد دو کار انجام میدهیم:
- Parent شئ this را به Parent شئ textBox ست میکنیم. این یعنی اینکه کنترل textBox به همان کنترلی افزوده شود (جهت نمایش به کاربر) که شئ this در آن قرار دارد.
- شئ textBox را جهت نمایش به کاربر به کنترل Parent اضافه میکنیم.
دقت شود که تمامی کنترلها دارای خاصیتی بنام Parent میباشند که از نوع Control میباشد. این خاصیت نشان دهنده کنترل Container یا همان کنترل در برگیرنده کنترل موجود میباشد. برای روشن شدن موضوع، وقتی که ما کنترل ReadOnlyComboBox را به فرم برنامه اضافه کنیم، مقدار خاصیت Parent آن با شئ فرمی که در آن قرار دارد ست میشود.
در مرحله بعدی چک میکنیم که اگر مقدار readOnly برابر true باشد تمامی ویژگیهای کنترل ComboBox را از جمله مقدار Text آن(یعنی آیتمی که انتخاب شده است)، مقدار Font، موقعیت مکانی آن روی کنترل Parent، و … بصورت زیر تنظیم میشود.
if (this.readOnly) { textBox.Text = this.Text; textBox.Location = this.Location; textBox.Size = this.Size; textBox.Dock = this.Dock; textBox.Anchor = this.Anchor; textBox.Enabled = this.Enabled; textBox.RightToLeft = this.RightToLeft; textBox.Font = this.Font; textBox.TabStop = this.TabStop; textBox.TabIndex = this.TabIndex; }
در نهایت نیز با قرار دادن مقدار readOnly به خاصیت Visibility شئ textBox وضیت نمایش (مقدار true) و یا عدم نمایش (مقدار false) را به شئ textBox اعلان میکنیم. همچنین با نقیض کردن مقدار readOnly و ست کردن آن به خاصیت Visibility شئ this به آن میگوییم که اگر مقدار خاصیت readOnly برابر true باشد، یعنی باید شئ textBox را نمایش دهد و خود شئ this مخفی شود(Visibility = !true = false) و اگر مقدار readOnly برابر false باشد، یعنی اینکه باید کنترل را از حالت readOnly خارج کنیم. این کار با مخفی کردن شئ textBox و نمایش دادن شئ this انجام میگیرد.
textBox.Visible = this.readOnly; this.Visible = !this.readOnly;
این تمام کاری بود که باید انجام میدادیم.
در نهایت برای استفاده از این کنترل کافیست که این کنترل را به ToolBox ویژوال استودیو اضافه کنید. نحوه اضافه کردن به این صورت میباشد که ابتدا در ToolBox کلیک راست کرده و گزینه Choose Items را انتخاب کنید و سپس در فرم باز شده دکمه Browse را کلیک کرده و در پنجره Open فایل ReadOnlyComboBox.dll را انتخاب کنید. دقت کنید که این فایل در پوشه bin/Debug پروژه قرار دارد. با انتخاب این فایل، کنترل ReadOnlyComboBox به ToolBox افزوده میشود و شما میتوانید در پروژههایتان از آین کنترل سفارشی استفاده کنید.
در این پست شما دیدید که چقدر به راحتی میتوان یک کنترل سفارشی (Custom Control) را در .Net و با استفاده از زبان برنامهنویسی C# ایجاد کرد.
در سایت تعداد زیادی سورس کد در این زمینه منتشر شده است مثل سورس کد پروژه سایت فروشگاه لپ تاپ به زبان سی شارپ، سورس پروژه مدیریت کارمندان به زبان سی شارپ و MVC، سورس کد پروژه ماشین حساب به زبان سی شارپ و سورس کد پروژه ذکر ایام هفته به زبان سی شارپ که مورد توجه کاربران قرار گرفته اند. اگر هم میخواهید برنامه نویسی سی شارپ یاد بگیرید حتما مقاله چگونه متخصص سی شارپ شویم ؟ را مطالعه کنید.
دیدگاه کاربران
تعداد دیدگاه های کاربران : ۰ دیدگاه