PDA

View Full Version : حرفه ای: با هشت خط کد برای کنترل های خود SmartTag بسازید



mohsen_csharp
شنبه 17 مهر 1389, 10:41 صبح
با سلام
شاید مقالاتی درباره چگونگی ساخت SmartTag خونده باشید.
من هم چند روز پیش داشتم مقاله یکی دوستانم (حامد مصافی) که در این مورد بود رو می خوندم.
پس از خوندن این مقاله و مقاله های موجود در این زمینه دیدم که میزان کدنویسی حدودا 150 خط برای افزودن SmartTag برای یک کنترل نیاز می باشد و دیدم که این کدنویسی بهینه نیست
و برای هر کنترلی که می خواهیم براش SmartTag درست کنیم نیاز به تعریف کدهای تکراری و بدتر از اون تعریف Property های لازمه که برای هر کنترل متفاوت می باشد، می باشد.
حتی با بررسی کدهای microsoft نیز دیدم که برای هر کنترلی که خواسته اسمارت تگ درست کنه همون کدهای تکراری رو در کلاس های مختلف ایجاد کرده مانند کلاس های TextBoxActionList (http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Design:2.0.0.0:b03f5f7f11d50a3a/System.Windows.Forms.Design.TextBoxActionList) و TextBoxDesigner (http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Design:2.0.0.0:b03f5f7f11d50a3a/System.Windows.Forms.Design.TextBoxDesigner) و ComboBoxDesigner (http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Design:2.0.0.0:b03f5f7f11d50a3a/System.Windows.Forms.Design.ComboBoxDesigner) و ...
البته این کلاس های به صورت internal هستند و داخل DLL به نام System.Design تعریف شده اند
با این تفاسیر تصمیم گرفتم تا DLL بسازم که این کدنویسی رو به حداقل برسونه و هرکسی با این DLL به راحتی بتونه فقط با هشت خط کد برای کنترل های خود اسمارت تگ بسازه.
برای ساخت این DLL راه حل رو در این دیدم که باید کلاسی بسازم که بتونه run time برای خودش property بسازه و بین این Property ها و کنترل مورد نظر تناظر برقرار کنه
براین این منظور از اینترفیس ICustomTypeDescriptor استفاده کردم.
براتون این DLL با سورسش رو میزارم
روش استفاده ازش هم خیلی راحته
کافیه این DLL و System.Design را به رفرنس هاتون اضافه کنید و با نوشتن 8 خط کد زیر در داخل کدهای کنترل تون ازش استفاده کنید.
به فرض شما کلاسی نوشتید که از TextBox ارث بری کرده برای افزودن اسمارت تگ دلخواه کدهای زیر را اضافه کنید


publicclassmsTextBoxSmartTag : mohsen_csharp.msSmartTagDesigner
{
publicoverridevoid SetPropertyNames()
{
this._propertyNames = newstring[] { "Text", "BackColor" };
}
}
[DesignerAttribute(typeof(msTextBoxSmartTag))]
publicclassMyTextBox:TextBox
{
public MyTextBox()
{
this.Text = "";
}
[DefaultValue("")]
publicnewstring Text
{
get { returnbase.Text; }
set { base.Text = value; }
}
}

قسمت bold شده همون 8 خط مد نظر ماست
اگه دوستان سوالی داشتند درخدمتیم و اگه مشکلی دیدن به بنده اطلاع دهند
با تشکر محسن شاهد