آموزش سی شارپ

آموزش سی شارپ

آموزش برنامه نویسی از مبتدی تا پیشرفته
آموزش سی شارپ

آموزش سی شارپ

آموزش برنامه نویسی از مبتدی تا پیشرفته

آموزش سی شارپ-آموزش #C- قسمت دوم

آموزش سی شارپ-آموزش #C- قسمت دوم

آشنایی با انواع داده ای Data Types در C# :

 آموزش #C
آموزش #C


سلام با قسمت دوم آموزش برنامه نویسی سی شارپ #C در خدمتتون هستیم:

انواع داده ای یا Data Types در تمامی قسمت های یک زبان برنامه نویسی مثل C# استفاده می شود. به دلیل این که زبان C#، یک زبان قدرتمند داده ای است، بایستی هر زمان که یک متغیر را تعریف و استفاده می کنید، به کامپایلر اطلاع دهید آن متغیر از چه نوع داده ای است. به نحوه و تعیین نوع داده ای یک متغیر به طور کامل در بخش متغیرها (Variable) خواهیم پرداخت. در این درس به طور کلی به بررسی انواع داده ای مهم زبان C# و نحوه کارکرد آن ها می پردازیم.

آموزش سی شارپ

نوع داده ای bool ساده ترین Data Type زبان C# است. این نوع داده ای که به نوع درست یا غلط نیز معروف است، فقط دو نوع مقدار می تواند داشته باشد، true یا false. متغیر bool در هنگام استفاده از عملگرهای منطقی و یا دستورات شرطی مثل if بسیار کاربرد دارد.
انواع داده ای int نیز که مخفف کلمه integer است، برای نگهداری اعداد بدون بخش اعشاری آن ها به کار می رود. نوع داده ای int پرکاربردترین متغیر در هنگام کار با اعداد در C# است. متغیرهای integer، بر حسب اندازه عددی که می توانند نگهداری کنند، دارای انواع مختلفی در زبان C# می باشند.
نوع داده ای String نیز برای نگهداری متن یا text به کار می رود که عبارت است از تعدادی کاراکتر پشت سر هم. در C#، متغیرهای String از نوع immutable یا تغییرناپذیر هستند، به این معنی که متغیرهای String، پس از تعریف و مقداردهی هرگز تغییر نمی کنند. هنگام کار با متدهایی که یک متغیر String را دستکاری و تغییر می دهند، متغیر String اول تغییر نمی کند، بلکه یک متغیر جدید با مقدار جدید ایجاد می شود.
متغیر char نیز برای نگهداری یک کاراکتر تنها به کار می رود.

راهنمایی :

متغیر float نیز برای نگهداری اعداد اعشاری استفاده می شود.

آموزش #C

آموزش تعریف و مقداردهی متغیرها Variable در C#

یک متغیر یا Variable بخشی از حافظه سیستم است که همانند یک اتاق برای نگهداری اطلاعات خاصی به کار می رود. متغیرها اساس کار برنامه های C# بوده و به صورت زیر، قابل تعریف هستند :

< data type >   < name > ;

به عنوان مثال در کد زیر یک متغیر از نوع String به نام name را تعریف کرده ایم :

String name;

در کد فوق ، نوع داده ای متغیر و نام آن را تعیین می کند.
حالت فوق، ساده ترین حالت تعریف یک متغیر است. اما ممکن است شما بخواهید میدان دید یا Visibility خاصی را برای متغیر خود تعیین کرده و در هنگام تعریف، آن را متد دهی نیز کنید. این کار بایستی به صورت زیر انجام شود :

< visibility >   < data type >   < name >   = < value > ;

در نمونه فوق < visibility > میدان دید متغیر را تعیین می کند. یعنی می گویند چه توابع، کلاس ها و یا متغیرهای دیگری در سطح برنامه می توانند این متغیر را ببینند، فراخوانی و دستکاری کنند. نیز که مقدار اولیه متغیر را مشخص می کند. کد زیر یک مثال را برای تعریف کامل متغیر در C# نشان می دهد :

Private String name = “ Tahlil Dadeh ” ;

در کد مثال زیر، نحوه تعریف، مقداردهی و کار با چند متغیر در زبان C# را در عمل نشان داده ایم :

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

string firstName = "John";

string lastName = "Doe";

Console.WriteLine("Name: " + firstName + " " + lastName);

Console.WriteLine("Please enter a new first name:");

firstName = Console.ReadLine();

Console.WriteLine("New name: " + firstName + " " + lastName);

Console.ReadLine();

}

}

}

بسیار خب، بخش زیادی از کد مثال فوق را قبلا توضیح داده ایم، بنابراین در این مرحله مستقیم به سراغ بخش مورد نظرمان می رویم.
اول از همه، ما چندین متغیر از نوع String Type را تعریف کرده ایم. یک String می تواند شامل متن یا Text باشد و همانطور که در کد مثال می بینید، هر متغیر String را بلافاصله مقدار دهی کرده ایم. سپس یک خط متن را به وسیله دو متغیر بر روی خروجی Consale نشان داده ایم. از کاراکتر (+) برای چسباندن متن دو متغیر String و نمایش آن ها به صورت یک جمله استفاده شده است.
در مرحله بعدی، از کاربر خواسته ایم تا یک مقدار جدید را برای متغیر firstName وارد کند. برای این منظور از دستور ReadLine() استفاده شده که یک مقدار ورودی را از کاربر دریافت کرده و درون متغیر firstName قرار می دهد. پس از این که کاربر نام مورد نظر خود را وارد کند، مقدار جدید در متغیر firstName وارد شده و سپس مجددا به وسیله دستور Consale.WriteLine()، جمله را با نام جدید به کاربر نشان داده ایم.
در کد فوق ما فقط از یک متغیر استفاده کرده ایم و این کد به خوبی مهم ترین قابلیت یک متغیر یعنی تغییر در هنگام اجرای برنامه (Run Time) را نشان می دهد.
مثال بعدی برای نشان دادن کار متغیرها، انجام عملیات ریاضی است. کد زیر نحوه انجام کار را نشان می دهد :

int number1, number2;

Console.WriteLine("Please enter a number:");

number1 = int.Parse(Console.ReadLine());

Console.WriteLine("Thank you. One more:");

number2 = int.Parse(Console.ReadLine());

Console.WriteLine("Adding the two numbers: " + (number1 + number2));

Console.ReadLine();

کد فوق را در تابع Main مثال قبل قرار داده و برنامه را مجددا اجرا کنید. تنها حقه به کار رفته در مثال دوم، استفاده از متد int.Parse() است. این متد یک مقدار متنی String را خوانده و آن را به یک متغیر عددی integer تبدیل می کند.
همانطور که مشاهده می کنید، در کد مثال دوم برنامه هیچ تلاشی برای اعتبارسنجی (validate) مقدار ورودی کاربر انجام نداده و اگر کاربر یک مقدار رشته ای (متن) را وارد کرده و دکمه Enter را بزند، برنامه با اشکال رو به رو خواهد شد، زیرا عمل ریاضی را بر روی متن نمی تواند انجام دهد. برای حل این مشکل در درس های بعد بیشتر توضیح می دهیم.

دوره آموزش C#

آموزش ساختار شرطی if در C#

یکی از مهم ترین ساختارهای دستوری در هر زبان برنامه نویسی از جمله C#، دستور if است. توانایی ساخت دستورات شرطی کلی از مهم ترین کارهایی است که بایستی بتوان با زبان ها ی برنامه نویسی انجام داد. در C#، ساختار شرطی if بسیار ساده و کاربردی است. اگر از ساختار دستوری شرطی if در هر زبان برنامه نویسی دیگری استفاده کرده باشید، به راحتی می توانید در C# نیز از آن بهره بگیرید. ساختار دستور شرطی if نیاز مند یک مقدار boolean است که یا true است یا false. در برخی از زبان های برنامه نویسی، چندین نوع داده ای را می توان به صورت اتوماتیک به Boolean تبدیل کرد، اما در C# باید مستقیما از نوع داده ای Boolean استفاده کنید. برای مثال نمی توانید از نوع داده ای عددی int به صورت مستقیم استفاده کنید، اما می توانید آن را با یک مقدار دیگر قیاس کرده و مقدار true یا false نتیجه را مورد استفاده قرار دهید.
در درس قبلی، به آموزش نحوه تعریف و استفاده از متغیرها (Variables) در زبان C# پرداختیم. در این درس هم به آموزش نحوه کار با دستورات شرطی در C# می پردازیم. برای این منظور کد مثال زیر را با دقت مطالعه کنید :

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int number;

Console.WriteLine("Please enter a number between 0 and 10:");

number = int.Parse(Console.ReadLine());

if(number > 10)

Console.WriteLine("Hey! The number should be 10 or less!");

else

if(number < 0)

Console.WriteLine("Hey! The number should be 0 or more!");

else

Console.WriteLine("Good job!");

Console.ReadLine();

}

}

}

در کد مثال فوق از دو دستور شرطی if استفاده کرده ایم تا چک کنیم آیا عدد ورودی توسط کاربر، بین 0 تا 10 است یا خیر. به همراه دستور if از کلید واژه else نیز استفاده شده است. قسمت کد else زمانی اجرا می شود که شرط بخش if درست نباشد.
اگر در کد مثال فوق دقت کرده باشید، ما از کاراکترهای {} برای دسته بندی دستورات if و else ها استفاده نکرده ایم.. این یک قانون در C# است. اگر کد نوشته شده فقط در حد یک متن خطی باشد، نیازی به استفاده از {} برای دسته بندی کدها نیست.
حجم کد نوشته شده برای مقایسه مقدار یک عدد در مثال فوق کمی زیاد به نظر می رسد. همان کد را می توانید به صورت زیر، خلاصه تر بنویسید :

if((number > 10) || (number < 0))

Console.WriteLine("Hey! The number should be 0 or more and 10 or less!");

else

Console.WriteLine("Good job!");

ما هر یک از دستورات شرطی را درون یک پرانتز قرار داده و سپس از عملگر ǁ که به معنلی "یا"، "or" می باشد، استفاده کرده ایم تا چک کنیم عدد واردشده از 10 بزرگتر یا کوچکتر از 0 است. عملگر دیگری که در این گونه موارد نیز می توانید استفاده کنید عملگر AND به معنای "و" است که به صورت && نوشته می شود. آیا می توانیم در کد مثال دوم از عملگر AND به جای or استفاده کنیم؟. بله، فقط کافی است کد را به صورت زیر بازنویسی کنیم :

if((number <= 10) && (number >= 0))

Console.WriteLine("Good job!");

else

Console.WriteLine("Hey! The number should be 0 or more and 10 or less!");

در این درس عملگرهای "کوچکتر از" و "بزرگتر از" را نیز معرفی کردیم.

آموزش کار با دستور Switch در C#

دستور Switch همانند مجموعه ای از دستورات پشت سر هم if عمل می کند. دستور Switch درواقع لیستی از حالت های ممکن است که برای هر حالت یک دستور یا کدی جهت اجرا پیش بینی شده است. این دستور همچنین یک حالت default یا پیش فرضی دارد که در صورتی که هیچ یک از حالات آن true نباشد، اجرا خواهد شد.
یک دستور ساده Switch ساختاری هماند کد مثال زیر دارد :

int number = 1; switch(number) { case 0: Console.WriteLine("The number is zero!"); break; case 1: Console.WriteLine("The number is one!"); break; }

مقدار شناسه یا identifier (مقدار متغیری که می خواهیم دستور Switch بر حسب آن عمل کند) را پس از واژه کلیدی Switch قرار می دهیم. سپس لیستی از انواع حالت های مختلف برای آن مقدار توسط هر دستور case مشخص شده و مقدار شناسه با مقدار هر case مقایسه می شود. اگر مقدار شناسه با مقدار هر کدام برابر نبود، دستورات بخش پیش فرض default اجرا می شود.
اگر دقت کرده باشید، در پایان هر case یک دستور break قرار داده شده است. برای چیست؟ اگر مقدار یک case با مقدار شناسه دستور Switch برابر شود، دستورات آن case اجرا شده و اگر در انتهای case دستور break وجود نداشته باشد، دستورات case های بعدی نیز اجرا خواهد شد. به عبارت دیگر، دستور break ، باعث توقف روند اجرای دستورات Switch شده و برنامه به خط کد بعد از Switch می فرستد. در نوشتن break دقت لازم به عمل آورید، ؟؟؟؟؟ نوشتن آن می تواند کلا برنامه را دچار اختلال کنید.
هنگامی که هم یک تابع را در دستورات یک case تعیین می کنید، می توانید با استفاده از return خروجی تابع را به عنوان خروجی Switch برگردانید.
در کد مثال، ما از یک متغیر عددی integer به عنوان شناسه دستور Switch استفاده کرده ایم، اما این شناسه می تواند از نوع متنی String و یا هر نوع داده ای دیگر زبان C# باشد.
در مثال زیر، ابتدا یک مقدار را به عنوان ورودی از کار برگررفته ایم، سپس آن را به عنوان یک متغیر متنی String به دستور Switch ارسال نموده ایم. در کد مثال زیر، برای هر دو مقدار “yes” و “Maybe” یک دستور مشترک را تعیین کرده ایم.

Console.WriteLine("Do you enjoy C# ? (yes/no/maybe)");

string input = Console.ReadLine();

switch(input.ToLower())

{

case "yes":

case "maybe":

Console.WriteLine("Great!");

break;

case "no":

Console.WriteLine("Too bad!");

break;

}

در کد مثال فوق، سوالی از کاربر پرسیده شده و از وی خواسته شد یکی از مقادیر “yes”، “no” و “maybe” را وارد نماید. سپس مقدار وارد شده از ورودی توسط دستور Consale.ReadLine() خوانده شده و یک دستور Switch بر مبنای آن طراحی شده است. برای سهولت کار کاربر، توسط دستور ToLower() ، کاراکترهای ورودی کاربر را به حروف کوچک تبدیل کرده ایم تا در هنگام مقایسه با مقادیر Case ها، فرقی بین مقدار وارد شده برای حروف بزرگ و کوچک وجود نداشته باشد. اما بدون وجود دستور default در Switch، اگر کاربر در مثال فوق مقداری غیر از مقادیر تعیین شده برای case ها وارد نماید، برنامه هیچ خروجی نخواهد داشت. بنابراین کد مثال فوق را به همراه default به صورت زیر بازنویسی می کنیم :

Console.WriteLine("Do you enjoy C# ? (yes/no/maybe)");

string input = Console.ReadLine();

switch(input.ToLower())

{

case "yes":

case "maybe":

Console.WriteLine("Great!");

break;

case "no":

Console.WriteLine("Too bad!");

break;

default:

Console.WriteLine("I'm sorry, I don't understand that!");

break;

}

اگر کاربر مقداری به غیر از مقادیر تعیین شده برای case ها وارد نماید، بخش default به صورت پیش فرض اجرا خواهد شد.

با ادامه آموزش برنامه نویسی C# همراه ما باشید

آموزش سی شارپ

آموزش #C

آموزش سی شارپ-آموزش #C

آموزش سی شارپ-آموزش #C
آموزش سی شارپ-آموزش #C

معرفی آموزش زبان C#

آموزش سی شارپ

به بخش جدید آموزش C# خوش آمدید. همزمان با معرفی چهارچوب کلری .NET ، مایکروسافت یک زبان برنامه نویسی جدید به نام C# که در اصطلاح سی شارپ خوانده می شود را به آن اضافه کرد.

سی شارپ طراحی شد تا نقش یک زبان برنامه نویسی ساده، مدرن، چند منظوره و شی گرا را برای چهارچوب کاری .NET ایفا کند. از طرف دیگر، C# مفهوم های کلیدی و قابلیت های خوب سایر زبان های برنامه نویسی به ویژه جاوا را قرض کرده و درون خود دارد.

از لحاظ نظری، C# می تواند تا سطح کد ماشین یا اسمبلی کامپایل شود، اما در کارکرد واقعی، همیشه به همراه چهارچوب کاری .NET استفاده می شود. بنابراین در برنامه ای که با زبان C# نوشته شده باشد، برای اجرا بر روی کامپیوتر، نیازمند نصب چهارچوب کاری .NET می باشد. با وجود این که چهارچوب کاری .NET امکان استفاده از طیف وسیعی از زبان های برنامه نویسی را بر روی ویندوز به ما می دهد، اما گاهی اوقات آموزش C# به عنوان زبان اصلی .NET معرفی شده است. البته شاید این به دلیل طراحی همزمان با چهارچوب کاری .NET باشد.

راهنمایی برای دوره آموزش C# :

سی شارپ یک زبان برنامه نویسی شی گرا یا Oriented بوده و در آن امکان استفاده از متغیرها یا تابع سراسری یا Globol وجود ندارد. در C همه چیز در کلاس ها (classes) قرار می گیرند، حتی ساده ترین انواع داده ای مثل int یا String که از کلاس System.object مشتق شده اند.

آموزش #C

معرفی ابزار و آموزش کار با Visual C# Express:

دستورات زبان C# را می توانید با هر نوع ادیتور متنی مثل Windows Notepad نوشته و سپس به وسیله برنامه CSC.exe که کامپایلر خطی دستورات C# بوده و همراه با چهارچوب کاری .NET بر روی سیستم نصب می شود، کامپایل و اجرا نمایید.

اما اکثر افراد ترجیح می دهند از یک IDE یا محیط توسعه یکپارچه (Integrated Development Envirment) استفاده کنند که مایکروسافت چندین برنامه را برای این منظور ارائه داده است. گل سرسبد این برنامه ها، Visual Studio است که قابلیت اجرای تمامی امکانات چهارچوب کاری .NET را دارا می باشد. این برنامه بسیار پیشرفته بوده و در نسخه های مختلفی ارائه شده است.

همزمان با ارائه نسخه 2 چهار چوب کاری .NET، مایکروسافت نسخه ای از ویژوال استودیو را به نام Express منتشر کرد که برای استفاده برنامه نویسان معمولی و کسانی که می خواهند چهارچوب کاری .NET را فرا بگیرند، مناسب است. نسخه Express فقط برای برنامه نویسی به زبان های C# و VB.NET طراحی شده و برخی از قابلیت های مهم و کاربردی ویژوال استودیو را شامل نمی شود. اما به هر حال ابزار رایگانی بوده و برای افراد تازه کار و معمولی بسیار مناسب است.

راهنمایی :

برای برنامه نویسی به زبان C بایستی برنامه ویژوال C# اکسپرس را از آدرس https://visualstudio.microsoft.com/vs/express/ دانلود نموده و بر روی سیستم خود نصب نمایید. سپس آماده کد نویسی C# خواهید بود.

آموزش ساخت اولین برنامه C# با Hello word

اگر شما قبلا نیز اقدام به یادگیری یک زبان برنامه نویسی کرده باشید، حتما می دانید که اینگونه آموزش ها معمولا با یک برنامه ساده به نام “Hello word” شروع می شوند.

در این آموزش c# هم قصد داریم از این سنت قدیمی استفاده کنیم. برای این منظور برنامه Visual C# Express را اجرا کرده و مسیر منوی File - > New Project را طی کرده و گزینه Consule application را انتخاب نمایید. این ساده ترین نوع برنامه بر روی سیستم ویندوز است، اما نگران نباشید، ما خیلی اینجا نخواهیم ماند. پس از این که بر روی دکمه ok کلیک نمایید، برنامه Visual C# Express یک پروژه جدید را برای شما ایجاد می کند که حاوی یک فایل به نام Program.cs است.

این کار سرآغاز جایی است که هیجان کار شروع شده و کد آن بایستی به صورت زیر باشد :

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

}

}

}

درواقع، مجموعه کدهای فوق هیچ کار خاصی را انجام نمی دهند، یا حداقل اینگونه به نظر می رسند.سعی کنید با زدن دکمه F5 برنامه را بر روی سیستم خود اجرا نمایید. این کار باعث می شود تا Visual C# Express برنامه شامل را کامپایل کرده و اجرا نماید. اما همانگونه که مشاهده می کنید، این کدها کار خاصی را انجام نداده و فقط یک پنجره مشکی رنگ ویندوز باز شده و سپس بسته می شود. این مسئله به این دلیل است که برنامه شما دارای کد خاصی نبوده و کار خاصی را انجام نمی دهد. در بخش بعدی، به بررسی این خطوط کدها به طور کامل خواهیم پرداخت اما الان قصد داریم تا از برنامه خود یک خروجی بگیریم. برای این منظور دو خط کد زیر را درون آخرین مجموعه {} کد برنامه قرار دهید.

;Console.WriteLine("Hello, world!")

;()Console.ReadLine

سپس کد کامل برنامه بایستی به صورت زیر تغییر کند :

;using System

;using System.Collections.Generic

;using System.Text

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

;   Console.WriteLine("Hello, world!")

;()Console.ReadLine

}

}

}

یک بار دیگر، جهت اجرای برنامه دکمه F5 را فشار دهید، این بار مشاهده خواهید کرد که پنجره سیاه برنامه باز شده و علاوه بر این که بلافاصله بسته نمی شود، بلکه یک پیام سلام “Hello word” را نیز به کاربر نشان می دهد. خب، ما دو خط کد به برنامه اضافه کردیم. اما این کدها در واقع چه کاری انجام می دهند؟

خط اول از کلاس Consale برای نمایش یک خط متن در خروجی استفاده کرده و خط دوم هم می تواند یک مقدار ورودی یا متن را از کاربر بخواند. اما چرا خواندن یا Read؟

درواقع این کار یک حقه کوچک است زیرا بدون آن برنامه بلافاصله اجرا شده و تمام می شود و بدون این که کاربر فرصت کند خروجی آن را بروی صفحه ببیند، پنجره اش بسته می شود.

دستور ReadLine Command به برنامه می گوید تا برای دریافت یک ورودی از کاربر صبر کند و همان طور که مشاهده می منید، شما می توانید یک متن را درون پنجره تایپ نمایید. پس از تایپ متن دلخواه، دکمه Enter را زده و پنجره برنامه را ببندید.

به شما تبریک می گوییم، اولین برنامه C# خود را ساخته و اجرا کردید. در بخش بعدی به تشریح کدهای نوشته شده و عملیات صورت گرفته خواهیم پرداخت.

آموزش C#

توضیح و آموزش ساخت برنامه Hello World در C#

در بخش قبل، در اولین برنامه C# ای که طراحی کردیم، یک نوشته را در خروجی چاپ نمودیم. برای درک بستر خروجی مثال، در درس قبلی به تشریح کدهای نوشته شده پرداخته نشد، اما در این درس به بررسی کد مثال می پردازیم.

همانطور که از مشاهده کدهای مثال درس متوجه شده اید، برخی از خط های کد مثال بسیار شبیه هم بودند، بنابراین در توضیح، آن ها را در کنار همدیگر قرار داده ایم.

بیایید با کوتاه ترین و پرکاربرد ترین کاراکترها در کد مثال خود شروع کنیم : کاراکترهای { و }. به این کاراکترها در اصطلاح براکت (curly braces) می گویند و در C ابتدا و انتهای هر بلوک کد را مشخص می کنند. براکت ها در بسیاری از زبان برنامه نویسی دیگر از جمله C++، جاوا، جاوا اسکریپت و ... نیز استفاده می شوند. همانطور که در مثال مشاهده کردید، براکت ها برای بسته بندی چندین خط کد که مرتبط به هم هستند، استفاده می شوند. در مثال های بعدی، با نحوه استفاده از براکت ها بیشتر آشنا خواهید شد.

اکنون بیایید از ابتدای کد شروع کنیم. قسمت Using ها :

;using System

;using System.Collections.Generic

;using System.Text

واژه Using یک واژه کلیدی (keyword) است که توسط ادیتورکدها به رنگ آبی نشان داده می شود. واژه کلیدی Using یک namespace را به کد برنامه وارد می کند. Namespace مجموعه ای از کلاس ها هستند که با هم کار خاصی را انجام می دهند. در مثال Hello Word، سه namespace به برنامه اضافه شده اند که هر کدام کار خاصی را در کد برای ما انجام می دهند. برای مثال، ما از کلاس Consale Class که بخشی از System Namespace است برای چاپ مقدار متنی در خروجی استفاده می کنیم.

از طرف دیگر، همانند قطعه کد زیر، شما می توانید یک namespace دلخواه را ایجاد کرده و سپس آن را در کدهای خود استفاده کنید.

namespace ConsoleApplication1

اکنون namespace ConsaleAppliction1، به عنوان namespace اصلی (main) این برنامه بوده و شامل چندین کلاس خواهد بود. می توانید چندین namespace دیگر نیز که نیاز دارید را ایجاد کرده و در هر کدام کلاس های مورد نظر خود را قرار دهید. سپس همانند سایر namespace ها با استفاده از واژه کلیدی Using آن را به برنامه خود اضافه کنید.

در مرحله بعد، ما کلاس Class مورد نظر خود را ایجاد می کنیم. از آن جا که C# یک زبان شی گرا Object-oriented است، مجموعه کدهای خاص را درون یک کلاس تعریف می کنیم. برای مثال، به وسیله کد زیر یک کلاس به نام Program را تعریف کرده ایم :

class Program

در هر برنامه به تعداد نیاز می توانید کلاس های مختلف تعریف کنید. اما در این مثال، ما فقط یک کلاس خواهیم داشت. هر کلاس می تواند شامل تعدادی متغیر (variable)، خواص (properties) و متدها (methods) باشد، مفهوم هایی که در درس های بعد به تشریح کامل آن ها خواهیم پرداخت. تنها چیزی که الان بایستی بدانید این است که کلاس Program فقط شامل یک متد (method) بوده که به صورت زیر تعریف شده است :

static void Main(string[] args)

خط کد فوق، به احتمال زیاد پیپچیده ترین بخش مثال است. به همین دلیل بیایید ان را به بخش های کوچکی تقسیم کرده و به بررسی هریک بپردازیم.

کلمه اول static است. کلیدواژه یا (keyword) به نام static اعلام می کند که این کلاس بایستی بدون نیاز به نمونه سازی از آن قابل دسترس باشد، راجع به این مسئله در بخش Classes به طور کامل توضیخ می دهیم.

واژه کلیدی بعدی Void است که مشخص می کند آیا متد ما بایستی پس از اجرای کامل، مقداری را برگرداند یا خیر. مقدار برگشتی یک تابع می تواند برای مثال از نوع عددی int، متنی string و یا هیچ چیز (void) باشد. به کار بردن کلمه void در این مثال، به این معنی است که تابع ما هیچ مقداری را پس از اجرا باز نمی گرداند.

واژه کلیدی بعدی Main بوده که نام متد را تعیین می کند. متد Main تابع اصلی هر برنامه C# بوده و اولین قطعه کدی است که در برنامه اجرا می شود.

پس از نام متد، می توانید یک یا چند آرگومان را به عنوان مقادیر ورودی هر متد درون پرانتز تعیین کنید. در مثال ما، متد Main فقط دارای یک آرگومان ورودی به نام args می باشد. آرگومان یک متغیر یا مقدار ثابت است که در هنگام فراخوانی هر تابعی، می تواند به آن ارسال شود. آرگومان args در مثال فوق از نوع متنی و آرایه ای است.

در پایان این درس بایستی درک کلی از برنامه های C# و نحوه کار آن ها پیدا کرده باشید.

با ادامه دوره آموزش سی شارپ همراه باشید.

تقویم فارسی و فارسی ساز تاریخ در .NET

ارسال شده توسط administrator
24. می 2010 16:14

مقدمه

تقویم فارسی در اکثر کشورهای فارسی زبان استفاده می شود، گرجه در بعضی مناطق از اسامی متفاوتی برای نام ماهها استفاده می شود. تقویم فارسی، تقویم رسمی ایران و افغانستان و یکی از تقویمهای جایگزین در مناطقی از قبیل قزاقستان و تاجیکستان است. تقویم فارسی بر اساس سال خورشیدی است و تقریباً 365 روز است. هر سال دارای 4 فصل است و سال جدید زمانی شروع می شود که خورشید ظاهراً از نیم کره ((hemisphere جنوبی به نیم کره شمالی، هنگام نگاه از مرکز زمین، از استوا رد می شود. سال جدید با اولین روز ماه فروردین که اولین روز بهار در نیم کره شمالی است شروع می شود.

هر یک از 6 ماه نخستین 31 روز، 5 ماه بعدی 30 روز و ماه آخر در سال معمولی 29 و در سال کبیسه 30 روز هستند. سال کبیسه سالی است که وقتی بر 33 تقسیم می شود، باقیمانده اش 1، 5، 9، 13، 17، 22، 26، یا 30 می شود. به عنوان مثال، سال 1370، سال کبیسه است؛ زیرا اگر آنرا بر 33 تقسیم کنیم، باقیمانده 17 می شود. تقریباً 8 سال کبیسه در هر چرخه 33 ساله وجود دارد.

از آنجاییکه .NET Framework هیج نوع تقویم فارسی را ساپورت نمی کنند، و تقویم فارسی در .Net FrameWork 2 دارای Bug و بی فایده است، در اینجا من قصد دارم چگونگی نوشتن DataType لازم و کنترلهای GUI را برای کار کردن با این نوع داده ای (DataType) نشان دهم.

کلاس تقویم فارسی

به نظر می رسد که مایکرسافت فراموش کرده که تقویم فارسی را در.NET 1.1 ساپورت کند، ولی در حالی که کلاسی را برای این نوع مخصوص از تقویم در نسخه دوم Framework مهیا کرده است، اما تا حدودی در محاسبه دچار اشتباه شده است. ما قصد داریم یک تقویم فارسی به علاوه یک DataType که جایگزین کلاس DateTime استاندارد شود، بنویسیم؛ در حالی که همان ساختار را حفظ کنیم. لازم است که DateTime استاندارد را به PersianDate تبدیل کنیم. من یک کلاس تبدیل کننده نیز در اختیار خواهم گذاشت. از آنجاییکه استفاده از این کلاسها، زمانی که با کنترلهای GUI ترکیب می شوند، به حداکثر می رسد، من یک MonthView و یک کنترل DatePicker نیز در اختیار خواهم گذاشت.

زمان طراحیIntegration

من کمی Integration زمان طراحی را تغییر داده ام. ار آنجاییکه بعصی از برنامه نویسان به استفاده از کلاسهای PersianTime و بعضی به DateTime برای کار کردن با این libraries علاقه دارند، من از هر دوی این خصوصیات تحت عنوان SelectedDate و SelectedDateTime نام میبرم. برای SelectedDate که دارای نوع PersianDate است، یک TypeConverter جهت تبدیل Text به مثالهای PersianDate زمان طراحی وجود دارد.

ساپورت پوسته (Theme)

من از .NET 2.0 VisualStyleRenderer, که یک wrapper تنظیم شده برای styleهای XP است استفاده می کنم. به علاوه، کلاسهای دیگری جهت شبیه سازی rendering آفیس 2003 وجود دارد. همچنین، یک style برای آفیس 2000 تیز موجود است. اگر سیستم عام (theming) را ساپورت نکند و یا آن را غیر فعال کند، rendering را با استفاده از آقیس 2000 کنترل میکند.

clip_image002

Popup و سایه ها (Shadow)

کنترلهای popup باید سایه داشته باشند. در کنترلهای RTL، سایه ها باید درپایین سمت چپ کنترلها باشند. تمامی stringهایی که در کنترلها بکار می روند، از یک کلاس localizer manager استفاده می کنند که stringها را بر اساس شمارش StringID پایه ریزی می کند. جهت استفاده از نسخه محلی شده (localized)، باید سرنخهای thread)) culture جاری و خصوصیات CultureUI را به یکی از culture های تعریف شده تغییر دهید: (AR-SA برای Culture عرب، و FA-IR برای Culture فارسی، و InvariantCulture برای culture انگلیسی و خنثی. در زیر چگونگی انچام این کار در متد اصلی برنامه نشان داده شده:

//
// The main entry point for the application.
//
[STAThread]
static void Main()
{
Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo("fa-IR");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}

در زیر چگونگی رفتار صحیح کنترلهای popup با stringهای استاندارد و نسخه محلی شده(localized) برای FA-IR culture آورده شده است.

clip_image001clip_image002[6]

استفاده از Cultureهای عربی و خنثی

قبلاً من از culture AR-AE برای عربی استفاده می کردم، ولی در نسخه 1.3.1.0، مجبور بودم آنرا به AR-SA تغییر دهم. دلیلش هم این است که تقویم هجری، تقویم پیش فرض culture AR-AE نیست؛ در حالی که در culture برای AR-SA، تقویم پیش فرض است. حالا کنترل، وقتی که culture را روی عربی تنظیم می کنید، به طور صحیح کشیده می شود.

حالا Render کردن در culture خنثی در جهت چپ به راست انجام می شود. عموماً کنترل، بر اساس جهت خواندن culture حاضر، تصمیم به render کردن در RTL یا LTR می کند.

clip_image003

استفاده از کد

میتوان از کلاس PersianDate همان قدر که در DateTime استفاده میشود، استفاده کرد. در زیر نمونه هایی آورده شده است:

 

 

//
// Use of Persian date class
//
PersianDate pd1 = PersianDate.Now.ToString(); // prints 1385/01/13
// constructs a new instance with the specified vales
PersianDate pd2 = new PersianDate(1386, 4, 26);

// You can use operator overloading, too!
if(pd1 >= pd2)
MessageBox.Show("Date is greater or equal");

// Use of normal DateTime and Conversion
PersianDate pd3 = PersianDateConverter.ToPersianDate(DateTime.Now);
DateTime dt1 = PersianDateConverter.ToGregorianDate(PersianDate.Now);

 

نکته های جالب

اگر پیشنهاد، نظر یا بازخوردی (feedback) دارید، لطفاً به آدرس email یا Forum انتهای صفحه بفرستید. جهت کسب اطلاعات بیشتر میتوانید از سایت من نیز دیدن کنید.

ساپورت .NET 1.1 و VisualStudio .NET 2003

این library روی VS.NET 2005 و .NET Framework نسخه 2 تست شده است. پس روی VS.NET 2003 اجرا نخواهد شد. اگر واقعاً تیاز به این کار دارید، باید آنرا به VS.NET 2003 تبدیل کنید و قسمت رسم کننده (Drawing) کد را تغییر دهید، زیرا واقعاً از کلاسهای صبقه بندی شده .NET 2.0 جهت رسم (draw) در ویندوز XP استفاده می کند. باید از یک wrapper در Theme API استفاده کنید تا این کار را برای شما انجام دهد. (یک پروژه در codeproject وجود دارد) جهت آسانتر کردن porting، می توانید تمامی drawingها را در ویندوز XP وStyle آفیس 2003 کات (cut) کنید و به themeهای قدیمی و خوب آفیس 2000 که از کلاسهای GDI+ استفاده می کنند متوسل شوید.

نسخه WPF

نسخه WPF از رده خارج است. می توانید نگاهی به بخش Vista در سایت Codeproject بیاندازید.

سابقه

نسخه 1.9.0.0

  • ثابت: bugهایی که ناشی از mapping اشتباه روزهای هفته فارسی/عربی یا گریگوری بودند، که منجر به نمایش اشتباه روزهای هفته در تقویم گریگوری شدند.
  • اضافه شده: handling بهتر modeهای چند انتخابی (multi-selection). میتوان خصوصیت SelectedDateRange را اضافه یا حذف کرد، و تغییرات روی UI منعکس می شوند.
  • اضافه شده: شمارش PersianDayOfWeek با ترتیب صحیح روزها.
  • اضافه شده: خصوصیت DayOfWeek به کلاس PersianDate، جهت بازگشت به روز صحیح هفته.

نسخه 1.6.0.0

  • ثابت: بعضی bugها از طریق feedback پست شدند.
  • اضافه شده: کنترل MessageBox با viewهای RTL و LTR و قابلیت یادآوری مقدار انتخاب شده، همراه با دکمه های MessageBox استاندارد و دلخواه.
  • اضافه شده: فرمت دلخواه متد PersianDate.ToString() (مثل کنترل DateTime)، که قابلیت بازگشت به string فرمت شده را می دهد؛ مانند: Long Date, Long Time, DateTime, و غیره.
  • اضافه شده: draw دلخواه هر روزی که ترجیح داده شده، که میتوان جهت draw کردن بعضی روزها در فرمت غیرفعال استفاده کرد همراه با اتفاق (event) SelectedDateTimeChanging.

نسخه 1.5.0.0

  • ثابت: استثناهای کنترل FAMonthView موقع انتخاب یک تاریخ قبل از MinValue و بیشتر از MaxValue.
  • ثابت: دامنه (range) کلاسهای PersianDate MinValue و MaxValue را گسترش داد.
  • ثابت: MonthNameهای culture یکسان (Invariant)، یک index بر پایه صفر است. نام ماه اول در Invariant ، Culture مشکلی ندارد.
  • ثابت: چک کردن مقادیر (values) سال، ماه،روز روی تنظیمات PersianDate.
  • ثابت: چک کردن مقادیر null روی =! و اپراتورهای == PersianDate.
  • ثابت: خصوصیات مضاعف DateTime و PersianDate و وقایع کنترلهای GUI را حذف کرد. می توان نمونه های DateTime را مستیقیماً به PersianDate تبدیل کرد.
  • ثابت: فرایند اعتبار دهی (validation) به DatePicker.
  • اضافه شده: قابلیت استفاده از cultureها و تقویم های دیگر با کنترلها.
  • اضافه شده: تبدیل مجازی DateTime و PersianDate
  • اضافه شده: خصوصیت اضافه شده Millisecond به کلاس PersianDate برای دقت بیشتر.
  • اضافه شده: کلاس PersianDate حالا قابل سریال بندی (serializable) است و interfaceهای زیر را تکمیل می کند:
  • ICloneable , IComparable , IComparable<T>, IComparer , IComparer<T>, IEquatable<T>.
  • اضافه شده: قابلیت انتخاب scrolling feature در FAMonthView. میتوان روزها، ماهها و سالها را مرور کرد.
  • اضافه شده: کلاسهای FAThemeManager که themeهای انتخاب شده همه کنترلها را handle میکند. جهت تغییر جهانی theme، غفط نیاز به تنظیم خصوصیت (propert) این کلاس Theme دارید.
  • اضافه شده: کلاس FALocalizeManager که cultureهای دیگر را handle می کند. حالا می توانید stringها را در هر culture محلی کنید، (localize)
  • اضافه شده: ساپورت ToolStrip. حالا میتوان کنترلها را در ToolStrip, MenuStrip و غیره یکسان کرد.
  • اضافه شده: ساپورت ستون دلخواه DataGridView Microsoft و editor.

نسخه 1.4.0.0

  • اضاقه شده: تست و demo کارکردهایی را که توسط library، با کد source تکمیل کنید.
  • اضافه شده: سند سازی (documentation)
  • اضافه شده: نمودار (diagram) باری سلسله مراتب (hierarchy) PopupForms, Controls و کلاسهای Painter.
  • احساس و ظاهر تکمیل شده و صحیح در آفیس 2003 روی کنترلهای ComboBox
  • View زیبا و صحیح RTL و LTRاز FADatePickerConverter
  • Bug Fix: کنترل FADa<code>tePicker، popupهای تقویم را مطابق با theme خودش نمایش می دهد.
  • Bug Fix: جهت صحیح کنترلها در حالت RTL و LTR
  • Bug Fix: مکان صحیح سایه کنترل popupها در حالت RTL و LTR
  • Bug Fix: کنترل FADatePicker خصوصیات متن را صحیح نمایش نمیدهد.
  • تغییرات: جابجایی namespaceها.
  • مسایل شناخته شده: محلی کردن (localization) stringها در زبان عربی. ( کسی میتواند اینجا کمکم کند؟)

نسخه 1.3.1.0

  • تکمیل drawingهای ویندوز 2000 در کامپوترهایی که ویندوز XP نداشتند، یا زمانی که visual styleها غیر فعال هستند.
  • Drawing بهتر ویندوز XP و styleهای آفیس 2003
  • Drawing کنترلها بر اساس culture کاربر. در حال حاضر، cultureهای زیر مجاز هستند: خنثی (تقویم گریگوری)، AR-SA (تقویم هجری) و FA-IR (تقویم فارسی).
  • Localization بهتر. میتوان از کلاس Localizer جهت update کردن stringها استفاده کرد.
  • ساپورت از تقویم گریگوری (culture خنثی) و تقویم هجری
  • Rendering چپ به راست برای cultureهایی که راست به چپ نیستند. (مثلاً cultureهای خنثی و culture انگلیسی و غیره.)
  • کنترلهای جدید DatePickerConverter که تاریخ منتخب را با فشار یک دکمه تغییر می دهند.

 

نسخه 1

  • در اختیار گذاشتن کلاسهای base، و کنترلهای GUI برای کار کردن با تاریخهای فارسی. بعضی از این ویژگیها ( مثلاً در drawing آفیس 2000) هنوز تکمیل نشده اند.

برای دانلود کتابها و مقالات الکترونیکی رایگان به سایت http://www.tahlildadeh.com مراجعه نمایید.

آموزش سی شارپ

کدهای مربوط به یک Grid در #C

ارسال شده توسط administrator
25. می 2010 02:29

clip_image002

مقدمه

SourceGrid یک کنترل windows form است که کلاً در c# نوشته می شود، هدف من ایجاد یک grid ساده اما انعطاف پذیر جهت استفاده در همه مواردی است که برای نمایش یا تغییر داده ها در یک table format لازم است. کنترلهای زیادی از این نوع در دسترس هستند، اما معمولاً سنگین هستند و به سختی customize می شوند، یا با .NET سازگار نیستند. به نظر من Microsoft DataGridخیلی DataSet گرا است، و بنابراین نتایج معمولاً برای استفاده در مواردی که source data، یک DataSet نیست و به اندازه کافی قابل customize نیست، پیچیده می شوند.

این کنترل توسط با Microsoft Framework. NET 1.1، و reference the assembly SourceLibrary.dll 1.2.0.0، compile می شود؛ این، یک library کوچک با کاربرد عادی است. جهت استفاده از SourceGrid، داشتن Visual Studio.NET 2003 یا یک محیط development سازگار، لازم است.

در این مقاله می خواهم چشم اندازی از استفاده و کاربرد کنترل SourceGrid ارایه کنم، جهت جزییات بیشتر در مورد کلاسها، propertyها، یا متدها، می توانید از documentation کمک بگیرید.

استفاده از SourceGrid

در assembly SourceGrid2.dll حاضر هستند، 2 کنترل که می توان درجعبه ابزار Visual Studio قرار داد و در هر formی استفاده کرد:

GridVirtual – یک گرید از سلولهای مجازی (ICellVirtual).

Grid – یک گرید از سلولهای واقعی ( ICell).

بنابراین دو تفاوت اساسی وجود دارد: سلولهای مجازی و سلولهای واقعی.

سلولهای مجازی، سلولهایی هستند که ظاهر و رفتار سلول را تعیین می کنند، اما شامل value نمی شوند، سلولهای واقعی، دارای همان ویژگی های سلولهای مجازی هستند، اما value را هم در بر می گیرند. بنابراین مربوط به موقعیت معینی از grid می شوند.

clip_image003

هر سلول از سه بخش اصلی تشکیل شده است:

DataModel: DataModel، کلاسی است که valueی سلول را مدیریت می کند. Valueی سلول را به یک string برای نمایش بصری (visual representation) تبدیل می کند، editor سلول را ایجاد می کند و valueهای insert شده را اعتبار سنجی می کند.

VisualModel: VisualModel، کلاسی است که سلول را ترسیم می کند و دربر گیرنده propertyهای visual است.

BehaviorModel: BehaviorModel کلاسی است که رفتار سلول را تعیین می کند.

این subdivision، انعظاف و قابلیت استفاده مجدد به code می دهد، و در زمان صرفه جویی می کند. برای موارد رایج تر، کلاسهایی وجود دارند که قبلاً مدیریت و پیکربندی شده اند، اما با خطهای کم کد، ایجاد سلولهای customize شده، ممکن است.

Grid

اگر می خواهید انعطاف و سادگی بیشترین را بدون سلولهای زیاد می خواهید، کنترل Grid ایده آل است. در واقع، در این کنترل، همه سلولها توسط یک کلاس .NET ارایه می شود و بنابراین مقدار معینی از منابع را اشغال می کنند. به علاوه، این تنها gridیی است که ویژگی های RowSpan و ColumnSpan را ساپورت می کند.

بعد از insert کردن کنترل در فرم، می توانیم نوشتن کدمان را جهت استفاده از grid در رویداد Load فرم شروع کنیم:

grid1.Redim(2, 2);
grid1[0,0] = new SourceGrid2.Cells.Real.Cell("Hello from Cell 0,0");
grid1[1,0] = new SourceGrid2.Cells.Real.Cell("Hello from Cell 1,0");
grid1[0,1] = new SourceGrid2.Cells.Real.Cell("Hello from Cell 0,1");
grid1[1,1] = new SourceGrid2.Cells.Real.Cell("Hello from Cell 1,1");

کد قبلی یک جدول با 2 خط و دو ستون ایجاد می کند (متد Redim) و همه positionها را با یک سلول اشغال می کند. از از فضای اسمی SourceGrid2.Cells.Real استفاده کرده ام که در همه سلولهای واقعی وجود دارد.

همه سلولها، تمامی خصوصیات لازم نمایش را دارند، مثلاً جهت تغییر رنگ پیش زمینه سلول می توانیم بنویسیم:

SourceGrid2.Cells.Real.Cell l_Cell = new SourceGrid2.Cells.Real.Cell(
"Custom back color");
l_Cell.BackColor = Color.LightGreen;
grid1[0,0] = l_Cell;

اینها، خصوصیات ظاهری یک سلول هستند: BackColor، ForeColor، Border, Font، TextAlignment، WordWrap.

حالا سعی می کنیم یک grid کلی با header، و automatic sort، و resize ستونها با ماوس، رشته (string)، و ویرایشگر DateTime و یک checkbox ایجاد کنیم.

grid1.BorderStyle = BorderStyle.FixedSingle;
grid1.ColumnsCount = 3;
grid1.FixedRows = 1;
grid1.Rows.Insert(0);
grid1[0,0] = new SourceGrid2.Cells.Real.ColumnHeader("String");
grid1[0,1] = new SourceGrid2.Cells.Real.ColumnHeader("DateTime");
grid1[0,2] = new SourceGrid2.Cells.Real.ColumnHeader("CheckBox");
for (int r = 1; r < 10; r++)
{
grid1.Rows.Insert(r);
grid1[r,0] = new SourceGrid2.Cells.Real.Cell("Hello "
+ r.ToString(), typeof(string));
grid1[r,1] = new SourceGrid2.Cells.Real.Cell(
DateTime.Today, typeof(DateTime));
grid1[r,2] = new SourceGrid2.Cells.Real.CheckBox(true);
}
grid1.AutoSizeAll();

در کد قبلی، من grid border، تعداد ستونها، تعداد ردیفهای ثابت را تنظیم و اولین ردیف header را ایجاد کرده ام. برای header، من از یک سلول ColumnHeader استفاده کرده ام. کلاس Cell به طور اتوماتیک، یک editor مناسب برای نوع داده ای معین، ایجاد می کند. برای آخرین ستون، من از یک سلول CheckBox استفاده کرده ام که یک checkbox را مستقیماً روی سلول نمایش میدهد. این فرم باید شبیه figure زیر باشد:

clip_image001

GridVirtual

کنترل GridVirtual، وقتی نمایش سلولهای زیاد واجب است و وقتی ساختاری

این نوع grid، دارای همان ویژگی های کنترل Grid است، به غیر از automatic sort (زیرا grid نمی تواند هیچ ساختار داده ای را بدون کپی کردن محتویاتش مرتب کند) و ویژگی RowSpan و ColumnSpan که اجازه span کردن یک سلول را در سلولهای مجاور دیگر می دهد. عیب دیگر این است که ایجاد یک grid مجازی کمی مشکل است.

مفهوم اصلی یک grid مجازی این است که سلولها، valueها را دربر نمی گیرند، اما value را در یک ساختار داده ای خارجی می خوانند و می نویسند. این ایده با یک کلاس انتزاعی CellVirtual اجرا می شود که در آن تعریف دوباره متدهای GetValue و SetValue لازم هستند.

جهت استفاده از GridVirtual، ایجاد یک کلاس که از CellVirtual مشتق شده و شخصی کردن reading با استفاده از منبع داده انتخاب شده، واجب است. معمولاً بهتر است یک کنترل که از GridVirtual مشتق می شود نیز ایجاد کنیم تا انعطاف بیشتر و کدی solid تر داشته باشیم که متد GetCell را override می کند. اگر مایل باشید، می توانید مستقیماً از کنترل GridVirtual و رویداد GettingCell استفاده کنید. هدف متد GetCell و رویداد GettingCell، بازگرداندن سلول انتخابی است. این کار انعطاف زیادی را ایجاد می کند، زیرا می توانید برای یک نوع داده ای معین، هر ICellVirtual را بازگردانید؛ مثلاً می توانید سلول یک type header را وقتی که ردیف 0 است، بازگردانید.

در مثال زیر، من یک grid مجازی ایجاد می کنم که valueها را در یک آرایه می نویسد. ابتدا، کنترل GridVirtual را در یک فرم insert می کنم، سپس این کد را که کلاس مجازی ما را تعریف می کند، می نویسم:

public class CellStringArray : SourceGrid2.Cells.Virtual.CellVirtual
{
private string[,] m_Array;
public CellStringArray(string[,] p_Array):base(typeof(string))
{
m_Array = p_Array;
}
public override object GetValue(SourceGrid2.Position p_Position)
{
return m_Array[p_Position.Row, p_Position.Column];
}
public override void SetValue(SourceGrid2.Position p_Position,
object p_Value)
{
m_Array[p_Position.Row, p_Position.Column] = (string)p_Value;
OnValueChanged(new SourceGrid2.PositionEventArgs(p_Position, this));
}
}

با کد قبلی، من یک سلول مجازی با یک editor از نوع string ایجاد کردم که valueها را در یک آرایه، که در constructor معین شده، می خواند و می نویسد. بعد از فراخوانی متد SetValue، باید متد OnValueChangedرا فرابخوانیم تا grid را از update کردن این سلول آگاه کنیم.

من کد زیر را در در رویداد Load در Form قرار داده ام:

private void frmSample15_Load(object sender, System.EventArgs e)
{
gridVirtual1.GettingCell += new SourceGrid2.PositionEventHandler(
gridVirtual1_GettingCell);
gridVirtual1.Redim(1000,1000);
string[,] l_Array = new string[gridVirtual1.RowsCount,
gridVirtual1.ColumnsCount];
m_CellStringArray = new CellStringArray(l_Array);
m_CellStringArray.BindToGrid(gridVirtual1);
}

من یک event handler به رویداد GettingCell اضافه کرده ام، و grid وآرایه را با 1000 ردیف و 1000 ستون ایجاد کردم، سپس مثال جدیدی از سلول قبلی ایجاد کردم و با استفاده از متد BindToGrid، سلول را به grid لینک کردم. یک سلول واحد ایجاد کردم که برای هر موقعیت matrix استفاده خواهد شد. فراخوانی متد BindToGrid روی سلولهایی که می خواهیم در یک grid مجازی استفاده کنیم، همیشه لازم است.

جهت اتمام کار، باید متد GettingCell را بنویسیم و متغیر را برای سلول تعریف کنیم:

private CellStringArray m_CellStringArray;
private void gridVirtual1_GettingCell(object sender,
SourceGrid2.PositionEventArgs e)
{
e.Cell = m_CellStringArray;
}

نتیجه حاصله باید شبیه تصویر زیر باشد:

clip_image001[5]

VisualModel

فضای نامی: SourceGrid2.VisualModels

همه سلولها یک property دارند که یک رابط type IvisualModel را باز می گرداند. سلول از این رابط (Interface) جهت ترسیم و سفارشی کردن ویژگی های ظاهری (visual properties) سلول استفاده می کند.

هدف VisualModel، جدا سازی کد drawing از بقیه کد است و اجازه به اشتراک گذاشتن همان مدل visual بین سلولهای بیشتری است. در حقیقت،می توان از همان مثال VisualModel روی سلولهای بیشتری به طور همزمان استفاده کرد تا منابع سیستم را بهینه کند. کلاسهای پیش فرض VisualModel، فقط خواندنی (read-only) هستند، اما یک متد Clone، که به شما اجازه می دهد نمونه های همسانی از همان مدل را ایجاد کنید، در اختیار هر VisualModel قرار می گیرد.

در زیر کلاسهای پیش فرض VisualModel در namespace آورده شده است.

  • SourceGrid2.VisualModels.Common: برای سلولهای کلاسیک استفاده می شود. در این مدل، شما می توانید رنگها، فونت، borderها و propertyهای زیاد دیگری را customize کنید.
  • SourceGrid2.VisualModels.CheckBox*: برای سلولهای checkbox style استفاده می شود. می توان checkbox را انتخاب، و غیر فعال (disable) کرد و می تواند یک caption داشته باشد.
  • SourceGrid2.VisualModels.MultiImages: اجازه ترسیم بیشتر از یک image را در یک سلول می دهد.

VisualModel که با ستاره مشخص شده است، نیاز به یک رابط (interface) دارد که درست کار کند، مثلاً مدل CheckBox، نیاز به یک سلول دارد تا رابط ICellCheckBox را ساپورت کند.

هر یک از این کلاسها شامل یک یا چند property ثابت با چند نمونه فقط خواندنی است که براحتی قابل استفاده هستند.

· SourceGrid2.VisualModels.Common.Default

· SourceGrid2.VisualModels.Common.LinkStyle

· SourceGrid2.VisualModels.CheckBox.Default

· SourceGrid2.VisualModels.CheckBox.MiddleLeftAlign

· SourceGrid2.VisualModels.Header.Default

· SourceGrid2.VisualModels.Header.ColumnHeader

· SourceGrid2.VisualModels.Header.RowHeader

این کد چگونگی تخصیص دادن همان VisualModel را به سلولهای بیشتری که قبلاً ایجاد شده اند، نشان می دهد و سپس بعضی از propertyها را تغییر می دهد:

SourceGrid2.VisualModels.Common l_SharedVisualModel = 
new SourceGrid2.VisualModels.Common();
grid1[0,0].VisualModel = l_SharedVisualModel;
grid1[1,0].VisualModel = l_SharedVisualModel;
grid1[2,0].VisualModel = l_SharedVisualModel;
l_SharedVisualModel.BackColor = Color.LightGray;

در نظر داشته باشید وقتی Cell.BackColor را می نویسید، property، به طور اتوماتیک، property of the VisualModel associated را فرا می خواند. جهت تسهیل استفاده از propertyهای رایج تر، اگر بنویسید: Cell.BackColor = Color.Black، سلول به طور اتوماتیک، VisualModel کنونی را clone می کند، backcolor را به رنگ نمونه clone شده تغییر می دهد و نمونه clone شده را به سلول اختصاص می دهد.

DataModel

فضای نامی: SourceGrid2.DataModels

برای نشان دادن valueی یک سلول در یک string format و فراهم کردن یک cell data editor، لازم است property DataModel سلول را populate کنیم. اگر این property، خالی باشد، امکان تغییر valueهای property سلول وجود ندارد و تبدیل رشته (string conversion)، یک ToString ساده value خواهد بود.

یک DataModel معمولاً از یک TypeConverter از نوع داده ی فراخوانده شده جهت مدیریت تبدیل های لازم استفاده می کند، مخصوصاً از تبدیل رشته (که برای نمایش cell value استفاده می شود)

اینها، کلاسهای پیش فرض DataModel در فضای اسمی SourceGrid2.DataModels هستند:

DataModelBase: متد تبدیل را فراهم می کند و اجازه تغییر cell value را فقط توسط کد می دهد، و graphic interface را فراهم نمی کند. این کلاس، پایه همه editorهای دیگری است و همچنین برای مدیریت سلولهای فقط خواندنی بکار می رود، اما با formattingهای customize شده و editorهای مخصوص (مانند CheckBox) سلول از یک editor فقط خواندنی استفاده می کند، زیرا value با کلیک مستقیم روی checkbox تغییر می کند.

EditorControlBase: یک کلاس انتزاعی (Abstract Class) که به استفاده از یک کنترل به عنوان editor سلول کمک می کند.

:EditorTextBox یک TextBox editor. این، کلاسی است که تمامی typeهایی که string conversion را ساپورت می کنند، از آن زیاد استفاده می کنند.

EditorComboBox: یک ComboBox editor

EditorDateTime: یک DateTimePicker editor

EditorNumericUpDown: یک UpDown editor شماره ای

EditorTextBoxButton: امکان edit کردن سلول همه typeهایی را که دارای یک UITypeEditor هستند، فراهم می کند.

یک DataModel را می توان بین سلولهای بیشتری به اشتراک گذاشت، مثلاً می توانید از یک DataModel برای همه سلولهای یک ستون استفاده کرد.

دو راه برای ایجاد یک سلول قابل ویرایش، وجود دارد:

سلول را ایجاد و value type را مشخص کنید.در این حالت، سلول به طور اتوماتیک یک utility function (Utility.CreateDataModel) را فرا می خواند که یک DataModel را در پایه به type مشخص شده باز می گرداند.

grid1[0,0] = new SourceGrid2.Cells.Real.Cell("Hello", 
typeof(string));

DataModel را به صورت جداگانه ایجاد کنید و آن را به سلولها تخصیص دهید.

SourceGrid2.DataModels.EditorTextBox l_TextBox =
new SourceGrid2.DataModels.EditorTextBox(typeof(string));
l_TextBox.MaxLength = 20;
l_TextBox.AttachEditorControl(grid1);
l_TextBox.GetEditorTextBox(grid1).CharacterCasing =
CharacterCasing.Upper;
grid1[2,0].DataModel = l_TextBox;

بعضی از propertyها تا سطح یک DataModel تعریف می شوند، در حالیکه propertyهای دیگر تا سطح یک editor control، در این مورد، property CharacterCasing، تا سطح یک کنترل TextBox تعریف می شود. بنابراین برای استفاده از این propertyها، force کردن یک linking of the editor به grid با متد AttachEditorControl، و سپس فراخوانی متد GetEditorTextBox جهت باز گرداندن نمونه TextBox ، واجب است. این مکانیزم برای ایجاد کردن ویرایشگر مخصوص مانند ComboBox editor نیز مفید است. برای insert کردن یک ComboBox، باید کد زیر را بنویسید:

SourceGrid2.DataModels.EditorComboBox l_ComboBox = 
new SourceGrid2.DataModels.EditorComboBox(
typeof(string),
new string[]{"Hello", "Ciao"},
false);
grid1[3,0].DataModel = l_ComboBox;

البته، ایجاد ویرایشگر DataModel با کنترل سفارشی یا با رفتار مخصوص نیز ممکن است. در تصویر زیر، مشاهده بیشتر ویرایشگرهای دردسترس و بعضی از optionها مانند image properties ممکن است:

clip_image001[7]

BehaviorModel

فضای نامی: SourceGrid2.BehaviorModels

هر سلول دارای یک BehaviorModel است که می توانید آن را با Behaviors property بخوانید. BehaviorModel کلاسی است که رفتار سلول را تعیین می کند. می توان مدلی را را بین سلولهای بیشتری به اشتراک گذاشت و اتعطاف پذیری و سادگی هر ویژگی جدید را امکان پذیر می کند.

اینها، کلاسهای پیش فرض type BehaviorModel هستند:

SourceGrid2.BehaviorModels.Common: رفتار عادی یک سلول

SourceGrid2.BehaviorModels.Header: رفتار یک row header، با ویژگی resize کردن

SourceGrid2.BehaviorModels.ColumnHeader: رفتار یک column header، با ویژگی sort و resize کردن. (به ICellSortableHeader نیاز دارد)

SourceGrid2.BehaviorModels.CheckBox: رفتار یک CheckBox. (به ICellCheckBox نیاز دارد)

SourceGrid2.BehaviorModels.Cursor: اجازه لینک کردن یک cursor را به یک سلول معین می دهد. (به ICellCursor نیاز دارد)

SourceGrid2.BehaviorModels.Button: رفتا ریک Button

SourceGrid2.BehaviorModels.Resize: اجازه resize شدن را با ماوس به سلول می دهد. (مدلهای header، به طور اتوماتیک از این مدل استفاده می کنند)

SourceGrid2.BehaviorModels.ToolTipText: اجازه نمایش یک ToolTipText لینک شده به یک سلول را می دهد. (به ICellToolTipText نیاز دارد)

SourceGrid2.BehaviorModels.Unselectable: نمی گذارد یک سلول، focus را دریافت کند.

SourceGrid2.BehaviorModels.ContextMenu: اجازه نمایش یک context menu لینک شده به یک سلو ل را می دهد. (به ICellContextMenu نیاز دارد)

SourceGrid2.BehaviorModels.CustomEvents: لیستی از رویدادها را که می توان بدون مشتق کردن از یک BehaviorModel، استفاده کرد، expose می کند.

SourceGrid2.BehaviorModels.BindProperty: اجازه لینک کردن valueی یک سلول را به یک property خارجی می دهد.

SourceGrid2.BehaviorModels.BehaviorModelGroup: اجازه ایجاد یک BehaviorModel را می دهد که به طور اتوماتیک لیستی از BehaviorModel را فرا می خواند. زمانی مفید است که یک رفتار، به رفتارهای دیگر نیاز دارد تا درست کار کند.

BehaviorModel که با علامت ستاره مشخص شده است، نیاز به سلولهای مخصوصی دارد تا بتواند وظایفش را اجرا کند، مثلاً، کلاس CheckBox، نیاز به سلولی دارد که interface IcellCheckBox را ساپورت کند.

هر کلاس دارای چند property ثابت است که یک instance پیش فزض را باز می گرداند:

SourceGrid2.BehaviorModels.Common.Default

SourceGrid2.BehaviorModels.Button.Default

SourceGrid2.BehaviorModels.CheckBox.Default

SourceGrid2.BehaviorModels.ColumnHeader.SortableHeader

SourceGrid2.BehaviorModels.ColumnHeader.NotSortableHeader

SourceGrid2.BehaviorModels.Cursor.Default

SourceGrid2.BehaviorModels.Header.Default

SourceGrid2.BehaviorModels.Resize.ResizeHeight

SourceGrid2.BehaviorModels.Resize.ResizeWidth

SourceGrid2.BehaviorModels.Resize.ResizeBoth

SourceGrid2.BehaviorModels.RowHeader.Default

SourceGrid2.BehaviorModels.ToolTipText.Default

SourceGrid2.BehaviorModels.Unselectable.Default

در کد زیر، من یک BehaviorModel ایجاد کرده ام که backcolor سلول را هنگامی که کاربر ماوس را روی آن قرار میدهد، تغییر می دهد:

public class CustomBehavior : SourceGrid2.BehaviorModels.BehaviorModelGroup
{
public override void OnMouseEnter(SourceGrid2.PositionEventArgs e)
{
base.OnMouseEnter (e);
((SourceGrid2.Cells.Real.Cell)e.Cell).BackColor = Color.LightGreen;
}
public override void OnMouseLeave(SourceGrid2.PositionEventArgs e)
{
base.OnMouseLeave (e);
((SourceGrid2.Cells.Real.Cell)e.Cell).BackColor = Color.White;
}
}

برای استفاده از این BehaviorModel، این کد را در رویداد Load یک فرم، insert کنید:

grid1.Redim(2,2);

CustomBehavior l_Behavior = new CustomBehavior();
for (int r = 0; r < grid1.RowsCount; r++)
for (int c = 0; c < grid1.ColumnsCount; c++)
{
grid1[r,c] = new SourceGrid2.Cells.Real.Cell("Hello");
grid1[r,c].Behaviors.Add(l_Behavior);
}

سلولها

فضای نامی: SourceGrid2.Cells

اینها، سلولهای پیش فرض در دسترس هستند:

SourceGrid2.Cells.Virtual: این فضای نامی، حاوی تمامی سلولهای مجازی است که می توان با یک کنترل GridVirtual استفاده کرد، همه اینها، سلولهای انتزاعی (abstract) هستند و باید از این سلولها مشتق شوند تا بتوانید از منبع داده سفارشی تان استفاده کنید.

CellVirtual: سلول پایه همه پیاده سازی های دیگر (implementation)، برای رایج ترین نوع سلولهای مجازی استفاده میز شود.

Header: یک سلول header.

ColumnHeader: یک سلول column header.

RowHeader: یک سلول row header.

Button: یک سلول button

CheckBox: یک سلول checkbox

ComboBox: یک سلول combobox

Link: یک سلول link style

SourceGrid2.Cells.Real: این فضای نامی حاوی تمامی سلولهای واقعی است می توان با یک کنترل Grid استفاده کرد.

Header: یک سلول header.

ColumnHeader: یک سلول column header.

RowHeader: یک سلول row header.

Button: یک سلول button

CheckBox: یک سلول checkbox

ComboBox: یک سلول combobox

Link: یک سلول link style

هدف این کلاسها، ساده کردن استفاده از VisualModel، DataModel، و BehaviorModel است. اگر ما نگاهی به کد هر کدام از این کلاسها بیاندازیم، می ببنینم که این کلاسها از مدلهای قبلی استفاده می کنند. اما مدلهایی وجود دارند که به interface های مخصوصی نیاز دارند و در این مورد، همه interface های لازم را انجام می دهد. مثلاً کد زیر، کد سلول SourceGrid2.Cells.Real.CheckBox است:

public class CheckBox : Cell, ICellCheckBox
{
public CheckBox(string p_Caption, bool p_InitialValue)
{
m_Caption = p_Caption;

DataModel = new SourceGrid2.DataModels.DataModelBase(typeof(bool));
VisualModel = SourceGrid2.VisualModels.CheckBox.MiddleLeftAlign;
Behaviors.Add(BehaviorModels.CheckBox.Default);

Value = p_InitialValue;
}
public bool Checked
{
get{return GetCheckedValue(Range.Start);}
set{SetCheckedValue(Range.Start, value);}
}
private string m_Caption;
public string Caption
{
get{return m_Caption;}
set{m_Caption = value;}
}
public virtual bool GetCheckedValue(Position p_Position)
{
return (bool)GetValue(p_Position);
}
public virtual void SetCheckedValue(
Position p_Position, bool p_bChecked)
{
if (DataModel!=null && DataModel.EnableEdit)
DataModel.SetCellValue(this, p_Position, p_bChecked);
}
public virtual CheckBoxStatus GetCheckBoxStatus(Position p_Position)
{
return new CheckBoxStatus(DataModel.EnableEdit,
GetCheckedValue(p_Position), m_Caption);
}
}

همانطور که می بینید، کلاس CheckBox، فقط از مدلهای SourceGrid2.DataModels.DataModelBase(typeof(bool))، استفاده می کند. SourceGrid2.VisualModels.CheckBox.MiddleLeftAlign e BehaviorModels.CheckBox.Default، رابط ICellCheckBoxرا با متد GetCheckBoxStatus اجرا می کند. متدهای Checked، Caption، GetCheckedValue، و SetCheckedValue، متدهایی هستند که ویرایش valueی سلول را ساده می کنند.

ساختار Grid

ردیفها و ستونها (Rows and Columns)

اجزای اصلی یک grid، ردیفها و ستونها هستند. جهت تغییر دادن این اطلاعات، SourceGrid، دو property فراهم می کند:

Rows: مجموعه ای از type RowInfoCollection را بازمی گرداند که یک strip از کلاسهای RowInfo است.

Columns: مجموعه ای از type ColumnInfoCollection را بازمی گرداند که لیستی از کلاسهای ColumnInfo است.

اینها، بعضی از propertyهای کلاس RowInfo هستند: Height ، Top، Bottom،

اینها هم، propertyهای کلاس ColumnInfo هستند: Width، Left، Right، Index، Tag.

راههای زیادی جهت تغییر دادن (manipulate) ردیفها و ستونها وجود دارد:

grid1.Redim(2,2);
grid1.RowsCount = 2;
grid1.ColumnsCount = 2;

 

grid1.Rows.Insert(0);
grid1.Rows.Insert(1);
grid1.Columns.Insert(0);
grid1.Columns.Insert(1);

این سه مثال، تمامی کارهای ایجاد یک جدول با 2 ردیف و 2 ستون را انجام می دهد.

جهت تغییر پهنا یا ارتفاع یک ردیف یا ستون، می توان از این کد استفاده کرد:

grid1.Rows[0].Height = 100;
grid1.Columns[0].Width = 100;

 

propertyهای Top، Bottom، Left و Right، با استفاده از پهنا و ارتفاع ردیفها و ستونها به طور اتوماتیک محاسبه می شوند.

Panelها
برای مدیریت صحیح scrollbarها، ستونها، ردیفهای ثابت، و جزییات دیگر، ساختار panelهای grid داخلی باید مانند شکل زیر باشد:

1.    TopLeftPanel : سلولهای ردیف و ستون ثابت را نگه می دارد.
2.    TopPanel : ردیفهای ثابت را نگه می دارد.
3.    LeftPanel : ستونهای را ثابت نگه می دارد.
4.    ScrollablePanel : سلولهای غیر ثابت را ثابت نگه می دارد.
5.    HScrollBar : ScrollBar افقی
6.    VScrollBar : ScrollBar عمودی
7.    BottomRightPanel : پنل مدیریت فضای کم بین دو scrollbar

رویدادها
رویدادهای ماوس و کیبورد را می توان با یک BehaviorModel استفاده کرد یا می توان مستقیماً به grid وصل کرد. همه رویدادها ابتدا به panelها و سپس به طور اتوماتیک به کنترلهای GridVirtual و Grid،اجرا می شوند. جهت استفاده از این رویدادها می توانید کد زیر را بنویسید:

grid.MouseDown += new System.Windows.Forms.MouseEventHandler(
grid_MouseDown);

می توان این کار را با Visual Studio designer نیز انجام داد.

ContextMenu

Grid، دارای یک ContextMenu پیش فرض است که می توان آنرا با ContextMenuStyle property، سفارشی کرد. می توان یک ContextMenu را به شی Selection با Grid.Selection و ContextMenuItemsمتصل کرد، که برای تمامی سلولهای انتخاب شده قابل استفاده است؛ در غیر این صورت، می توانید یک ContextMenu را مستقیماً به یک سلول معین متصل کرد.

اطلاعات دیگر

Focus و Selection

یک سلول می تواند یا انتخاب شود و یا focus داشته باشد. فقط یک سلول می تواند focus را داشته باشد، که FocusCellPosition property of the grid آن را شناسایی می کند، در عوض، سلولهای زیادی می توانند انتخاب شوند. یک سلول وقتی انتخاب می شود که در Selection object of the grid حاضر باشد. سلول دارای focus، تمامی رویدادهای ماوس و کیبورد را دریافت می کند، در حالیکه سلولهای انتخاب شده اعمالی از قبیل copy و paste را دریافت می کنند.

Position و Range

دو تا از پرکاربردترین اشیاء در پروژه SourceGrid، Position و Range هستند. Position، موقعیتی را با یک ردیف و ستون مشخص می کند، درحالیکه Range، گروهی از سلولهای نامحدود را از یک start Position و یک end Position، شناسایی می کند.

Performance

برای بهینه کردن اجرای این کنترل، از کنترل GridVirtual، هنگامی که نمایش سلولهای زیادی واجب است، استفاده کنیدو همیشه سعی کنید مدلهای DataModel، VisualModel، و BehaviorModel را بین سلولهای بیشتری به اشتراک بگذارید. اجرای (performance)grid ، حتی اگر ترسیم (drawing) کد هنوز قابل بهینه سازی باشد، تقریباً خوب است، مخصوصاً هنگام scroll کردن.

Extensionها

در پروژه SampleProject، مثالها و بخشهای زیادی از کد وجود دارند که می توانند ایده ها و پیشنهادهایی درباره چگونگی پیاده سازی custom grid، ارایه می کنند، بویژه در پوشه Extensionها، gridهایی وجود دارند عملکردهایی مثل bind کردن به یک DataSet (DataTable)، به یک Array، و به یک ArrayList را فراهم می کنند.

Screenshotها

clip_image001[9]

clip_image002[6]

clip_image003[6]

چگونگی انتخاب کل یک ردیف:

grid1.Rows[1].Select = true;

چگونگی انتخاب همه سلولها:

grid1.Selection.AddRange(grid1.CompleteRange);

چگونگی ایجاد یک editor با قانون اعتبارسنجی پیشرفته:

grid1[0,0] = new SourceGrid2.Cells.Real.Cell(2, typeof(int));
grid1[0,0].DataModel.MinimumValue = 2;
grid1[0,0].DataModel.MaximumValue = 8;
grid1[0,0].DataModel.DefaultValue = null;
grid1[0,0].DataModel.AllowNull = true;

چگونگی ایجاد یک ویرایشگر ComboBox برای نمایش یک valueی متفاوت از valueی واقعی استفاده شده.

در این مورد، زمانیکه valueی واقعی یک double است، به صورت یک string نمایش داده می شود.

double[] l_RealValues = new double[]{0.0,0.5,1.0};
SourceGrid2.DataModels.EditorComboBox l_EditorCombo =
new SourceGrid2.DataModels.EditorComboBox(typeof(double));
l_EditorCombo.StandardValues = l_RealValues;
l_EditorCombo.StandardValuesExclusive = true;
l_EditorCombo.AllowStringConversion = false;
SourceLibrary.ComponentModel.Validator.ValueMapping l_Mapping =
new SourceLibrary.ComponentModel.Validator.ValueMapping();
l_Mapping.ValueList = l_RealValues;
l_Mapping.DisplayStringList = new string[]{"Zero", "One Half", "One"};
l_Mapping.BindValidator(l_EditorCombo);
grid1[0,0] = new SourceGrid2.Cells.Real.Cell(0.5, l_EditorCombo);

ویژگی ها

کارهایی که SourceGrid می تواند امجام دهد:

سفارشی کر دن ظاهر گرافیکی، نوع ویرایشگر و رفتار (cursor، tooltiptext، contextmenu) هر سلول.

همه انواع داده هایی را که TypeConvertor یا UITypeEditor دارند، ساپورت می کند.

هر کنترل .NET را می توان مثل editor با خطوط کم کد استفاده کرد.

می توانید ردیف ها و ستون ها را اضافه، حذف و جابجا کنید.

می توان ارتفاع و پهنای هر ستون و ردیف را به طور مستقل سفارشی کرد، و یا می توان به طور اتوماتیک و بر اساس محتویات سلول محاسبه کرد.

ویژگی های RowSpan و ColumnSpan را جهت یکی کردن سلولهای بیشتری ساپورت می کند.

عملیات اتوماتیک Copy و Paste را ساپورت می کند.

column sort را ساپورت می کند.

می توانید پهنا و ارتفاع ستونها و ردیفها را تغییر دهید.

در همه سلولها، سفارشی کردن تصویر و alignment متن و تصویر امکان پذیر است.

متن MultiLine و WordWrap را ساپورت می کند.

خروج (export) HTML را ساپورت می کند.

با بعضی از extensionها، ویژگی های data binding را ساپورت می کند.

سلولهای مجازی که برای binding هر نوع منبع داده استفاده می شود را ساپورت می کند.

و کارهایی که نمی تواند انجام دهد:

SourceGrid، دارای designer نیست، همه را باید با کد انجام داد.

چاپ کردن را هم ساپورت نمی کند.

تغییر دادن کد SourceGrid

تغییر دادن، compile مجدد، و توزیع کنترل SourceGrid، برای استفاده شخصی و تجاری مجاز است.

Developmentهای آینده

بهبود ترسیم کد (drawing code)

ساپورت Masked Edit textbox

مشکلات شناخته شده

ساپورت Cut وجود ندارد

ویرایشگر NumericUpDown، به طور صحیح به سلول align نمی شود.

کلید shift با arrow keys کار نمی کند و سلولهای header هنوز مشکل دارند.

نسخه های قبلی

نسخه 2 SourceGrid، دارای تغییرات زیادی بود، و لیست کردن همه چیز ممکن نبود. حالت استفاده خیلی شیبه است، اما تبدیل یک کد نوشته شده با نسخه های قبلی ساده نیست. چند پیشنهاد وجود دارد:

ویژگی اصلی grid این است که با ICellVirtual interface کار می کند، نه با کلاس Cell. این Interface، فقط حاوی متدهای لازم است و بنابراین ضعیفتر است.

کدی که قبلاً برای این وجود داشت:

grid[0,0] = new SourceGrid.Cell("Ciao");
grid[0,0].BackColor = Color.White;

و حالا باید این گونه باشد:

SourceGrid2.Cells.Real.Cell l_Cell = 
new SourceGrid2.Cells.Real.Cell("Ciao");
l_Cell.BackColor = Color.White;
grid[0,0] = l_Cell;

در نسخه قبلی، سلول پایه از Cell متمایز شد، در حالیکه interface IcellVirtual وجود دارد و تغییر مهم این کلاس این است که اطلاعات در مورد موقعیت ردیف و ستون را در بر نمی گیرد.

حالا Grid به طور ذاتی property BorderStyle را که قادر به حذف Panel نهایی است، و قبلاً جهت ایجاد یک border لازم بود، ساپورت می کند.

حالا همه کدهایی که ابتدا به رویدادهای یک سلول bind شدند، باید به یک BehaviorModel منتقل شوند، مثلاً می توانید از SourceGrid2.BehaviorModels.CustomEvents استفاده کنید.

شی Selection، دیگر مجموعه ای از سلولها محسوب نمی شود، بلکه مجموه ای از range است.

با insert کردن اشیاء ردیف و ستون، کدی که ابتدا باید روی خطوط و ستونها کار کند، نتیجه ساده تری دارد، به علاوه،متدهای زیاد دیگری که قبلاً درGrid بودند، حالا در کلاسهای ColumnInfoCollection یا ColumnInfo هستند.

شی CellsContainer، دیگر وجود ندارد، و حتی اگر از panelها جایگزین شود، commonهای بیشتری به مستقبماً به grid لینک می شوند، و بنابراین کدی که قبلاً از CellsContainer استفاده می کرد، حالا میط تواند مستقیماً از کنترل grid استفاده کند.

شی قدیمی ICellModel، حالا شی IDataModel است، در حالیکه شی VisualProperties الان IVisualModel شده است.

کلاس CellControl، فعلاً دیگر ساپورت نمی شود.

برای دانلود مقالات بیشتر به سایت آموزشگاه تحلیلگر داده ها

http://WWW.Tahlildadeh.com مراجعه فرمایید.