بروز رسانی آذر ۹ام, ۱۳۹۹ ۱۲:۴۹ بعد از ظهر
فروردین ۲۹, ۱۳۹۴ admin آموزش برنامه نويسي 0
در آن پست نیت و اراده داریم نحوه ساخت یک کنترل سفارشی (Custom Control) شده را با زبان برنامه جذاب و جالب و خوبنویسی C# در .Net با هم پیش ببریم. ما به کنترل ComboBox ویندوز قابلیت Read-Only شدن متن انتخاب شده را اضافه میکنیم.
در صورتی که دقت کرده باشید کنترل TextBox شامل خاصیتی بنام ReadOnly از نوع Boolean میباشد که با تنظیم مقدار true جهت آن هم، متن وارد شده غیر قابل ویرایش میمی شود. دقت می شود که آن خاصیت با خاصیت Enabled در کنترلها تفاوت دارد. خاصیت Enabled تمام کنترل را غیر فعال میکند و همچنین امکان انتخاب آن هم توسط کاربر وجود ندارد. خب بریم سراغ اصل مطلب.
نحوه ساخت کنترل ReadOnlyComboBox
چندی پیش که روی یک پروژه کار میکردم مستلزم و نیاز به یک لیست آبشاری (ComboBox) داشتم که هنگام و زمانی که غیر فعال میباشد کاربر امکان کپی کردن متن آیتم انتخاب شده را داشته باشد. کنترل ComboBox چنین قابلیتی را ارائه نمیدهد. دقت کنید که آن کنترل مثل سایر کنترلها شامل خاصیت Enabled میباشد ولی باید توجه داشت با فعال کردن آن هم تمام کنترل غیر فعال میمی شود و همچنین دیگر امکان انتخاب آن هم وجود ندارد. به شکل زیر دقت کنید.
ساخت کنترل سفارشی ReadOnlyComboBox در C#
همانطور که در شکل بالا دیدن میکنید کنترل Combox پیشفرض ویندوز هنگامی که غیر فعال میباشد دیگر امکان انتخاب متن را از کاربر سلب میکند. کنترل با کادر نارنجی رنگ نشان داده شده می باشد.
جهت حل آن مشکل یک کنترل سفارشی به نام ReadOnlyComboBox طراحی کردیم که از کلاس ComboBox ارثبری دارد. در آن کلاس یک فیلد خصوصی از نوع TextBox تعریف کردیم و همچنین یک خاصیت ReadOnly از نوع bool به آن هم افزودیم.
هنگامی که مقدار آن متغیر تنظیم میمی شود ما کنترل ComboBox را مخفی میکنیم و همچنین بجای آن هم کنترل TextBox را نشان میدهیم. حقهای جذاب و جالب ولی باید توجه داشت خیلی زیاد ساده!!!
خب بریم سراغ کدنویسی کنترل ReadOnlyComboBox.
مراحل انجام کار
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 میباشند که از نوع 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# ساخته یا ایجاد کرد.
امیدوارم از آن پست نهایت بهره بری و استفاده را برده باشید.
منبع
تازه ترین و جدیدترینکتابهای آموزش برنامه جذاب و جالب و خوب نویسی : نحوه ساخت User Control در زبان C# – ساخت کنترل ReadOnlyComboBox
آذر ۲۵, ۱۳۹۷ 0
آذر ۱۷, ۱۳۹۷ 0
آذر ۰۷, ۱۳۹۷ 0
آذر ۰۵, ۱۳۹۷ 0