LINQPad

ژانویه 30, 2009

اگر دوست دارید ضمن یاد گرفتن LINQ به راحتی کوئری‌های خود را از روی دیتابیس بسازید، LINQPad برای شماست.

 linqpadscreen

LINQPad یک نرم‌افزار رایگان و کم حجم است که به شما کمک می‌کند عبارات LINQ خود را به سادگی از روی دیتابیس تهیه کنید. LINQPad همچنین 200 مثال در مورد کار با LINQ‌ دارد و از LINQ TO SQL‌ و LINQ To Objects و LINQ To XML پشتیبانی می‌کند. علاوه بر این LINQPad به شما امکان اجرای کدهای C#.NET و VB.NET را هم می‌دهد. LINQPad امکان AutoCompletion را هم دارد که البته رایگان نیست. شما می‌توانید نسخه اجرایی (بدون نیاز به نصب) یا Setup نرم‌افزار را با حجمی کمتر از 3 مگابایت از سایت برنامه دانلود کنید.

Persian Date Gadget

می 4, 2007

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


image امروز ظهر حوصله‌ام سر رفته بود، نشستم یک گجت برای Sidebar‌ ویستا نوشتم که تاریخ شمسی را نشان بدهد. تبدیل تاریخ میلادی به شمسی دیگر تقریبا تبدیل به یک جور Hello World برای برنامه‌نویسان ایرانی شده است. الگوریتمش را اینجا می‌توانید ببینید. من در گجتی که نوشتم از این اسکریپت برای تبدیل تاریخ استفاده کردم.

درست کردن گجت برای ویستا کار بسیار بسیار ساده‌ای است. لینک‌هایی که در ادامه می‌آیند ایده شروع کار را به شما خواهند داد. در ضمن کلی گجت برای سایدبار ویستا نوشته شده که می‌توانید اینجا ببینید.
اما در مورد گجتی که نوشتم باید بگویم که منتشرش نمی‌کنم چون اولا بسیار ساده است و هر کسی می‌تواند یکی برای خودش بسازد، ثانیا فکر می‌کنم توسعه دادن گجت تقویم ویستا برای پشتیبانی از تقویم شمسی ایده بهتری است!

لینک‌های مرتبط
Gadget Development Overview
developing on vista: sidebar gadgets part 1 , part 2
Authoring Sidebar Gadgets in C#
Developing Vista Sidebar Gadgets

پ.ن: کلمه "گجت" شما را به یاد چیزی نمی‌اندازد؟ درست است: کارآگاه گجت! در همین رابطه، سایت نارنجی را هم ببینید.

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


یکی دو هفته پیش در دانشگاه سمینار آشنایی با VS 2005 با تکیه بر ASP.NET 2.0 برگزار شد. من هم کلاسم رو 2 در کردم و به اتفاق حامد رفتیم سمینار. بگذریم که بعد از 20 دقیقه بی توجه به سمینار داشتیم برای خودمان از مسائل دیگه ای حرف می زدیم. کل سمینار خوب بود ولی نکته جدیدی ازش یاد نگرفتم شاید چون تقریبا همه اون موارد رو قبلا می دونستم. به هر حال یکی از حرف های جالب آقای سمینار دهنده در باب کنترل GridView در دات نت 2 و سهولت استفاده از اون بود و این که در دات نت 1.1 قابلیت sort کردن ستون های دیتاگرید بوده ولی کار نمی کرده ! (البته ایشون در مورد validation ها هم همین رو گفتند).
برای اینکه ملت یک موقع در این زمینه گمراه نشوند این یادداشت رو می نویسم. برای استفاده از قابلیت sorting در دیتاگرید کارهای زیر رو انجام بدید:

اول ویژگی AllowSorting دیتاگرید رو true کنید.
دوم یک متد مثل متد زیر بنویسید که در واقع موقع نیاز به مرتب سازی فراخوانی می شه. این متد رو باید به SortCommand دیتاگرید منتسب کنید. متد Binding که فراخوانی شده عمل پر کردن دیتاست و انتسابش به دیتاگرید رو انجام می دهد.

private void dg_Sorting (Object s ,DataGridSortCommandEventArgs e)
{
  Binding ( e.SortExpression )
}

سوم هم اینکه در تابعی که عمل Binding رو انجام می ده از مقدار عبارت مرتب سازی ستون ها استفاده کنید (با استفاده از Order By در دستور SQL). توجه کنید که من کد مربوط به پر کردن دیتاست و انتسابش به دیتاگرید رو دیگه ننوشتم. فقط رشته ای که دستور SQL رو شامل می شه می تونید در زیر ببینید.

private void Binding (string sortexp)
{
  …
string sqlcmd="select * from MyTable order by "+sortexp;
….
}

فراموش نکنید هر ستونی که می خواهید قابلیت مرتب سازی داشته باشه مقدار SortExpression رو بر اساس فیلدی که می خواهید برایش ست کنید. در دیتاگرید ویندوز فرمها کار ساده تر هم هست. البته نباید این مطلب رو فراموش کرد که همه اینها در دات نت 2 خیلی ساده تر شده و تقریبا بدون کدنویسی خیلی از کارهای دات نت 1.1  رو می شه انجام داد.

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


image آقا من از همون جوانی از این کریستال ریپورت واسه خودم یک غول ساخته بودم. غافل از اینکه خیلی ابزار راحت و جمع و جوری است. این مدتی که به دلیل درگیری با یک پروژه دسکتاپ مجبور شدم کمی به کریستال ریپورت بپردازم، واقعا حس کردم که موجود قدرتمندی است. حالا بپردازیم به بحث ساختن Setup . در حالت معمولی که یک برنامه ویندوزی می نویسید مشکلی نیست. یک پروژه Setup جدید رو معرفی می کنید و Primary Output پروژه خودتان را به همراه فایل های دیگری که ضروری می دانید به آن اضافه می کنید. ولی اگر در برنامه تان از گزارش های Crystal Reports استفاده کرده اید یک نکته ای را باید هنگام ساخت Setup در نظر بگیرید. این نکته را تقریبا در هر سایتی می توانید پیدا کنید و چیزی نیست که من کشف کرده باشم. فقط برای اینکه توضیح فارسی اش باشد اینجا می نویسم.

قبل از هر چیز بروید Crystal Reports تان را رجیستر کنید تا دیگر آن دیالوگ رجیستر کردن را نبینید. این کار خیلی خیلی ساده است. رجیستر کردن از طریق وب را انتخاب کنید. کانکت شوید و ظرف 3 سوت نرم افزارتان را رجیستر کنید. کل پروسه کمتر از یک دقیقه طول می کشد. بعد یک ایمیل به آدرسی که موقع رجیستر کردن داده اید می آید که حاوی کد Registration Number هست. Key Code را می توانید از منوی Help و از گزینه About Microsoft Development Environment  پیدا کنید. در فرم About و در بخش Installed Products نام Crystal Reports For Visual Studio.NET را انتخاب کنید. جلوی این نام یک کد نوشته شده که همان Key Code شماست. بعد از انتخاب نام کریستال ریپورت روی دکمه Copy Info کلیک کنید تا اطلاعات در clipboard کپی شود و بعد Notepad را باز کنید و Paste کنید. شما فقط کد را نیاز دارید. با داشتن Key Code و Registration Number می توانید نرم افزارتان را رجیستر کنید.

اما ساخت Setup. پروژه از نوع Setup Project ( از بخش Setup and Deployment Projects ) را به Solution خود اضافه کنید. روی نام این پروژه جدید کلیک راست کنید و با انتخاب گزینه Add و سپس Project Output ، فایل های Primary Output را به آن اضافه کنید. ( تا اینجا شبیه Setup ساختن های معمولی است ) اما برای کریستال ریپورت چند گزینه دیگر را هم باید اضافه کنید. روی نام پروژه نصب کننده تان کلیک راست کنید و از بخش Add گزینه Merge Module را انتخاب کنید. حالا باید سه فایل زیر را به انتخاب و اضافه کنید :

Crystal_Database_Access2003.msm و Crystal_Database_Access2003_enu.msm و Crystal_regwiz2003.msm

این آخرین فایل یعنی regwiz همان است که باید کلید ثبت نرم افزار را به آن بدهیم و گرنه اصلا پروژه Setup شما کامپایل نمی شود ! روی نام Crystal_regwiz2003.msm کلیک کنید و از Property های آن دنبال License Key بگردید.( زیر مجموعه عنوان Merge Module Properties است ) و بعد Key Code  ( همان که از منوی Help ویژوال استودیو برداشتید ) را به این مشخصه بدهید. حالا Setup Project خودتان را کامپایل کنید تا فایل های نصب کننده ساخته شوند. برای اطمینان از درست بودن مراحل انجام شده یک بار برنامه تان را نصب کنید و گزارشتان را ببینید.

بعد نوشت : همین حالا مقاله ای از IranASP.net دیدم در همین مورد. دقیقا همین توضیحات است. گفتم که این نکته را می توانید همه جا پیدا کنید.

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


image قبلا یادداشتی نوشته بودم در مورد اینکه چگونه به دیتاگرید وب فرم ها پیام تایید حذف اضافه کنیم. امروز میخواهم شبیه آن را برای دیتاگرید ویندوز فرم ها بنویسم. این قابلیت را برای انجام پروژه ای نیاز داشتم. از طرف دیگر من ضمن اینکه معتقد بودم برنامه نویسی دسکتاپ یک فاجعه است، هیچ تجربه جدی هم در زمینه ویندوز فرم ها نداشتم. جستجو در این مورد مرا به صفحه های پرسش های متداول ویندوز فرم ها رساند. این صفحه که George Shepherd’s Windows Forms FAQ نام دارد حتی در MSDN هم مورد استناد قرار گرفته است.

در بخش سوال های مربوط به دیتاگرید، پاسخ سوال من هم بود. نکته این است که در این روش وقتی شخص یک سطر از دیتاگرید را انتخاب می کند و کلید Del را می زند. قبل از انجام عمل حذف یک messagebox جهت تایید انجام عملیات حذف نشان داده شود. برای این کار باید یکی از متدها را override کنید. یک کلاس تازه می نویسیم که از کلاس دیتاگرید مشتق می شود.

public class CustomDataGrid : DataGrid
{
private const int WM_KEYDOWN = 0×100;
public override bool PreProcessMessage( ref Message msg )
{
try
{
Keys keyCode = (Keys) (int) msg.WParam & Keys.KeyCode;
if ( msg.Msg == WM_KEYDOWN && keyCode == Keys.Delete ||
( DataView) DataSource ).AllowDelete) )
{
if ( MessageBox.Show( "مطمئن هستید که می خواهید
این رکورد را حذف کنید", "تایید حذف رکورد",
MessageBoxButtons.YesNo,MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button2,
MessageBoxOptions.RtlReading )== DialogResult.No )         
              return true; 
           } 
}
catch (Exception ex)
{
             Messagebox.Show (ex.Message.ToString() );
}
return base.PreProcessMessage( ref msg );
}
}

بهتر است این کلاس را جداگانه از فرم های برنامه تان داخل یک فایل جدید بنویسید تا هر وقت خواستید بتوانید از آن استفاده کنید. بعد از انجام این کار کافی است شی دیتاگرید فرمتان را از این کلاس بگیرید. البته شی گرفته شده از این کلاس تمام ویژگی ها و خواص دیتاگرید ویندوز فرم را دارد و فقط متد PreProcessMessage برای آن مجددا نوشته شده است.
تغییراتی که نیاز دارید یکی در ابتدای کلاس مربوط به فرمتان است که خود شی دیتاگرید معرفی می شود : private CustomDataGrid dataGrid1 
و دیگری در کدهای ساخته شده توسط ویژوال استودیو ( Windows Form Designer generated code ) باید در متد InitializeComponent بخش مربوط به شی گرفته شده دیتاگرید را پیدا کنید و به صورت زیر تغییر دهید.
()this.dataGrid1 = new CustomDataGrid

یکی از مشکلات این است که در عمل ممکن است برای بعضی از سطرها عمل نکند ! برای رفع این مشکل پیشنهاد می کنم از متد زیر استفاده کنید. این متد برای رویداد Mouse Up دیتاگرید نوشته شده است و کارش این است که اگر موس در قسمت Row Header قرار بگیرد Focus را به آن دیتاگرید منتقل می کند.

private void msup(object sender, MouseEventArgs e)
{
if ((int)dataGrid1.HitTest (e.X,e.Y).Type==4)
dataGrid1.sFocus ();
base.OnMouseUp (e);
}

این طوری می توانید مطمئن باشید که این روش برای همه سطرهای دیتاگرید شما عمل می کند. اگر مشکلی بود کامنت بگذارید.

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


image یکی دو ترم پیش یکی از دوستان برای پروژه معماری ( که یک اسمبلر کامپیوتر پایه بود ) یک windows application نوشته بود که یکی از قابلیت های جینگولش این بود که می تونستی تم برنامه رو بین دو حالت کلاسیک و یا XP تغییر بدی.من هم که می دونین اصلا با ویندوز فرم ها میانه ی خوبی ندارم ولی خب این مساله برام جالب بود. همون موقع رفتم دنبالش تا ببینم چطوری می شه این کار رو کرد. البته هیچ وقت هم ازش استفاده نکردم ! تا همین دیشب که یکی از دوستان در این مورد سوالی کرد و منم قول دادم که سورس رو براش بفرستم و حالا اینجا می نویسمش.

ابتدا باید امکان استفاده از VisualStyle ها رو فعال کنید برای این کار در Main  فرمتون خط مشخص شده زیر رو اضافه کنید :

static void Main()
{
   Application.EnableVisualStyles ();
   Application.Run(new Form1());
}

حالا هر کنترلی که می خواهید به ظاهر XP در بیاد کافیه خصوصیت FlatStyle ش رو به System ست کنید. اما اگر تعداد کنترل های فرم زیاد باشه به جای اینکه FlatStyle تک تک کنترل ها رو تغییر بدیم بهتره یک تابع بنویسیم که این کار رو برای همه شون انجام بده. این کار به خصوص برای زمانی که بخواهیم قابلیت سوئیچ بین ظاهر کلاسیک و اکس پی رو به کاربر بدیم لازمه. چون خیلی ضایع است  اگر بخواهیم توی کد خاصیت مشترک همه کنترل ها رو دونه دونه تغییر بدیم ( پس دید نرم افزاریتون کجا رفته ؟ )

خوشبختانه یک مقاله مفصل و کامل در این مورد در msdn موجود هست. فقط به یک نکته در مورد این مقاله اشاره کنم اونم اینکه توی این مقاله از یک مانیفست استفاده کرده و توی Form_Load اون رو به همراه نسخه سیستم عامل ( که XP هست یا نه ) تست می کنه. اگر دلتون نمی خواد مانیفست رو برای فایل اجرایی بسازید خب نسازید ! فقط اون if اول Form_Load رو بردارین.

مقاله مرتبط : Using Windows XP Visual Styles With Controls on Windows Forms

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


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

image

برنامه چند لایه چیست؟

در معماری چند لایه تمام برنامه به چندین بخش تقسیم می شود. این بخش ها می توانند فیزیکی یا منطقی باشند. هر بخش کار خاصی را انجام می دهد مثلا نمایش اینترفیس کاربر یا دسترسی به داده ها. برنامه می تواند به هر تعداد لایه داشته باشد ولی به هر حال بیشتر برنامه ها سه لایه مجزا دارند که عبارتند از :
1- Presentation Layer
2- Business Logic Layer
3- Data Access Layer

همان طور که احتمالا حدس زده اید، لایه Presentation چیزی نیست به جز بخشی از نرم افزار که با کاربر برنامه شما ارتباط برقرار می کند ( اینترفیس برنامه شماست ) نمایش داده ها به کاربر نهایی و اجازه به آنان برای ارتباط داشتن با داده ها، اصلی ترین وظیفه این لایه است.

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

در نهایت داده های برنامه شما نیاز به ذخیره و بازیابی از طریق یک انبار داده دارند ( مثلا سیستم مدیریت دیتابیس های رابطه ای یا RDBMS و یا XML , .. ) این وظیفه توسط لایه دسترسی به داده انجام  می شود.

به طور خلاصه، فرآیند مورد نظر ما این گونه کار می کند:

- کاربر برای داده های برنامه درخواستی ارسال می کند.
- لایه Data Access داده های مورد نظر را بازیابی می کند و از طریق لایه Business Logic آن ها را به لایه نمایش می فرستد.بعضی مواقع لایه دسترسی به داده ها، این داده ها را مستقیما به لایه نمایش ارسال می کند.
- لایه نمایش اطلاعاتی که باید نمایش داده شوند را از طریق لایه Business Logic دریافت می کند.
- کاربر داده ها را تغییر می دهد و عمل مناسب در مورد آن ها را اجرا می کند ( مثل اضافه یا به روز کردن داده ها )
- لایه Business Logic صحت داده های وارد شده توسط کاربر را بررسی می کند ( داده ها را اعتبار سنجی می کند)
- اگر داده ها معتبر باشند آن ها را برای به روز رسانی در بانک اطلاعاتی به دست لایه دسترسی به داده می سپارد.

مزیت های برنامه های چند لایه

- برنامه ها به چند بخش منطقی جدا از هم تقسیم می شوند و اتصال میان UI ( رابط کاربری ) ، پردازش ها و بانک اطلاعاتی کم می شود.
- تغییر در بانک اطلاعاتی یا روال های دسترسی به داده ها تاثیری در لایه نمایش یا برنامه کلاینت نخواهد گذاشت.
- برنامه کلاینت با عبارات SQL آمیخته نخواهد شد.
- نام جداول و ستون ها به طور موثری از برنامه کلاینت حذف می شوند.
- برنامه کلاینت نمی فهمد که داده ها از کجا آمده اند ( چیزی که به آن location transparency گفته می شود )
- تغییر یا گسترش برنامه بسیار ساده تر خواهد شد، بدون نیاز به تغییر یا کامپایل مجدد برنامه کلاینت.

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

انتخاب های لایه Presentation

دو انتخاب اصلی برای ساخت یک لایه نمایش در دات نت وجود دارد. آنها فرم های ویندوزی یا فرم های وبی ASP.NET هستند.

با استفاده از ویندوز فرم ها شما می توانید برنامه های دسکتاپ فرم محور ( form base ) معمول را بسازید. برنامه های ویندوز فرمی می توانند المان های رابط کاربری بسیار غنی به کاربر پیشنهاد کنند.آن ها کم و بیش شبیه به فرم های ویژوال بیسیک هستند.

جذاب ترین گزینه برای توسعه لایه نمایش استفاده از وب فرم های ASP.NET است. کنترل هایی مثل دیتاگرید، دیتالیست و تقویم ( Calendar ) یک رابط کاربری قدرتمند را با مقدار کمی کد فراهم  می کنند.

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

انتخاب های لایه Business Logic

لایه Business logic از چندین بخش که کارهایی نظیر اعتبار سنجی کار، گردش کار یا کارهای مشابه را انجام می دهند تشکیل شده است.

کامپوننت های دات نت این لایه را شکل می دهند. شما می توانید با interop از کامپوننت های COM استفاده کنید ولی این کار کارآیی را پایین خواهد آورد.

وب سرویس های ASP.NET هم می توانند به عنوان یک business logic  عمل کنند. اما به هر حال آن ها را نمی توان در همه شرایط به عنوان جایگزین کامپوننت ها به کار برد. وب سرویس ها تنها زمانی قابل استفاده خواهند بود که اعتبار سنجی در جایی بیرون از شبکه شما اتفاق افتاده باشد.

کامپوننت هایی که شما توسعه می دهید به ماندن روی ماشین های مشابه نیازی ندارند. با استفاده از .NET Remoting شما می توانید آن ها را روی چندین ماشین توزیع کنید.

انتخاب های لایه Data Access 

این لایه با دستکاری داده ها مثل اضافه ، حذف و به روز رسانی آن ها سر و کار دارد. داده هایی که به آن ها اشاره کردیم می توانند در RDBMS یا  XML قرار داشته باشند. شما باید لایه دسترسی به داده را چنان طراحی کنید که دیگر لایه ها نیازی به دانستن وضعیت انبار داده ها نداشته باشند.

ADO.NET فناوری دسترسی به داده تحت دات نت است. اگر چه ADO.NET از طریق کلاس های DataReader اجازه دسترسی به داده های در هنگام اتصال را می دهد ولی بیشترین تمرکز روی دسترسی به داده ها در زمان متصل نبودن است. دیتاست نقش کلیدی را در این مورد بازی می کند. در بعضی موارد شما می توانید ADO را هم برای دسترسی به داده ها استفاده کنید ولی استفاده از آن باید دلیل معتبری داشته باشد. از ADO استفاده نکنید فقط به خاطر اینکه RecordSet ها را دوست دارید !

این جا هم کامپوننت های دات نت لایه را تشکیل می دهند. همان طور که قبلا گفته شد شما می توانید از کامپوننت های کلاسیک COM هم استفاده کنید.

همچنین وب سرویس ها هم می توانند لایه دسترسی به داده را شکل دهند. این مخصوصا زمانی درست است که دیتابیس شما فراهم کننده  ( provider )  داده ندارد. در این گونه موارد شما می توانید مقداری کد  برای اتصال به داده ها و پر کردن دیتاست ها و بازگرداندن نتایج درون دیتاست به درخواست کننده داده بنویسید.

علاوه بر ADO.NET شما می توانید از امکانات سیستم مدیریت دیتابیس خود مثل توابع و یا روال های ذخیره شده ( Stored Procedures ) استفاده کنید.

ارسال داده از یک لایه به لایه دیگر

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