|
کلاسهای (Abstract):
کلاسهای Abstract کلاسهایی هستند که دارای یک یا چند متد پیاده سازی نشده هستند. اگر متدی رو به شکل abstract تعریف کردید، باید کلاس رو هم به شکل abstract تعریف کنید. بطور مثال یک کلاس پایه با نام Shape تعریف می کنیم که پارامترهایی رو نگهداری می کنه و یک شی Pen هم برای رسم می سازیم. متد draw برای رسم استفاده می شه و ما اون رو فقط تعریف می کنیم و کدی رو برای پیاده سازی اون نمی نویسیم، چون هر شکلی به روش رسم خاصی نیاز دارد. (زمانی از کلاسهای Abstract استفاده می کنیم که بخواهیم کلاس پایه ای داشته باشیم و متدهای اون در کلاسهای مشتق شده نیاز به بازنویسی داشته باشه) به لیست کد 1 دقت کنید: // List Code 1 توجه کنید که ما متد draw رو به شکل abstract تعریف کرده ایم و پس از تعریف با استفاده از ; انتهای تعریف متد را مشخص کرده ایم. کلاس تعریف شده نیز به شکل abstract تعریف شده است.public abstract class Shape { protected int height, width; protected int xpos, ypos; protected Pen bPen; //----- public Shape(int x, int y, int h, int w) { width = w; height = h; xpos = x; ypos = y; bPen = new Pen(Color.Black); } //----- public abstract void draw(Graphics g); //----- public virtual float getArea() { return height * width; } } همچنین برای استفاده از کلاسهای abstract نیز باید از کلاسهای مشتق شده اون یک نمونه بگیرید و از کلاس abstract نمی توان یک نمونه ایجاد کرد. ادامه مسیر ساخت کلاس رو پی می گیریم و حالا باید کلاس Rectangle رو بسازیم. برای این منظور کلاس مورد نظر رو از کلاس Shape که به شکل Abstract تعریف شده مشتق می کنیم. به لیست کد 2 توجه فرمایید: // List Code 2 (Rectangle class derived from abstract base class) کلاس Rectangle کلاسی است که می توانید از آن یک نمونه بگیرید. که یک متد draw واقعی دارد و می تواند رسم مستطیل را انجام دهد. برای مثال کلاس دومی رو هم پیاده سازی کرده ایم. به لیست کد 3 دقت نمایید که پیاده سازی کلاس Circle را نمایش می دهد.public class Rectangle:Shape { public Rectangle(int x, int y,int h, int w):base(x,y,h,w) {} //----- public override void draw(Graphics g) { g.DrawRectangle (bPen, xpos, ypos, width, height); } } // List Code 3 (Circle class derived from abstract base class) حالا می خواهیم که بر اساس کلاس های تعریف شده، نمونه ای ایجاد کنیم. در لیست کد 4 نمونه های تعریف شده اند که پارمترهای مورد نیاز با استفاده از سازنده اون ارسال شده است.public class Circle :Shape { public Circle(int x, int y, int r):base(x,y,r,r) {} //----- public override void draw(Graphics g) { g.DrawEllipse (bPen, xpos, ypos, width, height); } } // List Code 4 در آخر، در رویداد Paint رسم دایره و مستطیل رو انجام می دهیم. به لیست کد 4 دقت نمایید که یک دایره و یک مستطیل رسم شده است.public class Form1 : System.Windows.Forms.Form { private PictureBox pictureBox1; private Container components = null; private Shape rect, circ; //----- public Form1() { InitializeComponent(); init(); } //----- private void init() { rect = new CsharpPats.Rectangle (50, 60, 70, 100); circ = new Circle (100,60, 50); } } // List Code 5 تمرین: یک پروژه برای مثال این پست ساخته آن را برای رسم پنج ضلعی منتظم توسعه دهید.private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics ; rect.draw (g); circ.draw (g); } مقایسه کلاسهای Abstract و کلاسهای Interface: - زمانی که یک کلاس واسط Interface Class تعریف می کنیم، مجموعه ای از تعریف یک یا چند متد رو خواهیم داشت که باید برای هر کلاسی که از این واسط مشتق می شود کد نویسی شود. هیچ کدی اولیه ای برای کلاسها نوشته نخواهد شد. در این حالت شما یک ساختار درختی از وراثت کلاسها خواهید داشت که از کلاس پایه (کلاس واسط) نمی توان نمونه ای ایجاد کرد و اگر متدی از واسط رو در کلاس خارجی تعریف و کد نویسی نکنید حتما با خطای کامپایلر مواجه خواهید شد. - زمانی که یک کلاس Abstract می سازید، شما یک کلاس پایه با تعریف یک یا چند متد دارید که ممکن است کد نویسی شده یا نشده باشند و به شکل Abstract تعریف شده است. شما نمی توانید از یک کلاس Abstract نمونه بگیرید و البته می توانید از کلاس مشتق شده از کلاس Abstratct که متدهای اون پیاده سازی شده است، نمونه بگیرید. اگر همه متدهای تعریف شده در کلاس بدون کد باشند، این کلاس کاملا مشابه کلاسهای واسط خواهد بود با این محدودیت که نمی توانید از آن مانند کلاس واسط ساختار درختی وراثت را داشته باشید. بیشترین استفاده از کلاسهای Abstract فراهم نمودن تعریف کلاس پایه ای است برای کلاسهای مشتق شده ای که می خواهند کاری را انجام دهند و به برنامه نویس اجازه داده می شود که شخصا کدهای موردنیازش را در کلاسهای مشتق شده مختلفی پیاده سازی نماید. استفاده دیگر پیاده سازی متدهای خالی از کد است که ممکن است در کلاسهای مشتق شده دیگر پیاده سازی نشده باشند و بخواهید اطمینان داشته باشید که پروژه شما کامپایل خواهد شد. به مثال زیر توجه نمایید (لیست کد 6): // List Code 6 در این مثال متد draw خالی رها شده و کدی برای آن نوشته نشده است و کلاس مشتق شده بدون مشکل کامپایل خواهد شد. و هیچ اشاره ای به اینکه این متد یک متد Abstract بازنویسی شده است نمی شود.public class NullShape { protected int height, width; protected int xpos, ypos; protected Pen bPen; //----- public Shape(int x, int y, int h, int w) { width = w; height = h; xpos = x; ypos = y; bPen = new Pen(Color.Black ); } //----- public void draw(Graphics g){} //----- public virtual float getArea() { return height * width; } } بسیار عالی، این آخرین قسمت از آموزش کلاس در سی شارپ بود که تقدیم دوستان شد. سری بعدی آموزش رو هنوز در نظر نگرفتم ولی به احتمال بسیار زیاد بحث UML Diagram رو شروع خواهم کرد. در کنار این موضوع سعی می کنم مطالب جدید و پراکنده ای هم در سایت قرار بدم. و مثل همیشه و طبق معمول از دیر بروزرسانی شدن وبلاگ عذر خواهی می کنم. تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، کلاس، تعریف کلاس، ارث بری، کلاس مشتق شده، کلاس پایه، کلاس واسط
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Abstract Class,Abstract, Class, Inheritance, Derived Class, Base Class, Derived Abstract Class, Example, Interface, Interface Class
+
نوشته شده در سه شنبه بیست و هشتم آبان 1387ساعت 14:30 توسط کنستانتین
|
اگه تا حالا حرفه ای ها رو تو کا ر با نرم افزارهای مختلف دیده باشید متوجه شدید که همشون موقع کار با نرم افزار مورد نظرشون از صفحه کلید زیاد استفاده می کنن مثل همین دوست عزیزم مهدی وقتی که داره با Photoshop کار می کنه و یا احمدرضا وقتی داره با Visual Studio کار می کنه (احتمال میدم کامپیوتر شخصی خودش ماوس نداشته باشه چون نیازی بهش نداره). تو این پست تصمیم گرفتم در راستای هرچه حرفه ای تر شدن لیستی از کلیدهای میانبری که توی VS2008 زیاد مورد استفاده قرار می گیرن معرفی کنم.
+
نوشته شده در چهارشنبه هشتم آبان 1387ساعت 20:54 توسط ققنوس
|
فرض کنید که تو برنامتون یه enum دارید که شامل برندهای موبایله و کابر باید نام برند مورد نظرشو وارد کنه و شما بر اساس اون واکنش نشون بدید.
enum MobileBrands : short در این صورت برای تبدیل رشته ورودی به enum از چه روشی استفاده می کنید؟ اگه رشته ورودی را مستقیما بخواهید توی متغیری از جنس enum بریزید (مثل کد زیر)
static void Main(string[] args) خطای زیر اتفاق میفته: Cannot implicitly convert type 'string' to 'EnumConvert.MobileBrands' راه دوم اینه که با استفاده از switch متغیر مورد نظر را مقداردهی کنیم:
static void Main(string[] args) اما راه سوم و ساده ترین راه استفاده از متد Enum.Parse است. به مثال زیر توجه کنید: static void Main(string[] args) اگه روش سوم را با Generic ادغام کنیم می تونیم متدی بنویسیم که هر رشته ای را به enum مورد نظر تبدیل کنه:
public static T StringToEnum به نحوه استفاده از این متد توجه کنید:
static void Main(string[] args)
+
نوشته شده در شنبه نهم شهریور 1387ساعت 0:15 توسط ققنوس
|
پاسخ به نظرات
یاسمن عزیز در مورد یه قطعه کد C# توضیح خواستن که توضیحش اینه: خط 1: آرایه ای از نوع Point گرفته به تعداد 10 تا خط 2: یک شی از نوع Point گرفته خط 3: CopyTo محتوای شی Tn2 را در Tn1 کپی می کند. توجه کنید به این نکته که اگه دوشی را با استفاده از علامت = برابر همدیگه قرار بدید آدرس اون اشیا باهم یکی میشه یعنی واقعا اون دو شی باهم یکی میشن نه اینکه باهم برابر می شن! خط 4و5و6: از Convert.Toint32 برای تبدیل به اعداد int 32 بیتی استفاده میشه و از Convert.ToSingle برای تبدیل به اعداد اعشاری استفاده میشه. پیشنهاد می کنم مقاله گرافیک در .NET را مطالعه کنید. پیشنهاد تبدیل مطالب به PDF هم پیشنهاد خوبیه که از طرف آقای مجید مهرتاش ارائه شده. البته ما قبلا هم این کار را انجام دادیم و تعدادی از مقالات را بصورت PDF برای دانلود گذاشتیم. مطالب جدیدی هم که مهدی جان دارن می نویسن به محض تمام شدن به صورت یکجا بصورت PDF تبدیل می کنیم. مجیدجان برای این کار باید از Hook یا Subclass استفاده کنی. اون سایتها و وبلاگها هم حق داشتن چون این مبحث گسترده و پیچیده است. تازه اگه بخوای از این دو روش استفاده کنی کد شما Unmanaged میشه. ولی اگه بازم می خوای پیگیری کنی یه پروژه توی Codeproject هست که یه Library برای استفاده از Hook و Subclass در .NET ارائه داده. زحمت جستجوش با خودت! DebuggerStepThrough نکته جالبی که به تازگی بهش برخوردم یه Attribute به نام DebuggerStepThrough است. حتما تا حالا با این مشکل مواجه شدید که در حال Debug بصورت خط به خط (با استفاده از کلید F11) کنترل اجرای برنامه برای مقداردهی Property ها و یا خواندن مقدار اونا دائما وارد کد اونها یا همون Property Accessor ها میشه که این مسئله باعث میشه تا زمان زیادی برای Debug کدتون هدر بره. در وهله اول به راحتی می تونید با استفاده از کلید F10 این مشکلو برطرف کنید! اما در بیشتر مواقع نوع کد باعث میشه که نتونید این کار را انجام بدید! به مثال زیر توجه کنید: کلاس Person دارای سه Property به نامهای PersonName و Grade و Salary است. متد CalculateSalary برای محاسبه حقوق بر اساس درجه کارمند و حقوق پایه استفاده می شود. اگر کد فراخوانی متد CalculateSalary شما به شکل زیر باشه: calcSalary=CalculateSalary(p.Grade, p.Salary); در اینجا اگه با کلید F10 بخواید تو کدتون حرکت کنید نمی تونید کد متد CalculateSalary را قدم به قدم مشاهده کنید اگه با کلید F11 حرکت کنید کد مربوط به Proprty های Grade و Salary را هم باید قدم به قدم مشاهده کنید. برای جلوگیری از این حالت DebuggerStepThrough را باید برای Property های مورد نظر استفاده کنید. به عنوان مثال تعریف Grade و Salary به شکل زیر نوشته خواهد شد:public int Grade
{ [DebuggerStepThrough] get { return _grade; } [DebuggerStepThrough] set { _grade = value; } } public int Salary { [DebuggerStepThrough] get { return _salary; } [DebuggerStepThrough] set { _salary = value; } }
تگهای فارسی: محمد صافدل، سی شارپ، سي شارپ، دیباگ
English Tags: Mohammad Safdel,Csharp, C sharp, C#, Debug, DebuggerStepThrough, Attribute
+
نوشته شده در یکشنبه بیست و هفتم مرداد 1387ساعت 13:18 توسط ققنوس
|
واسطها (Interfaces):
یک واسط یا Interface شامل تعاریفی است برای یک کلاس که این تعاریف شامل معرفی مجموعه ای از متدها با آرگومانهای مشخص است. اگر کلاسی دارای اون متدها باشد، میگیم که این کلاس از یک واسط Implement شده است. این فرض و قولی است برای اینکه شما مطمئن باشید که یک کلاس حتما دارای متدهای نام برده شده باشد. واسط تعریف امضای متدهای عمومی هست ولی بدنه این متدها کاملا خالی هستند. اگر یک کلاس از یک واسط Implement شده باشد که نام واسط xyz باشد، می توانید به اون کلاس ارجاع داشته باشید همانطوری که به واسط ارجاع داشته اید. و تا زمانی که سی شارپ اجازه نمی دهد که یک کلاس از بیش از یک کلاس به ارث برسد، تنها راه برای اینکه کلاس از بیش از یک کلاس به ارث برسد، استفاده از کلاس واسط هست. حالا بهتره با یک مثال مطلب خودمون رو ادامه بدیم، در این مثال ما یک کلاس از نوع واسط داریم که لیستی از عناصر انتخاب شده یا یک لیست از عناصر CheckBox را فراهم می کند. (لیست کد1) // List Code 1 همانطور که می بینید این واسط دارای دو متد است یکی با نام Clear و دیگری با نام GetSelected که بدنه اون هم خالی است.public interface IMultiSelect { void Clear(); System.Collections.ArrayList GetSelected(); } حالا اگر بخواهیم کلاسی رو از این واسط Implement کنیم، ابتدا باید در تعریف این کلاس واسط رو مشخص کنیم و سپس تمامی متدهای واسط رو در کلاس جدید پیاده سازی کنیم. به لیست کد 2 دقت کنید: // List Code 2 (Class Sample Implemented On IMultiSlect Interface) در پروژه های بزرگ اول واسطها تعریف می شوند و بعد کلاسها بر اساس اونها تعریف می شوند. معمولا متدهایی رو هم به عنوان رزرو تعریف می کنند که این متدها در زمانهای آپگرید برنامه ممکن است مورد استفاده قرار بگیرند. با این ترتیب چون ساختار کلاس، یا به اصطلاح امضای کلاس تغییری نمی کند پروژه با کپی فایل DLL جدید براحتی قابل بروزرسانی است و نیازی نسیت که کل پروژه مجددا ساخته شده و از طرف مشتری نصب شود.public class ListSelect : IMultiSelect { public ListSelect() { } public void Clear() { } public System.Collections.ArrayList GetSelected() { return new System.Collections.ArrayList(); } } پیشنهاد می شود در پروژه های خود ابتدا واسطها رو تعریف کنید و حتی متدهایی رو هم که فعلا نیاز ندارید رو در تعریف واسط قرار بدید سپس به پیاده سازی کلاسها بپردازید. (لازم نیست که دوباره به این نکته اشاره کنم که پیاده سازی واسط چون کدی در بدنه متدها ندارد عمل وقت گیری نخواهد بود). تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، واسط، تعریف واسط، کلاس، تعریف کلاس، ارث بری، ارث بری بیش از یک کلاس
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Interface, Inheritance, Inherited Class, Drived Class, Declare Interface, Declare Class, Inherit from more class
+
نوشته شده در شنبه نوزدهم مرداد 1387ساعت 15:37 توسط کنستانتین
|
بازنویسی کنترلهای ویندوزی:
در سی شارپ می تونید به سادگی کنترلهای ویندوزی جدیدی رو بر اساس کنترلهای ویندوزی ایجاد نمایید. برای مثال ما یک جعبه متن با قابلیت جدیدی ایجاد می کنیم. قصد داریم برای مثال، زمانی که کنترل جدید دارای فوکوس شود متن داخل آن بطور کامل به حالت انتخاب درآید. در سی شارپ کنترل جدید از روی کنترل ویندوزی موجود مشتق می شود. برای شروع یک کلاس جدید به پروژه اضافه کنید و تعریف کلاس رو به شکل زیر تغییر بدید: public class HighlighterTextBox:
System.Windows.Forms.TextBox ما نام کنترل جدید را HighlighterTextBox
گذاشتیم و اون رو از کلاس TextBox مشتق کردیم یا به اصطلاح کنترل ما از کنترل
TextBox اینهریت (Inherit) شده است. برنامه رو کامپایل کنید (F6) بعد از کامپایل
برنامه یک کنترل جدید در لیست کنترلهای ویندوزی به نام HighlighterTextBox اضافه
خواهد شد. ![]() public class HighlighterTextBox :
System.Windows.Forms.TextBox { public HighlighterTextBox() { init(); } private void init() { //add event handler to Enter event this.Enter += new System.EventHandler(highlight); } //event handler for highlight event private void highlight(object obj, System.EventArgs e) { this.SelectionStart = 0; this.SelectionLength = this.Text.Length; } } برای تست برنامه یک نمونه از جعبه متن ساخته شده رو از جعبه ابزار ویژوال استدیو بروی فرم قرار بدید و یک جعبه متن معمولی هم برای مقایسه روی فرم قرار بدید. حالا اگر برنامه رو اجرا کنید و متنی رو داخل هر دو تایپ کنید، با حرکت بین کنترلها می بینید که متن داخل هر دو جعبه متن انتخاب می شود. این همان حالت AutoHighlight در سی شارپ است که برای کنترل جعبه متن وجود دارد. برای اینکه بتونید تفاوت بین دو کنترل رو ببینید بین متن داخل هر دو کنترل کلیک کنید و سپس با استفاده از کلید TAB بین آن دو حرکت کنید، حالا خواهید دید که فقط متن داخل کنترل ما به حالت انتخاب در می آید و نه کنترل ویندوزی. در مثال دوم قصد داریم یک خصوصیت نمایش تاریخ به این کنترل اضافه کنیم. این خصوصیت باعث خواهد شد که جعبه متن ما بتوانید تاریخ را نمایش دهد. برای این منظور یک خصوصیت برای نمایش تاریخ به نام ShowDateTime از جنس bool تعریف می کنیم و در زمانی که خصوصیت دارای مقدار true است تاریخ را نمایش می دهد. کد زیر خصوصیت مورد نظر را نمایش می دهد. (برای اینکه این خصوصیت را در پنجره خصوصیات کنترل ببینید باید یکبار برنامه را کامپایل کنید). // add new property to control تمرین: کنترل جدیدی بر اساس
کنترل جعبه متن بسازید که دارای قابلیت نمایش تاریخ به دو شکل میلادی و شمسی رو
داشته باشه. و بتونید همیشه تاریخ داخل کنترل رو به جهت مخالف تبدیل کنید. می تونید
این کنترل رو توسعه بدید و از اون برای ورود اعداد و متن هم استفاده کنید.private bool showDateTime; public bool ShowDateTime { get {return showDateTime;} set { showDateTime = value; if (showDateTime) this.Text = DateTime.Now.ToString(); } } از اینجا می تونید کد نمونه رو دانلود کنید. تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ،
جعبه متن، پروژه، کد نمونه، کنترل ویندوزی، ساخت کنترل، انتخاب متن، ارث بری کنترل،
ویژوال استدیو، ساخت خصوصیت
English Tags:
Mehdi Rizvandi, Csharp, C sharp, C#, Textbox, Button, Project, Sample
Code,Windows Control, User Control, Create Control, SelectionStart,
SelectionLenght, Inheritance, Inherited control, Drived Control, Visual Studio,
VS, Property, Create Property
+
نوشته شده در سه شنبه بیست و هشتم خرداد 1387ساعت 20:55 توسط کنستانتین
|
گروه اعتبار سنجی - ValidationGroup:
یکی از مشکلات استفاده از کنترلهای سنجش اعتبار یا Validation Controls اینه که اگر در یک صفحه چند گروه مختلف کنترل داشته باشیم و بخواهیم هر دسته از کنترلها رو با در شرایط خاصی چک کنیم به مشکل برخواهیم خورد. 1- بطور مثال اگر در یک صفحه دو دسته اطلاعات مختلف به همراه دو دکمه برای ثبت هر کدام از گروه های اطلاعاتی داشته باشیم نمی توان از کنترلهای اعتبار سنجی به روش پیش فرض استفاده کرد. 2- شاید صفحاتی رو که دارای دکمه ثبت و دکمه پاک کردن اطلاعات هستند رو دید، در این صفحات نیز مشکل اعتبار سنجی وجود داره! چرا؟ چون اگر کاربر بخواهد اطلاعات صفحه رو پاک کنه به مشکل اعتبار برخواهد خورد و کد مربوط به پاک کردن محتویات کنترلها اجرا نخواهد شد. 3- مثال آخر اینکه در صفحه ای که کنترلهای اعتبار سنجی وجود دارند و شما بخواهید از یک دکمه دیگر مثل نمایش اطلاعات اضافی استفاده کنید در کل در تمام صفحاتی که به غیر از دکمه اصلی که معمولا ثبت هست یک کنترل دارای خاصیت PostBack استفاده کنید، کنترلهای اعتبار سنجی شما به خطا خواهند رفت، زیرا جلوی هر PostBack صفحه را خواهند گرفت. پیشنهاد می کنم اگر با این مشکل قبلا روبرو نشدید حتما یک پروژه تمرینی بسازید تا بهتر مطالب رو درک کنید. برای این منظور یک پروژه وب جدید ایجاد کرده و دو textbox و دو button به اون اضافه کنید. می تونید از کنترلهای اعتبار سنجی Requierd Field Validator استفاده کنید و تنظیمات اون رو انجام بدید. یک کد برای دکمه ثبت و کدی جهت پاک کردن خصوصیات Text دو textbox بنویسید. اگر همه چی رو درست تنظیم کرده باشید، خواهید دید که تا زمانی که هر دو جعبه متن پر نشده باشند نمی توان از دکمه پاک کردن استفاده کرد. خوب حالا می ریم سراغ تمرین خودمون یعنی بکارگیری Validation Group: برای این منظور یک پروژه وب ایجاد کنید. دو asp:textbox به عنوان گروه اول اضافه کنید و برای این دو کنترل، دو کنترل asp:RequiredFieldValidator اضافه کنید و خصوصیت ControlToValidate آن دو را به دو کنترل TextBox مرحله قبل تنظیم کنید. دو کنترل asp:button به صفحه اضافه کنید، یکی با عنوان Submit و دیگری با عنوان Reset برای دکمه Reset کدی جهت پاک کردن دو کنترل جعبه متن مرحله قبل بنویسید. دو یا سه asp:textbox دیگر به صفحه اضافه کنید و مانند مراحل قبل برای آنها از asp:RequiredFieldValidator استفاده کنید. دو کنترل asp:button مانند مراحل قبلی اضافه کنید با همان نام. پروژه را اجرا نموده و از دکمه های Submit و Reset استفاده کنید. نتیجه را مشاهده کنید. این همان مشکل استفاده پیش فرض از کنترلهای اعتبارسنجی است. کد زیر لیست کنترلها و تنظیم خصوصیات اصلی آنها رو مشخص می کنه: 1. asp:TextBox ID="txtName" 2. asp:RequiredFieldValidator ID="rfvName" ControlToValidate="txtName" ErrorMessage="*" 3. asp:TextBox ID="txtFamily" 4. asp:RequiredFieldValidator ID="rfvFamily" ControlToValidate="txtFamily" ErrorMessage="*" 5. asp:Button ID="btnSubmit" Text="Submit" 6. asp:Button ID="btnReset" Text="Reset" 7. asp:TextBox ID="txtIDNo" 8. asp:RequiredFieldValidator ID="rfvIDNo" ControlToValidate="txtIDNo" ErrorMessage="*" 9. asp:TextBox ID="txtUserName" 10. asp:RequiredFieldValidator ID="rfvUserName" ControlToValidate="txtUserName" ErrorMessage="*" 11. asp:TextBox ID="txtPassword" 12. asp:RequiredFieldValidator ID="rfvPassword" ControlToValidate="txtPassword" ErrorMessage="*" 13. asp:Button ID="lblSubmitExtraInfo" Text="Submit Extra Info" 14. asp:Button ID="lblResetExtraInfo" Text="Reset Extra Info" کدهای مربوط به دو دکمه Reset: protected void btnReset_Click(object sender, EventArgs e) خوب حالا که مشکل کنترلهای اعتبارسنجی رو به روش پیش فرض استفاده شون دیدیم، میخواهیم اون مشکل رو با استفاده از خصوصیت ValidationGroup حل کنیم. بسیار روش ساده ای رو در پیش رو داریم. برای این منظور باید خصوصیت ValidationGroup هر گروه از کنترلها رو با یک مقدار مشخص مقداردهی کنیم. دو کنترل اعتبارسنجی گروه اول رو با دکمه Submit در یک گروه قرار میدیم (کنترلهای 2،4 و 5). سه کنترل اعتبارسنجی و دکمه Submit دوم را نیز در یک گروه دیگر قرار می دیم. (8،10،12 و 13){ txtName.Text = ""; txtFamily.Text = ""; } protected void btnResetExtraInfo_Click(object sender, EventArgs e) { txtIDNo.Text = ""; txtUserName.Text = ""; txtPassword.Text = ""; } پروژه رو اجرا کنید و نتیجه رو ببینید. کنترلهایی که باید تغییر پیدا کنند در زیر لیست شده اند: (به خاصیت ValidationGroup دقت کنید) 1. asp:RequiredFieldValidator ID="rfvName" ControlToValidate="txtName" ErrorMessage="*" ValidationGroup="groupName" برای راحتی و حصول نتیجه کامل یک برنامه نمونه آماده شده که می تونید اون رو از اینجا دانلود کنید.2. asp:RequiredFieldValidator ID="rfvFamily" ControlToValidate="txtFamily" ErrorMessage="*" ValidationGroup="groupName" 3. asp:Button ID="btnSubmit" Text="Submit" ValidationGroup="groupName" 4. asp:RequiredFieldValidator ID="rfvIDNo" ControlToValidate="txtIDNo" ErrorMessage="*" ValidationGroup="groupExtraInfo" 5. asp:RequiredFieldValidator ID="rfvUserName" ControlToValidate="txtUserName" ErrorMessage="*" ValidationGroup="groupExtraInfo" 6. asp:RequiredFieldValidator ID="rfvPassword" ControlToValidate="txtPassword" ErrorMessage="*" ValidationGroup="groupExtraInfo" 7. asp:Button ID="lblSubmitExtraInfo" Text="Submit Extra Info" ValidationGroup="groupExtraInfo" تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، ای اس پی دات نت، وب، اعتبارسنجی، جعبه متن، دکمه، پروژه، کد نمونه
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, ASP.Net, Web, Web Development, Solution, Validation Group, Textbox, Button, Project, Sample Code
+
نوشته شده در شنبه چهاردهم اردیبهشت 1387ساعت 15:1 توسط کنستانتین
|
در ابتدا به نمایندگی از کلیه نویسندگان وبلاگ جادوی سی شارپ سال نو رو به شما تبریک می گم.
فضای نام : Namespace ویژوال استدیو برای هر پروژه ای که شروع می کنید یک فضای نام با نام پروژه ایجاد می کند، البته شما می تونید با استفاده از پنجره خصوصیات ابن نام را تغییر دهید یا اینکه اون رو خالی کنید که به معنای اینه که پروژه شما در فضای نام قرار ندارد. همچنین شما این اجازه رو دارید که فضای نام خود را تعریف کنید. با استفاده از فضای نام می تونید کلاسهایی با نامه های مشابه در یک پروژه ایجاد نمایید، برای این منظور کافیست هر کلاس را در یک فضای نام مجزا قرار دهید. در زمان استفاده از کلاس مورد نظر نیز باید فضای نام آن را مشخص نمایید. در لیست کد 1 یک کلاس تعریف شده با نام Rectangle دیده می شود که همنام با کلاس Rectangle از فضای نام Drawing است: /// Sample Code 1 CsharpPats.Rectangle cpRect; System.Drawing.Rectangle sdRect; private void init() { rect1 = new CsharpPats.Rectangle (10, 20, 70, 100); rect2 = new System.Drawing.Rectangle (20, 30, 80, 200); } تعاریف Public, Private و Protected: در سی شارپ می توان متدهای کلاس و متغیرها را به شکل Public, Private یا Protected تعریف نمود. متد یا خصوصیت Public یا عمومی در کلاسهای دیگر قابل دسترس است. متد یا خصوصیت Private یا خصوصی فقط در همان کلاس قابل دسترس است. معمولا تمامی متغیرهای کلاس را به شکل Private خصوصی تعریف می کنیم و برای دسترسی به آنها از توابع دسترسی Get و Set استفاده می کنیم. اینکه متغیرهای در خارج از کلاس در دسترس باشند، ایده بسیار بدی خواهد بود. زیرا این امر تخلف از قانون کپسوله نمودن (Encapsulation) در شی گرایی است. یا به عبارت دیگر تمامی متغیرهای کلاس فقط باید در محدوده کلاس قابل دسترس باشند. در سی شارپ می توان متدها و متغیرها را به شکل Protected یا محافظ شده نیز تعریف نمود. متد یا متغیر محافظت شده در تمامی کلاس و زیرکلاسهای تعریف شده قابل دسترس است. یا بطور ساده متد یا متغیر محافظت شده فقط در همان کلاس یا کلاسهایی که از آن مشتق می شوند قابل دسترس است و خارج ار کلاس نمی توان به آن دسترسی داشت. Overloading: در سی شارپ نیز همانند دیگر زبانهای برنامه نویسی شی گرا می توان یک متد با نام یکسان و آرگومانها یا امضای مختلف تعریف نمود. برای مثال ما می خواهیم یک متد برای رسم مستطیل تعریف نماییم که از آن برای رسم مستطیل و مربع استفاده نماییم. در این حالت یک متد رسم دارای چهار آرگومان و دیگری دارای سه آرگومان خواهد بود. به لیست کد 2 توجه کنید: /// Sample Code 2 در مثال فوق یک فضای نام
به اسم Draw تعریف شده که دارای دو متد یکسان با آرگومانهای مختلف است (متد Draw
اصطلاحا Overload شده است) تصویر زیر استفاده از کلاس Rectangle را در زمان کد
نویسی نمایش می دهد.namespace Draw { class Rectangle { public void DrawRect(long x,long y,long w,long h) { // Write Your Code Here [Draw Rectangle] } public void DrawRect(int x,int y,int w) { // Write Your Code Here [Draw Square] } } }
Draw.Rectangle drawingRect=new
Draw.Rectangle(); drawingRect.DrawRect(15,25,200,40); drawingRect.DrawRect(30,20,50); کلمات کلیدی Virtual و Override: اگر متدی رو می خواهید در اختیار کلاسهای مشتق شده از کلاس برای بازنویسی قرار بدید، باید اون رو از نوع Virtual تعریف کرده باشید. این به معنی اینه که کلاس مشتق شده از کلاس پایه می تواند دارای یک متد با نام، آرگومان و امضای یکسان با متدی از کلاس پایه باشد. در این حالت شما باید متد خود را با کلمه کلیدی Override در کلاس مشتق شده تعریف نمایید. - دقت کنید که اگر در کلاس مشتق شده یک متد را Override کنید بدون اینکه همان متد در کلاس پایه Virtual تعریف شده باشد، کامپایلر یک خطا از شما خواهد گرفت. - اگر یک متد را بدون استفاده از کلمه کلیدی Override مجددا بازنویسی نمایید نیز کامپایلر یک خطا از شما خواهد گرفت. - اگر متدی رو در کلاس پایه Virtual تعریف نکرده باشید و در در کلاس مشتق شده متدی با همان نام بدون کلمه کلیدی Override تعریف کنید، خطایی رخ نخواهد داد و کامپایلر فقط یک اخطار تولید خواهد کرد و متد تعریف شده نیز قابل استفاده است. در لیست کد 3 مثالی از تعریف متدهای Override دیده می شود (برای تست کد زیر یک کلاس به پروژه اضافه نمایید و کدهای آن را با کد زیر جایگزین کنید): /// Sample Code 3 namespace Draw { class Rectangle { public void DrawRect(long x, long y, long w, long h) { // Write Your Code Here [Draw Rectangle] } public void DrawRect(int x, int y, int w) { // Write Your Code Here [Draw Square] } virtual public void DrawSquare(int x, int y, int w) { // Write Your Code Here [Draw Square] System.Windows.Forms.MessageBox.Show("DrawSquare From Base Class Called"); } } class Square : Rectangle { public void DrawCircle(int x, int y, int r) { // Write Your Code Here [Draw Circle] } override public void DrawSquare(int x, int y, int w) { System.Windows.Forms.MessageBox.Show("DrawSquare From Derived Class Called"); // Write Your Code Here [Draw Double Square] } } } جایگزینی یک متد با استفاده از کلمه کلیدی یک راه دیگر برای بازنویسی متدی که در کلاس پایه به صورت Virtual تعریف نشده است، استفاده از کلمه کلیدی new در کلاس مشتق شده است. اگر از این روش استفاده کنید، متد کلاس پایه در کلاس و در زمان استفاده مخفی خواهد بود. دقت کنید که در این حالت امکان دسترسی به متد پایه نخواهد بود و شما باید کدهای مورد نظر خود را در کلاس مشتق شده بطور کامل بنویسید. public new void DrawLine(int x,int y,int w,int
h) { // Write Your New Code Here [Draw Line] } تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ،
سی شارپ مقدماتی، آموزش ربان سی شارپ، شی گرایی در سی شارپ، فضای نام، عمومی،
خصوصی، محافظت شده، بازنویسی، متد، کپسوله کردن، کلاس، کد نمونه
English Tags:
Mehdi Rizvandi, Csharp, C sharp, C#, Introduction to C#, CSharp Guide, Object
Oriented In C#, Namespace, Public, Private, Protedted, Override, Overload,
Virtual, new, Encapsulation, Class, Method, Sample Code
+
نوشته شده در شنبه سوم فروردین 1387ساعت 23:56 توسط کنستانتین
|
هدیه کریسمس امسال مایکروسافت برای برنامه نویسا نسخه جدید Visual Studio با نام مستعار Orcas بود که در زمان عرضه به VS2008 نامگذاری شد.طبق گفته مایکروسافت 250 امکان جدید به VS2008 اضافه شده و قطعا در این مقاله نمی تونم همه تغییرات و اضافات این محصولو ذکرکنم و فقط به درشتاش بسنده می کنیم.
اول به این نکته اشاره کنم که VS2008 در حقیقت فقط IDE هست که به همراه اون نسخه جدید .NET و همچنین نسخه جدید C# و VB.NET هم عرضه شدن. بعضی از این تغییرات مربوط به .NET، بعضی دیگه مربوط به زبانهای برنامه نویسی و بعضیاش هم به خود IDE مربوط میشه ولی چون همه اینا رو در یک مجموعه عرضه کردن به همش تغییرات VS2008 گفته میشه. یه نکته دیگه هم بگم و اون اینه که شما می تونید VS2008 را در کنار VS2005 نصب کنید بدون هیچ مشکلی. تغییرات عمده و پر سر و صدا از VS2005 به VS2008 عبارتند از: 1- نسخه جدید .NET: این مایکروسافت هم شورشو درآورده. هنوز به .NET 2.0 مسلط نشدیم که یهو سروکله .NET 3.0 و بعدش هم .NET 3.5 پیدا شد. نسخه .NET که به همراه VS2008 عرضه شده همین .NET 3.5 است. در وصف این زیبارو همین بس که علاوه بر همه .NET 2.0 (تاکید می کنم همه .NET 2.0) شش Library اضافه شده بهش که عبارتند از :
2- خلق زبان XAML: اینم یکی دیگه از تحولات جدید VS2008 است. یه زبان جدید برای طراحی! اونایی که سراغ WPF و SilverLight میرن بیشتر در مورد این زبان مطلب میشنون. به واسطه همین زبان مایکروسافت یه Designer جدید به VS2008 اضافه کرده که شما در آن واحد هم می تونید Interface رو بصورت سنتی و با استفاده از ToolBox و پنجره Properties طراحی کنید و هم می تونید از XAML در پنل مخصوص به خودش استفاده کنید. 3- قابلیت MultiTargeting: شما در VS2008 می تونید پروژه هایی از نوع .NET 2.0 یا .NET 3.0 یا 3.5 بسازید. 4- طراح MasterPage های تو در تو (Nested MasterPage): قابلیت Nested MasterPage در VS2005 هم وجود داشت و در حقیقت با .NET 2.0 عرضه شد اما مشکلی که وجود داشت این بود که VS2005 توانایی ویرایش و نمایش صفحات وب مبتنی بر Nested MasterPage رو نداشت که این امکان به VS2008 اضافه شده. 5- در .NET 3.0 سه کنترل جدید به ASP.NET اضافه شده. این سه کنترل عبارتند از: ListView، DataPager، LinqDataSource. 6- پشتیبانی از Expression Blend: حتما با Expression Blend آشنا هستید. Expression Blend ابزاری بصری برای تولید کدهای XAML در برنامه های مبتنی بر WPF است. در VS2008 شما Expression Blend رو به عنوان یه Add in در اختیار دارید. 7- مدیریت Using: برنامه نویسایی که از Java به .NET رو آوردن مدتها منتظر بودن تا چنین امکانی به VS اضافه بشه. با استفاده از این امکان شما می تونید بخش Using هر ماژولو مدیریت کنید. با انتخاب همه Using ها و کلیک راست روی اونا منوی مدیریت Using ها نمایش داده میشه که شامل گزینه هایی مثل: حذف Using های استفاده نشده، مرتب کردن Using ها، حذف و مرتب کردن و امکانات دیگه ای است. 8- نمایش منوی Intellisense: در نسخه های قبلی VS وقتی که اسم یه شی و علامت . رو تایپ می کردید منوی Intellisense در محل تایپ نمایش داده میشد و این باعث میشد که قسمتهایی از کد که زیر منو قرار می گرفت از دید شما خارج بشه. در VS2008 در زمان نمایش منوی Intellisense اگه شما کلید Ctrl رو نگهدارید این منو بصورت نیمه شفاف نمایش داده میشه و در نتیجه کدهای زیر اون هم قابل مشاهده هستن. 9- فیلتر کردن منوی Intellisense: در نسخه های قبلی VS وقتی شما چیزی تایپ می کردید همه گزینه های مربوطه در منوی Intellisense نمایش داده می شد اما در VS2008 فقط آیتمهایی نمایش داده میشن که با کارکترهای تایپ شده توسط شما منطبق باشه. به عنوان مثال اکه شما اسم یه شی رو تایپ کنید و بعد علامت . بزنید و بعدش حرف m رو تایپ کنید فقط اعضایی که با حرف m شروع میشن تو لیست نمایش داده میشه. 10- JavaScript Intellisense and Debugging: بعضی از چیزا هست که واقعا نمیشه فهمید که چرا Microsoft اینقدر در برابرشون ایستادگی می کنه. یکیش همینه. بالاخره Microsoft بعد از مدتها امکان Debug و Intellisense برای JavaScript هایی که توی صفحات ASPX می نویسید را توی VS2008 قرار داد. 11- اخطار برای خطاهای Html و JavaScript: در VS2005 خطاهای مربوط به Html و خطاهای زبان C# بطور ترکیبی توی یه پنجره نمایش داده میشد. در VS2008 این خطاها جدا شدن و به همراه خطاهای مربوط به JavaScript به عنوان اخطار (Warning) نمایش داده میشن. 12- یکی دیگه از تغییرات پر سر و صدا عرضه LINQ (Language Integrated Query) بود. LINQ یک روش کاملا جدید و نوآورانه برای کار با منابع داده با استفاده از Query بدون توجه به نوع منبع داده است صرف نظر از اینکه منبع داده موجود در حافظه اشیا، XML، SQL و یا DataSet و یا هر چیز دیگه ای باشه. 13- طراح LINQ: در VS2005 امکاناتی برای کار با SQL Server به نام Server Explorer در اختیار برنامه نویس بود. در VS2008 این امکانات کماکان وجود دارن با این تفاوت که اماناتی هم برای طراحی LINQ-to-SQL اضافه شده. 14- معماری رابط کاربر چند زبانه (MUI): معماری MUI این اجازه رو به کاربر میده تا زبان متن نمایش داده شده رو به زبان دلخواه تغییر بده. این معماری بخشی از محصولات MS Office و MS Windows محسوب میشه. VS2008 در حال حاضر زبانهای انگلیسی، اسپانیایی، فرانسوی، آلمانی، ایتالیایی، چینی، ژاپنی، کره ای را فراهم کرده. (همین جا وبلاگ CsharpBlog مایکروسافت رو به دلیل نادیده گرفتن حقوق برنامه نویسای ایرانی و نبودن زبان فارسی تو این لیست شدیدا محکوم می کنه و تحریم می کنه تا بدینوسیله این شرکت ورشکست بشه الهی!) 15- امکانات بسیار زیادی به زبانهای برنامه نویسی C# و VB.NET اضافه شده که فقط از شنیدن اسم اونا مو به تنتون سیخ میشه. بعضی از این تغییرات مهم عبارتند از:
در مورد این امکانات کسی سوال نکنه که خودمم تازه دارم مطالعشون می کنم! نکته مهم و جالب دیگه اینه که شما می تونید از امکانات جدید زبانهای #C و VB.NET توی پروژه های .NET 2.0 که قبلا نوشتید استفاده کنید. بزودی تو همین وبلاگ در مورد این امکانات بیشتر صحبت می کنیم. منبع: وبلاگهای MSDN English Tags:Mohammad Safdel, Orcas, Visual Studio 2008, VS2008, C# 3.0, WPF, WF, WCF, XAML, CardSpace,ASP.NET AJAX,SilverLight,MultiTargeting,Nested MasterPage, Using Managment, Intellisense, 10- JavaScript Intellisense and Debugging, LINQ,MUI, Automatic Properties,Relaxed Delegates,Object Initialisers,Type Inference,Anonymous Types,Extension Methods,Lambdas,Partial Methods,Popfly
+
نوشته شده در شنبه ششم بهمن 1386ساعت 19:12 توسط ققنوس
|
سلام خدمت کلیه دوستان همیشگی جادوی سی شارپ
با توجه به رشد روزافزون وب تصمیم گرفتم که مقاله ای در خصوص وب تهیه کنم و با توجه به اینکه MasterPage یکی از قابلیتهای بسیار عالی در 2005 هست تصمیم گرفتم مقاله ای رو در همین راستا آماده و به دوستانم ارائه کنم. یکی از مشکلات من در طراحی وب سایت در زمان ASP.NET 1.x این بود که بخوام قالب وب سایت رو عوض کنم، این به معنی تغییر کلیه صفحه های وب سایت و آپلود همه اونها بود که مشکلات این تغییر هم بسیار واضح هست، مثل اشتباهات کاربری، حجم زیاد دوباره کاری، آپلود صفحات زیاد و .... خوشبختانه در ASP.NET 2.0 با ظهور MasterPage این مشکل به راحتی مرتفع گردید. در خصوص صفحه اصلی یا همورن MasterPage دو مقاله تهیه شده، اولین مقاله شامل آشنایی، مفاهیم و امکانات این قابلیت هست و دومین مقاله به زبان بسیار ساده و به صورت قدم به قدم روش پیاده سازی و بهره مندی از این قابلیت رو شرح میده: مقله اول: صفحه اصلی در ASP.NET (در یک نگاه) فهرست:
مقاله دوم: مثال عملی استفاده از صفحه اصلی در ASP.NET (قدم به قدم) شامل دو مثال پیاده سازی صفحه اصلی دریافت مقاله مثال عملی استفاده از صفحه اصلی در ASP.NET (قدم به قدم) دریافت کدهای مقاله مثال عملی استفاده از صفحه اصلی در ASP.NET (قدم به قدم) پاسخ به سوالات عمار دوست عزیز: در خصوص بدست آوردن شماره سطر و ستون اشاره گر در یک کنترل RichText می تونید از متدها و خصوصیات زیر استفاده کنید: SelectionStart: این خصوصیت، مکان اشاره گر را به شما برمیگرداند (در کل متن) GetLineFromCharIndex: این متد شماره خطی مورد نظر شما را برمی گرداند (کافیست به اون شماره اندیس اشاره گر رو بدید) GetFirstCharIndexFromLine: شماره اندیس اولین کاراکتر یک خط رو برمی گردونه یک مثال هم نوشته شده که می تونید کد اون رو از اینجا دریافت کنید int startSelection = 0; در خصوص گرفتن تصویر از صفحه دسکتاپ می تونید از سایتهای زیر استفاده کنید. در دات نت به صورت مستقیم روشی برای این کار وجود ندارد و شما باید به صورت UnManaged این عمل رو انجام بدید. c-sharpcorner codeguru تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، صفحه اصلی، مستر پیج، ام اس دی ان،نگهدارنده محتوا،ارجاع دادن به منابع خارجی،کنترلهای سرور، تم، مقاله، وب، دات نت 2، 2005، طراحی وب سایت، پیاده سازی، مثال، کد، برنامه، ریچ تکیت، سطر، ستون
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#,MasterPage, MSDN, ContentPlaceHolder, Refrence to external resource, Server Controls, Theme, Research, Document, Web, Web 2.0, Dot Net 2.0, VS 2005, Web Site Design, Implementation, Sample, Code, Source Code, Programe, RichText, Row, Col, Managed Code
+
نوشته شده در یکشنبه نهم دی 1386ساعت 8:28 توسط کنستانتین
|
|


