.NET Experts Community

تازه هاي سايت

  • پكيج دوم دوره آموزشي #C آماده توزيع شد

پكيج دوم دوره آموزشي #C

اين پكيج در ادامه پكيج اول و حاوي 12 فصل از مجموعه مطالب #C به مدت 12 ساعت تدريس مي‌باشد. شما مي‌توانيد براي تهيه آن با بخش فروش با تلفن 7453 111 0912 تماس بگيريد تا برايتان ارسال شود و يا به كتاب فروشي نشر چشمه واقع در خيابان كريمخان زند، نبش ميرزاي شيرازي مراجعه فرماييد.

دوره هاي آموزشي تخصصي NET.

كليه دوره هاي تخصصي NET. به صورت نيمه خصوصي برگزار مي شوند. همين حالا در كلاس هاي ما ثبت نام كنيد...

C#.NET - VB.NET - ASP.NET - Windows Forms - XML Web Services - .NET Remoting

مقالات NET.

در صورتي كه مقالاتي درباره NET. نوشته ايد، همين حالا آن ها را براي ما ارسال كنيد تا به عنوان يك مورد معتبر در رزومه تان ثبت شود.

كتاب هاي الكترونيكي

در اين سايت مي توانيد مجموعه اي از جديدترين و كمياب ترين كتاب هاي الكترونيكي از جمله كتاب ها و تست هاي MCSD و ... را بيابيد. هر روز 10 عنوان كتاب جديد به مجموعه كتاب هاي سايت افزوده مي شود. جهت دريافت ليست كتاب هاي جديد در پايان هر هفته، در سايت ما عضو شويد.

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات
درباره NET Experts.
عضويت در سايت
كنترل پنل
تماس با ما
سايت هاي مشابه

Copyright 2004 Cientech Corporation - All Rights Reserved

 http://www.cientech.com/


.NET Experts - About .NET

عناصر اصلي NET.

Microsoft.NET مجموعه اي از تكنولوژي هاي نرم افزاري شركت مايكروسافت است كه به منظور ايجاد ارتباط بين اطلاعات، اشخاص و سيستم ها طراحي شده است. اين مجموعه با استفاده از Web Service ها - برنامه هاي كوچك و مستقلي كه از طريق اينترنت قابليت اتصال به يكديگر يا به برنامه هاي بزرگتر را دارند - سطح بالايي از اتحاد بين نرم افزارها ايجاد مي كند.

اجزاي نرم افزارهايي كه از طريق Microsoft.NET به هم متصلند

نرم افزارها و سيستم عامل هاي باهوش (Smart)، كامپيوترهاي خانگي و ساير دستگاه هاي كامپيوتري را قادر مي سازند با استفاده از Web Service ها، در هر زمان و مكاني به اطلاعات دسترسي داشته باشند.

نرم افزارهاي باهوش و NET.

دستگاه هاي باهوش و NET.

مايكروسافت و بسياري از شركت هاي نرم افزاري در حال توسعه Web Service هاي پركاربردي - از جمله Web Service هايي براي اعمال شناسايي كاربران،‌ تقويم و ... - هستند كه مي توانند از طريق Web Service هاي ديگر و يا مستقيماً توسط Smart Client ها مورد استفاده قرار گيرند. يكي از جالب ترين Web Service هاي شركت مايكروسافت MapPoint است كه منطق نقشه و موقعيت مكاني را شبيه سازي مي كند. شما مي توانيد از اين Web Service در برنامه ها، پروسه هاي تجاري و سايت هاي وب استفاده كنيد.

Web Service ها چه هستند؟

Microsoft MapPoint Web Service

مايكروسافت بهترين سرور - Windows Server 2003 - را براي گسترش، مديريت و هماهنگ سازي Web Service ها ارائه مي دهد.

سرورهاي مايكروسافت و NET.

Microsoft Visual Studio.NET و Microsoft .NET Framework يك محيط كامل براي برنامه نويسان به منظور طراحي، گسترش و استفاده از Web Service ها فراهم مي كند.

ابزارهاي برنامه نويسان و NET.

مطالب مرتبط

برنامه نويسي با NET.

Microsoft .NET Framework

امنيت و NET.

منبع: سايت مايكروسافت
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات
درباره NET Experts.
عضويت در سايت


ويژگي هاي افزوده شده به ASP.NET 2.0

بررسي ويژگي هاي افزوده شده به ASP.NET 2.0، معماري صفحه، Master Page ها، اشتراك كدها در برنامه كاربردي، ايجاد Theme و Skin و ...

نويسنده reza

تاريخ ارسال 1383/5/13

ویژگی های افزوده شده به ASP.NET 2.0

زمانیکه ASP.NET روانه بازارها گردید انقلابی تازه در رابطه با توسعه ابزارهای وب به راه انداخت. ASP.NET 2.0 دارای امکانات سودمندتر و بهتری برای توسعه برنامه های کاربردی وب نسبت به ASP.NET 1.0 می باشد و از این لحاظ می توان به قدرت و قابلیتهای ASP.NET 2.0 پی برد. در زیر خصوصیات جدید ASP.NET 2.0 به اختصار بیان شده است.

معماری صفحه (Page Architecture)

یکی از بارزترین امکانات ASP.NET 2.0 پشتیبانی از معماری تک-صفحه (Single-Page Architecture) می باشد. منطق سمت سرور صفحه وب می تواند بجای قرار گرفتن در فایل aspx.cs مجزا در همان فایل قرار گیرد. اسکریپتهای سمت سرور می تواند در بین تگ <script runat="server"> قرار گیرند در حالیکه Object Model و Event Model در همان منطق Code Behind قرار می گیرند.
یکی دیگر از نکات بارز ASP.NET 2.0 این است که می توان فایلی را که تاکنون کامپايل نشده است را از سرور وب درخواست نمود. در این حالت فایل بصورت همزمان کامپایل شده و به درخواست مشتری پاسخ داده می شود.

Master Pages

ASP.NET 2.0 مفهومی جدید را با عنوان Master Pages معرفی می نماید. بدین صورت که یک فایل اشتراکی موجود می باشد که وظیفه پیاده سازی قسمت های اشتراکی تمامی صفحات سایت را برعهده دارد. در واقع این فایل به عنوان یک الگو برای دیگر فایلهای سایت استفاده می گردد.

اشتراک کدها در برنامه کاربردی

در ASP.NET 2.0 ایجاد و استفاده از کامپوننت های قابل استفاده مجدد بسیار ساده و روان می باشد. تنها کاری که شما باید انجام دهید قرار دادن کامپوننت مورد نظر در شاخه از پیش تعریف شده Code می باشد. هر کامپوننتی که در این شاخه قرار داشته باشد بطور خودکار در زمان کامپایل، در یک assembly کامپایل می گردد و بطور خودکار در کلیه صفحات سایت قابل دسترس می باشد.

ایجاد Theme و Skin

Themeها پوسته های توانگری می باشند که به شما اجازه می دهند ظواهر صفحات و کنترل ها را مشخص کرده و برروی تمامی صفحات اعمال نمایید. فایلهای Theme با پسوند skin در شاخه Themes ذخیره می گردند. شما می توانید از Theme های موجود استفاده کرده و یا Theme جدیدی را ایجاد نمایید.

توابع عضویت

ایجاد مکانیزم authentication یک عمل بسیار معمول برروی اغلب سایتها می باشد. مکانیزم Authentication Froms در ASP.NET یک روش معمول برای دستیابی به این هدف می باشد. ASP.NET 2.0 داری مکانیزمهایی علاوه بر تعیین هویت کاربر مانند ایجاد کاربر، مدیریت تغییر رمز عبور , ... می باشد. کنترل های جدیدی مانند LoginName، LoginStatus، LoginView، Login و PasswordRecovery برای حصول این نتایج فراهم گردیده اند.

خصوصیات شخصی کردن (Personalization Feature)

وب سایتهای فراوانی بر پایه ارتباط با کاربر طراحی شده اند. در اینگونه از سایتها کاربر خصوصیات قابل انتخاب سایت را بر حسب دلخواه خود تنظیم کرده و اطلاعات لازمه همراه با اطلاعات Login در بانک اطلاعاتی نگه داری می شوند. به اینگونه اطلاعات Profile کاربر گفته می شود. ASP.NET 2.0 راه جدیدی را برای شخصی سازی سایتها در اختیار قرار داده است.
در ASP.NET 2.0 اطلاعات شخصی سازی کاربر در یک قالب ماندگار نگهداری می گردد. شخصی سازی ASP.NET 2.0 به شما این امکان را می دهد که اطلاعات کاربر را بدون نیاز به ایجاد بانک اطلاعاتی خاص ویرایش و مشاهده نمود. بعلاوه توابعی برای مدیریت شخصی سازی فراهم شده که به کاربردن آنها در همه جا و به سهولت امکانپذیر می باشد. شما می توانید هرنوع شئ را در سیستم شخصی سازی همانند اطلاعات کاربر و ... ذخیره سازی نمایید. این سیستم از یک بانک اطلاعاتی عمومی بدین منظور استفاده می کند که پیش فرض آن SQL Server می باشد.

بخشها و نواحی وب

بکار بردن شخصی سازی و قابلیت انتخاب در ASP.NET 2.0 یک مفهومی به نام بخش وب (Web Part) بوجود آورده است. بخش وب قسمتی از صفحه وب می باشد که قابل شخصی سازی می باشد. کاربران می توانند مشخص نماید که بخش وب نمایش داده شود یا خیر. بخشهای وب در نواحی وب (Web Zones) قرار دارند و با یکدیگر امکان طراحی ماژولار سایت را امکانپذیر می نمایند.

Pre-Compilation سایت وب

 در ASP.NET 1.0 در صورتیکه برای اولین بار به وب سایت مراجعه شود سایت را کامپایل کرده و در نتیجه در اولین دفعه سرعت تاحدودی پایین می باشد. ASP.NET 2.0 دو راه حل برای از قبل کامپایل کردن سایت وب فراهم نموده است. اولین راه حل کامپایل کل سایت توسط فرمان precomilare.axd است که شامل خطاهای زمان کامپایل نیز میباشد. دومین راه حل فراهم کردن کپی "Source Code Less" از وب سایت با استفاده از ابزارهای خط فرمان می باشد. راه حل دوم تمامی فایلهای aspx و کلیه صفحات markup را به اسمبلی ها تیدیل می کند. در زمان اجرا این اسمبلی ها وظیفه سرویس دهی به کاربران را برعهده می گیرند.

کنترل های داده

ASP.NET 2.0 مدل اعلانی سریع و قدرتمندی برای دستیابی به داده های بانک اطلاعاتی بصورت مستقیم فراهم نموده است. بدین منظور ASP.NET 2.0 کنترلهای جدیدی را با قابلیت اتصال به پایگاه داده فراهم نموده است.

  • <asp:SqlDatasource> : این کنترل برای کارکردن با انواع پایگاه داده ها طراحی شده است.

  • <asp:ObjectDatasource> : زمانیکه از منطق N-Tier استفاده می نمایید لایه میانی ممکن است شئ پیچیده ای را برای کاربرد سطح presentation فراهم نماید. از این کنترل می توانید برای مجتمع ساختن شئ فراهم شده توسط لایه میانی با لایه Presentation استفاده نمایید.

  • <asp:AccessDatasource> : این کنترل برای کارکردن با پایگاه داده Access فراهم شده است.

  • <asp:XmlDatasource> : این کنترل برای مجتمع ساختن داده های xml با صفحه استفاده می شود. از آن می توان به عنوان منبع داده برای treeview یا menu استفاده نمود.

  • <asp:DataSetDatasource> : این کنترل به شما این امکان را می دهد که به راحتی یک XML و داده های مرتبط باهم سوئیچ نمایید.

  • <asp:SitemapDatasource> : این کنترل به کاربران اجازه می دهد در بین صفحات سایت رفت و آمد نمایند.

  • <asp:gridview> : در کنترل gridview هر ستون نماینده یک فیلد و هر سطر نماینده یک رکورد می باشد. شما می توانید gridview را به کنترل SqlDatasorce و یا هر منبع داده ای که واسط System.Collections.IEnumerable را پیاده سازی کرده باشد، متصل نمایید.
    <asp:detailsview> : این کنترل می تواند برای نمایش جزئیات ردیفهای gridview استفاده شود.

افزایش قابلیت کش کردن

در ASP.NET 2.0 قابلیت جدیدی برای امکان کش کردن قسمت هایی که با SQL Server کار می کنند فراهم شده است. در این امکان جدید می توان زمانیکه داده های بانک اطلاعاتی تغییر نمود کش کنترل را غیر معتبر کرد.

پشتیبانی از Device

ASP.NET قابلیت جدیدی را با عنوان adaptive rendering فراهم نموده است. با استفاده از این خصوصیت صفحات وب می توانند برحسب دستگاهی که نیاز به دسترسی به صفحه دارد markup مقتضی (HTML, XHTML یا XML) را منتشر نماید. این بدان معنی می باشد که ASP.NET 2.0 دارای تواناییMMIT بصورت built-in در هسته پلتفرم خود می باشد.

افزایش امنیت

یکی از نکات برجسته امنیتی در ASP.NET 2.0 امکان مشخص کردن نقشها (Roles) برای دسترسی به یک سری منابع خاص بمنظور تنظیم حقوق دسترسی کاربر میباشد. سیستم مدیریت نقش به شما این امکان ار می دهد که کاربران را دسته بندی نمایید. ASP.NET 2.0 می تواند بدین منظور از MS Access یا SQL Server و یا Windows برای ذخیره سازی اطلاعات مورد نیاز استفاده نماید.

برگرفته از سایت

http://www.c-sharpcorner.com/Longhorn/Whidbey/ASPNetWhidbeyFeatures.asp

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


ايجاد يك ارتباط ايمن با SQL Server در ASP.NET

نگهداري صريح رمزعبور و Hard Code نمودن آن در برنامه هاي کاربردي و وب سايتها قابل قبول نمي باشد. SQL Server داري امکاني با عنوان Trusted Connection مي باشد که از طريق آن اعتبار سنجي لازم براي دسترسي به منابع SQL Server از روي نام Login انجام مي شود....

نويسنده reza

تاريخ ارسال 1383/5/15

ايجاد يک ارتباط امن با SQL Server در ASP.NET

نگهداري صريح رمزعبور و Hard Code نمودن آن در برنامه هاي کاربردي و وب سايتها قابل قبول نمي باشد. SQL Server داري امکاني با عنوان Trusted Connection مي باشد که از طريق آن اعتبار سنجي لازم براي دسترسي به منابع SQL Server از روي نام Login انجام مي شود. در اين حالت هيچ رمز عبوري به SQL Server فرستاده نمي شود و تنها نام Login و يک Authentication Token به آن ارسال مي گردد. در صورتيکه شما خواسته باشيد از اين امکان در ASP.NET استفاده نماييد در پاره اي از موارد تا حدودي با مشکل مواجه خواهيد شد. زيرا کاربري که ASP.NET تحت حقوق دسترسي آن اجرا مي شود نقش تعيين کننده اي را ايفا مي کند. در حالت پيش فرض ASP.NET با استفاده از کاربر ASPNET در ماشين محلي اجرا مي گردد. در صورتيکه ASP.NET و SQL Server هر دو برروي يک ماشين اجرا شوند کار بسيار ساده مي باشد. در اين حالت بايد به کاربر ASPNET در SQL Server حقوق دسترسي و مجوزهاي لازمه اعطا گرديده و در نهايت در رشته Connection لازم است عبارت Integrated Security=SSPI يا Trusted_Connection=true بر حسب سبک رشته Connection در نظر گرفته شود.
مشکل زماني رخ مي دهد که ASP.NET و SQL Server برروي ماشينهاي جداگانه اي اجرا گردند که در واقع در اکثر موارد نيز چنين مي باشد. زيرا کاربر ASPNET در SQL Server قابل دسترسي نمي باشد.
پنج راه اصلي براي غلبه بر اين مشکل موجود مي باشد.

  • استفاده از IIS 6 در حالت Native Application

  • انطباق کاربر ASP.NET برروي IIS و SQL Server و مشخص کردن رمز عبور.

  • استفاده از جعل هويت (Impersonation) بمنظور تغيير کاربر ASP.NET.

  • کد کردن (Encrypt) رشته Connection و قرار دادن آن در رجيستري و فراموش کردن ارتباط امن!

  • تغيير کاربر ASP.NET به يک Domain User.

اجراي هر نوع سرويس وب به عنوان Domain User بسيار خطرناک مي باشد. زيرا در اين صورت هکرها با استفاده از حقوق دسترسي کاربر دامنه قابليت دسترسي به تمامي منابع داخل و خارج سرويس دهنده وب را دارا مي باشند.
کد کردن داده ها و دسترسي به آنها بطور کامل در مقاله شماره Microsoft Knowledge Base 329290 و مقاله Building Secure ASP.NET Applicartion در MSDN بررسي شده است.
هر دو حالت انطباق کاربر و جعل هويت نيازمند اين مي باشد که شما داري حسابهاي Mirror در IIS و SQL Server باشيد. ( در صورتيکه شما در يک محيط Active Directory و Domain قرار نداشته باشيد)

جعل هويت

جعل هويت به شما اين امکان را مي دهد که به ASP.NET بگوييد تحت عنوان يک کاربر بخصوص اجرا شود. برروي هر دو ماشين مورد نظر کاربري همنام و با رمز عبور مطمئن ايجاد نماييد. برروي سرويس دهنده IIS کاربر ايجاد شده بايد داراي توانايي اجرا به عنوان کاربر ASP.NET را دارا باشد (براي اطلاعات بيشتر مي توانيد به MSDN مراجعه نماييد). برروي سرويس دهنده SQL Server نيز کاربر مورد نظر بايد قابليت دسترسي به منابع مورد نظر از جمله بانک اطلاعاتي، جداول، ديدگاهها، روالهاي ذخيره شده و ... را داشته باشد.
اکنون شما مي بايست ASP.NET را بمنظور اجرا تحت عنوان اين کاربر پيکره بندي نماييد. دو راه حل بمنظور انجام اين عمل در پيش روي شما مي باشد. راه اول قرار دادن رمز عبور در فايل Web.Config (که راه نامطلوبي است) و دومين راه استفاده از ابزار IIS Administration همراه تنظيماتي در فايل Web.Config.
براي Hard Code کردن رمز عبور و نام کاربر فايل Web.Config را ويرايش کرده و حالت عنصر identity را بصورت زير به آن اضافه نماييد.

<system.web>
   ...
   <identity impersonate="true"
      userName="yourNewUsername"
      password="yourStrongPassword" />
   ...
</system.web>

اين حالت در واقع تمامي تلاش شما براي قرار ندادن رمز عبور در کد را بي نتيجه خواهد کرد.
در صورتيکه شما نياز داشته باشيد که رمز عبور را در کد قرار ندهد (که بايد همين طور باشد) مي توانيد از قرار دادن نام کاربر و رمز عبور در فايل Web.Config صرفه نظر کرده و تنظيمات مربوطه را در IIS انجام دهيد. اما نياز است شما عنصر idenity را بصورت زير در فايل Web.Config قرار دهيد.

<system.web>
   ...
   <identity impersonate="true" />
   ...
</system.web>

اکنون ابزار IIS Administration را باز کرده و روي شاخه اي که برنامه شما در آن قرار دارد کليک راست نماييد. پنجره خصوصيات را باز کرده و در برگه Directory Security دکمه Edit قسمت Autentication and access control را کليک نماييد. قسمت Enable anonymous access را تيک زده و نام کاربر و رمز عبور آنرا مشخص نماييد.

ويرايش محتوي پيش فرض

در صورتيکه شما با IIS 5 کار مي کنيد و انجام اين عمل ممکن است اثرات جانبي داشته باشد و يا شما داري چندين برنامه مي باشيد که تعيين کاربر براي تک تک آنها وقت گير مي باشد، در اين حالت مي توانيد مستقيما محتوي کاربر ASP.NET را تغيير دهيد. همانطور که قبلا ذکر شد ASP.NET تحت کاربر ASPNET اجرا مي گردد و اين کاربر مجوزهاي لازم را براي اجراي صفحات ASP.NET را دارا مي باشد. اين کاربر در زمان نصب Framework بطور خودکار ايجاد مي گردد و رمز عبور آن براي ما شناخته شده نيست. تنها عمل ممکن براي ما Rest کردن رمز عبور آن (فراموش نشود کاربر ASPNET را در SQL Server با همان رمز عبور ثبت نماييد) و سپس ويرايش فايل machine.config و اطلاع به Framework بمنظور استفاده از اين رمز عبور جديد. متاسفانه شما نياز است که رمز عبور را بصورت صريح در اين فايل ذکر نماييد. اين فايل در مسير زير قرار دارد.

c:\windows\microsoft.net\framework\versionNumber\config

بمنظور پيکره بندي مجدد و تعيين رمز عبور جديد عنصر processModel را در فايل فوق پيدا کرده و آنرا بصورت زير با جايگزيني هاي لازم تغيير دهيد.

<processmodel
   ...
   userName="ASPNET" password="ASPNETpassword"
   ...
/>

پس از انجام اين عمل IIS را راه اندازي مجدد نماييد.

IIS 6 در حالت محلي

آخرين راه و در واقع بهينه ترين راه استفاده از IIS 6 و اجراي برنامه هاي ASP.NET در حالت محلي مي باشد. IIS 6 به شما امکان ايجاد Application Pool را مي دهيد. يک Pool، کنترل کارايي، چرخه پروسه ها و مهمتر از همه امنيت لازم براي ايجاد ارتباط امن را فراهم مي کند. در اين حالت شما همانند حالت قبل نيازمند ايجاد يک کاربر برروي IIS و SQL Server مي باشيد. براي ايجاد يک Pool ابزار IIS Administration را فعال کرده برروي Application Pool کليک راست کرده و گزينه New Application Pool را انتخاب نماييد. نامي براي Pool خود انتخاب کرده و دکمه OK را کليک نماييد. سپس برروي نام Pool ايجاد شده راست کليک کرده و گزينه Properties را انتخاب نماييد. با انتخاب برگه Identity نام کاربر و رمز عبور آنرا مشخص نماييد. در ادامه شما نيازمند تغيير تنظيمات برنامه خود براي استفاده از Pool ايجاد شده مي باشد. بدين منظور برروي نام برنامه خود در IIS راست کليک کرده و گزينه Properties را انتخاب نماييد. در پنجره Properties برگه Home Directory را انتخاب کرده وسپس Application Pool آنرا مطابق Pool ايجاد شده تغيير دهيد.

تاثيرات جانبي

در استفاده از ارتباط امن با اثراتي جانبي مواجه مي باشيم. اگر هر ارتباط تحت کاربراني مجزا باز شده باشند در اين حالت ارتباطات ايجاد شده بين کاربران به اشتراک گذاشته نخواهند شد. اين عمل سرباري برروي IIS و SQL Server ايجاد خواهد کرد. ارتباط امن در مقايسه با حالت ديگر قدرت پردازشي بيشتري را طلب مي کند زيرا درخواست ها خارج از SQL Server و تحت نظارت NT انجام مي پذيرد. در صورتيکه شما از داخل يک دامنه اين اعمال را انجام دهيد سربار بيشتري برروي کنترل کننده هاي دامنه و SQL Server اعمال خواهد شد.

خلاصه

در واقع يک راه واحد براي ايجاد ارتباط امن با SQL Server در ASP.NET وجود ندارد. Microsoft راههاي مختلفي براي رسيدن به اين منظور فراهم آورده است و انتخاب بهترين راه براي برنامه شما بر عهده خود شما مي باشد.

برگرفته از سايت : http://idunno.org/dotNet/trustedConnections.aspx

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


استفاده از XP Theme در برنامه هاي کاربردي NET.

بطور پيش فرض برنامه هايي که در ويندوز XP و 2003 با زبانهاي برنامه نويسي NET. ايجاد مي گردند از Theme موجود استفاده نمي کنند و ظاهر آنها بصورت برنامه هاي کلاسيک ويندوز مي باشد. براي فعال ساختن اين موضوع ...

نويسنده reza

تاريخ ارسال 1383/5/17

استفاده از XP Theme در برنامه هاي کاربردي NET.

بطور پيش فرض برنامه هايي که در ويندوز XP و 2003 با زبانهاي برنامه نويسي NET. ايجاد مي گردند از Theme موجود استفاده نمي کنند و ظاهر آنها بصورت برنامه هاي کلاسيک ويندوز مي باشد. براي فعال ساختن اين موضوع نيازمند انجام چند کار بسيار ساده و کوچک مي باشيم.

  • فايلي با نام appname].exe.mainfest] در شاخه قرار گرفتن فايل اجرايي برنامه با محتويات زير ايجاد نماييد. (توجه داشته باشيد که فايل ايجاد شده بايد همنام فايل اجرايي برنامه بعلاوه پسوند mainfest. باشد.)
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion ="1.0">
   <assemblyIdentity version="1.0.0.0" processorArchitecture="X86"
       name="Microsoft.Winweb.MantaRay" type = "win32" />
   <description>.NET control deployment tool </description>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0" processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df" language ="*" />
      </dependentAssembly>
   </dependency>
</assembly>

  • فايل اجرايي برنامه را در محيط Visual Studio.NET با استفاده از گزينه Open File بارگذازي نماييد.
  • برروي فايل exe. کليک راست کرده و گزينه add resource را انتخاب نماييد.
  • در کارد ظاهر شده گزينه Import را انتخاب کنيد.
  • در فيلد Resource Type مقدار RT_MANIFEST را وارد نماييد.
  • در پنجره Properties مقدار فيلد ID را از 101 به 1 تغيير دهيد.
  • فايل exe. را ذخيره نماييد.

بمنظور پشتيباني از Theme موردنظر براي برخي از کنترل ها مي بايست مقدار خصوصيت FlatStyle کنترل برابر FlatStyle.System قرار گيرد.

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


اجراي همزمان چند عمل با استفاده از Thread ها در NET.

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

نويسنده persiangoogle

تاريخ ارسال 1383/5/19

Thread ها در دات نت

در ابتدا توضیح مختصری درباره Thread ها خواهید خواند و سپس نمنونه کدی به زبان سی شارپ .
Thread ها یکی از امکاناتی هستند که شما را قادر می سازند همزمان چند کار را با هم انجام دهید. البته Thread ها بسیار پیچیده تر از این حرف ها هستند ولی اگر هیچ اطلاعی از این بحث ندارید و فقط می خواهید هر چه زودتر در کدهایتان چند کار را همزمان انجام دهید به مثال زیر توجه کنید .

static void Main()
{
    class1 st = new class1 ();

در خط زیر می توانید به جای نام method1 و method2 نام متد های خود را بگذارید یا اینکه اگر تعداد بیشتری متد را می خواهید اجرا کنید فقط کافی است از خط زیر یک کپی دیگر بنویسید.

    System.Threading.Thread th1 = new System.Threading.Thread(new System.Threading.ThreadStart (st. method1));

    System.Threading.Thread th2 = new System.Threading.Thread(new System.Threading.ThreadStart(st. method2));

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

    th1.Start();
    th2.Start();

 }

در اينجا هم تعريف متد هاي method1 و method2 را كه در كلاس class1 كپسوله شده اند آورده ايم.

public class class1
{
    public class1 ()
    {
    }
    public void method1()
    {
        for (int i = 0; i < 999; i++)
        {
            // Do something
        }
    }

    public void method2()
    {
        for (int i = 0; i< 999999999; i++)
        {
            // Do something
        }
    }
}

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


ايجاد ارتباط TCP ميان سرويس دهنده و سرويس گيرنده توسط #C

در اين مقاله يک مثال کوچک و ساده در مورد چگونگي برقراري ارتباط بين سرويس دهنده و سرويس گيرنده با استفاده از پروتكل TCP مورد بررسي قرار مي گيرد.

نويسنده reza

تاريخ ارسال 1383/5/19

ايجاد ارتباط TCP ميان سرويس دهنده و سرويس گيرنده توسط #C

پروتکل Transmission Control Protocol) TCP) يک پروتکل جريان گرا، ارتباط گرا، قابل اعتماد و نظير به نظير مي باشد. ارتباط TPC همانند ارتباط تلفني مي باشد. به عنوان مثال شما (سرويس گيرنده) به منزل دوست خود (سرويس دهنده) زنگ مي زنيد. در صورتيکه دوست شما در منزل باشد تلفن را برداشته و با يکديگر شروع به صحبت مي کنيد (نظير به نظير، جريان گرا، قابل اعتماد) و در انتها شما و دوستتان گوشي تلفن را قطع کرده (ارتباط گرا) و به ارتباط خود خاتمه مي دهيد. به عنوان مثال پروتکل HTTP از TCP استفاده مي کند.TCP از IP به عنوان پروتکل شبکه استفاده مي کند. IP يک پروتکل datagram (بسته هاي داده) گرا و Best-Effort (بسته هاي داده بصورتي فرستاده مي شود که تحويل و صحت آن تضمين نمي گردد) مي باشد.

در اين مقاله يک مثال کوچک و ساده در مورد چگونگي برقراري ارتباط بين سرويس دهنده و سرويس گيرنده مورد بررسي قرار مي گيرد. اين مثال از دو بخش تشکيل شده است. بخش سرويس دهنده و بخش سرويس گيرنده.

کلاسهاي مورد نياز

در اين مثال تنها دو کلاس اصلي بکار برده شده است. در سمت سرويس گيرنده، از کلاس System.Net.Sockets.TcpClient و در سمت سرويس دهنده از کلاس System.Net.Sockets.TcpListener استفاده مي گردد. بطور کلي در سمت سرويس گيرنده يک TcpClient به سرويس دهنده متصل مي شود. سپس با يک کانالي (جريان) که به سرويس دهنده اختصاص داده شده است اعمال مربوطه انجام مي پذيرد.

// اتصال به سرويس دهنده 127.0.0.1:8080
TcpCleint client = new TcpClient("127.0.0.1", 8080);

// گرفتن کانال ارتباطي براي ردوبدل کردن داده ها
NetworkStream ns = client.GetStream();

// قطع ارتباط با سرويس دهنده
client.Close();

سمت سرويس دهنده شامل مراحلي بيشتري مي باشد، اما صورت کلي کد به همان صورت کد سرويس گيرنده شبيه مي باشد. ابتدا بايد يک درگاه محلي را به TcpListener اختصاص داد. در صورتيکه سرويس گيرنده به سرويس دهنده متصل شود به شما يک socket برگردانده مي شود. با استفاده از اين socket شما مي تواند يک کانال ارتباطي (جريان) ايجاد نماييد.

// برروي پورت 8080 listener ايجاد يک
TcpListener listener = new TcpListener(8080);
listener.Start();

// انتظار بمنظور دريافت درخواست از سمت سرويس گيرنده
Socket server = listener.AcceptSocket();

// ايجاد يک کانال براي ردوبدل کردن داده ها
NetworkStream ns = new NetworkStream(server);

// قطع ارتباط از سرويس گيرنده
server.Close();

قالب دستورات

در اين مثال دستورات با استفاده از <CRLF> (دستورات با Enter از هم جدا مي شوند) از يکديگر تميز داده مي شوند. در صورتيکه سرويس گيرنده دستور "GET" را اجرا نمايد پيغام "Hello World" براي او ارسال شده و در صورت ارسال دستور "EXIT" عبارت "BYE" براي سرويس گيرنده فرستاده شده و ارتباط قطع مي گردد.

سرويس دهنده

در دنياي واقعي سرويس دهنده از دو قسمت اصلي تشکيل مي شود. قسمت Functional Layer و ديگري Commad Processor. قسمت پردازشگر دستورات واسطي بين لايه ارتباطي و Functional Layer مي باشد. لايه ارتباطي درخواست خود را به لايه پردازشگر دستورات ارسال مي کند اين لايه درخواست را به لايه Functional ارسال کرده و پس از دريافت جواب از لايه Functional آنرا به لايه ارتباطي مي فرستد. سرويس دهنده ها معمولا به صورت سرويس هاي سيستم عامل اجرا مي شوند. در اين مثال سرويس دهنده ما تنها يک لايه داشته و به عنوان يک برنامه کنسول اجرا مي گردد.

Console.WriteLine("Intitializing Server ...");
TcpListener listener = new TcpListener(8080);
listener.Start();
Console.WriteLine("Server initialized, waiting for incomming connections ...");

Socket s = listener.AcceptSocket();
// ايجاد يک جريان براي ارتباط
NetworkStream ns = new NetworkStream(s);
StreamReader r = new StreamReader(ns);

listener برروي پورت 8080 آماده دريافت درخواست سرويس گيرنده ها مي باشد. متد AcceptSocket در زمان اتصال سرويس گيرنده يک socket را برمي گرداند. اين متد برنامه را تا زمان دريافت درخواست معلق مي کند. در صورت نياز مي توان از يک نخ براي اين منظور استفاده نمود. در ادامه کانال ارتباطي لازمه برقرار مي گردد و از کلاس StreamReader بمنظور دريافت داده ها از اين کانال استفاده مي شود. در اين قسمت فرمانهاي صادر شده از سوي سرويس دهنده بايد بررسي و پاسخ مورد نظر به آن داده شود.

bool loop = false;
while (!loop)
{
    // خواندن يک خط کامل
    string command = r.ReadLine();
    string result;
    Console.WriteLine("Executing remote commad: " + command);
    switch (command)
    {
        case "GET":
            result = "Hello World !";
            break;
        // خاتمه ارتباط
        case "EXIT":
            result = "BYE";
            loop = true;
            break;
        // دستور نامعتبر
        default:
            result = "ERROR";
            break;
    }
    if (result != null)
    {
         Console.WriteLine("Sending result: " + result);
         // به انتهاي پیغام پيغام CRLF افزودن
         result += "\r\n";
         // تبديل رشته به آرايه اي از بايتها
         Byte[] res = System.Text.Encoding.ASCII.GetBytes( < BR > result.ToCharArray());
         // ارسال نتيجه به سرويس گيرنده
         s.Send(res, res.Length, 0);
    }
}

در صورتيکه دستور GET در يافت شود سرويس دهنده پيغام Hello World را صادر کرده و ادامه دستورات پردازش مي گردد. در صورت صدور دستور ناشناخته نيز پردازش دستورات ادامه مي يابد. در صورت دريافت دستور EXIT پردازش دستورات خاتمه يافته و در ادامه ارتباط با سرويس گيرنده قطع مي شود.

Console.WriteLine("Clearing up server ...");
s.Close();
Console.Write("Press return to exit");
Console.ReadLine();

سرويس گيرنده

سرويس گيرنده تا حدودي از سرويس دهنده پيچيده تر مي باشد. سرويس گيرنده شامل دو قسمت مي باشد: واسط کاربر (که يک برنامه کنسول ساده است) و پردازشگر دستورات که شامل عناصر ارتباطي مي باشد. در ابتدا پردازشگر دستورات مورد بررسي قرار مي گيرد. براي اينکار ابتدا يک interface ايجاد مي کنيم. استفاده از interface قابليت انعطاف پذيري بيشتري در مورد استفاده از پروتکل هاي ديگر به شما مي دهد. در اين حالت سرويس گيرنده تنها اشياعي را مي پذيرد که واسط مورد نظر را پياده سازي کرده باشند. اين عمل باعث استقلال سرويس گيرنده از پروتکل ارتباطي مي گردد.

public interface CommandProcessor
{
    // يک دستور را اجرا کرده و حاصل را برمي گرداند
    // باشد پردازش دستورات بايد متوقف گردد false در صورتيکه خروجي آن
    bool Execute(string command, ref string result);
}

در ادامه يک کلاس با نام TCPClientCommandProcessor ايجاد مي گردد. اين کلاس واسط CommadProcessor را پياده سازي مي نمايد. اين کلاس شامل 3 متد و يک سازنده مي باشد. متد Connect وظيفه اتصال بر سرويس دهنده را برعهده دارد. بوسيله متد DisConnect ارتباط با سرويس دهنده قطع گشته و با متد Execute فرمانهاي مورد نظر به سرويس دهنده ارسال مي گردد.

public class TCPClientCommandProcessor : CommandProcessor
{
    // آدرس سرويس دهنده
    string host = null;
    // پورت سرويس دهنده
    private int port = -1;
    // واسط ارتباطي
    private TcpClient client = null;
    // جريان خروجي داده
    private NetworkStream outStream = null;
    // جريان ورودي داده
    private StreamReader inStream = null;

    public TCPClientCommandProcessor(string host, int port)
    {
        this.host = host;
        this.port = port;
        this.Connect();
    }

    // اتصال به سرويس دهنده
    public void Connect()
    {
        Console.WriteLine(String.Format("Connecting to {0}:{1} ...",
        this.host, this.port) );
        this.client = new TcpClient(this.host, this.port);
        this.outStream = this.client.GetStream();
        this.inStream = new StreamReader(this.outStream);
        Console.WriteLine(String.Format("Connected to {0}:{1}",
        this.host, this.port) );
    }

    // قطع ارتباط با سرويس دهنده
    public void DisConnect()
    {
        if (this.client != null)
        {
             this.client.Close();
             Console.WriteLine(String.Format("Connection closed: {0}:{1}",
             this.host, this.port) );
        }
    }

    // اجراي دستورات
    public bool Execute(string command, ref string result)
    {
        bool ret = true;
        command += "\r\n";
        Byte[] cmd = System.Text.Encoding.ASCII.GetBytes(
        command.ToCharArray() );
        // ارسال درخواست
        this.outStream.Write(cmd, 0, cmd.Length);
        // دريافت پيام
        result = this.inStream.ReadLine();
        ret = !result.Equals("BYE");
        return ret;
    }
}

واسط کاربر سرويس گيرنده

واسط کاربر سرويس گيرنده يک برنامه کنسول ساده مي باشد. در اين برنامه يک شئ از کلاس TCPClientCommandProcessor ايجاد شده و اعمال مربوطه انجام مي گردد.

Console.WriteLine("Initializing client ...");
TCPClientCommandProcessor proc = new
TCPClientCommandProcessor("127.0.0.1", 8080);

string result = "";
string cmd = null;
while (!result.Equals("BYE"))
{
    Console.Write("Command : ");
    cmd = Console.ReadLine();
    proc.Execute(cmd, ref result);
    Console.WriteLine(result);
}

Console.WriteLine("Closing connection...");
proc.DisConnect();
Console.Write("Press return to exit");
Console.ReadLine();

برگرفته ار کتاب C#.NET Web Developer's Guide انتشارات SYNGRESS

دريافت فايل هاي سورس اين مقاله

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


Password Hashing در #C

اگر شما بخواهيد كه كلمه رمزتان را به صورت معمولي در Database يا فايل ذخيره كنيد، در صورتيكه هكري بتواند به آن فايل يا Database دسترسي پيدا كند به راحتي مي تواند اين كلمات رمز را مشاهده و از آنها استفاده نمايد . بنابراين براي مخفي سازي كلمات رمز كاربران در Database مي توان يك مقدار درهم سازي شده از آن كلمه رمز ايجاد كرد و...

نويسنده mansoor

تاريخ ارسال 1383/5/20

Password Hashing در #C

ASP.NET روش مناسبي براي ايجاد رشته هاي Hash شده از مقادير ورودي كاربر تدارك ديده است . اگر شما بخواهيد كه كلمه رمزتان را به صورت معمولي در Database يا فايل ذخيره كنيد ؛ در صورتيكه هكري بتواند به آن فايل يا Database دسترسي پيدا كند به راحتي مي تواند به اين كلمات رمز دسترسي داشته باشد و از آنها استفاده نمايد . بنابراين براي مخفي سازي كلمات رمز كاربران در Database مي توان يك مقدار Hash شده از آن كلمه رمز ايجاد كرد و آن را در Database ذخيره نمود . فايده اين كار اين است كه حتي در صورتيكه فردي به اين مقدار Hash شده دسترسي پيدا كند باز نمي تواند از آن استفاده نمايد و به محتواي آن پي ببرد .همچنين اشكال اين روش اين است كه در صورتيكه كاربر كلمه رمز خود را فراموش كند بازيابي آن بسيار مشكل خواهد بود .

چگونگي اعتبارسنجي با استفاده از كلمه رمز درهم سازي شده

در شرايط معمول وقتي شما كلمه رمز را در Database به شكل واقعي آن ذخيره مي كيد ، شما مي توانيد به راحتي با پيداكردن كلمه رمز مربوط به آن نام كاربري در Database و مقايسه آن با كلمه رمز ورودي كاربر اعتبار اطلاعات ورودي را مشخص كنيد . بديهي است كه اعتبارسنجي با استفاده از كلمات رمز Hash شده كمي مشكل تر از اين روش معمول مي باشد . براي اين كار شما يك مقدار Hash شده از كلمه رمز ورودي كاربر بايد ايجاد نماييد و سپس باكلمه رمزHash شده اي كه قبلاً در Database ذخيره شده است مقايسه كنيد ، اگر هر دو رشته Hash شده با هم برابر باشند در اين صورت اعتبار كاربر تاييد مي شود .

براي مثال :

string strUserInputtedHashedPassword =
    FormsAuthentication.HashPasswordForStoringInConfigFile(tbPassword.Text, "sha1");

if (strUserInputtedHashedPassword == GetUsersHashedPasswordUsingUserName(tbUserName.Text))
{
     // sign-in successfull
}
else
{
     // sign-in failed
}

حال شما مي توانيد با استفاده از اين كد ها يك نمونه كلمات درهم سازي شده براي خود ايجاد نماييد:

protected TextBox tbPassword;
protected Literal liHashedPassword;

private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here
}

public void btnHash_Click(object sender, EventArgs e)
{
    if (tbPassword.Text.Length > 0)
    {
        string strHashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile  (tbPassword.Text, "sha1");
        liHashedPassword.Text = "Hashed Password is: " + strHashedPassword;
    }
}

به نمونه هاي زير توجه نماييد .

415AB40AE9B7CC4E66D6769CB2C08106E8293B48 == sha1
462 F4BAC142BBFCF47C11941AD76018DDD4DE1D8 == mansoor

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


نمايش صحيح فرمول هاي شيمي در DataGrid

در اين مقاله مي خواهيم نمايش صحيح فرمول هاي شيمي را در كنترل DataGrid نشان دهيم . يعني مي خواهيم ببينيم كه چگونه مي توان فرمولي كه در پايگاه داده به شكل CO2 ذخيره شده است را به شكل واقعي آن در فرم وب نمايش داد.

نويسنده mansoor

تاريخ ارسال 1383/5/20

نمايش صحيح فرمول هاي شيمي در DataGrid
در اين مقاله مي خواهيم نمايش صحيح فرمول هاي شيمي را در كنترل DataGrid نشان دهيم . يعني مي خواهيم ببينيم كه چگونه مي توان فرمولي كه در پايگاه داده به شكل CO2 ذخيره شده است را به شكل واقعي آن در فرم وب نمايش داد.
همان طور كه مي دانيد در HTML براي انديس گذاري از <sub>subscript</sub> استفاده مي گردد . در اين مقاله با چند خط كد كاري مي كنيم كه اين فرمت به صورت اتوماتيك بر روي داده هايي كه از پايگاه داده خوانده مي شوند و قصد نمايش آنها را در صفحه وب داريم اعمال شود .
داده ها در پايگاه داده به شكل زير ذخيره شده اند:

حال براي نمايش اين داده ها در كنترل وب DataGrid ، ابتدا يك كنترل DataGrid را بر روي فرم وب قرار دهيد .

<asp:DataGrid id="DataGrid1" AutogenerateColumns="false" runat="server">
   <Columns>
     <asp:TemplateColumn HeaderText="Chemical Formula">
     <ItemTemplate>
         <font face="Arial" size="3">
          <b> <%# GetProperFormat(DataBinder.Eval(Container.DataItem, "Formula").ToString()) %></b>
         </font>
     </ItemTemplate>
     </asp:TemplateColumn>
   </Columns>
</asp:DataGrid>

حال قطعه كد زير را در صفحه CodeBehind اين فرم بنويسيد .

C#

private void Page_Load(object sender, System.EventArgs e)
{
     // Put user code to initialize the page here
     if (!Page.IsPostBack )
     {
          BindData ();
     }
}

DataSet ds = new DataSet ();

void BindData()
{
    string sqlStmt = "Select * from ChemicalFormula ";
    string conString = "server=localhost;database=Northwind;uid=sa;pwd=;";
    SqlDataAdapter myda = new SqlDataAdapter(sqlStmt, conString);
    myda.Fill(ds);
    DataGrid1.DataSource = ds;
    DataGrid1.DataBind();
}

protected string GetProperFormat(string fldval)
{
    string strval = "";

    // Navigate through every character of the fldval
    for (int i = 0; i < fldval.Length ; i++)
    {
         // Check for IF the value is numeric True/False
         if (Char.IsNumber(fldval[i]))
         {
               strval = strval + "<sub>" + fldval[i] + "</sub>";
         }
         else
         {
               strval = strval + fldval[i];
         }
    }
    return strval;
}

VB.NET

Private ds As DataSet = New DataSet()

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load

    'Put user code to initialize the page here
    If Not Page.IsPostBack Then
         binddata()
    End If

End Sub

Sub binddata()
    Dim sqlStmt As String = "Select * from ChemicalFormula "
    Dim conString As String = "server=localhost;database=Northwind;uid=sa;pwd=;"
    Dim myda As SqlDataAdapter = New SqlDataAdapter(sqlStmt, conString)
    myda.Fill(ds)
    DataGrid1.DataSource = ds
    DataGrid1.DataBind()
End Sub

Function GetProperFormat(ByVal fldval As String)
    Dim FieldsValues() As String = Regex.Split(fldval, "")
    Dim i As Integer
    Dim strval As String
    'Navigate through every character of the FieldValue
    For i = 0 To FieldsValues.Length - 1
       'Check for IF the value is numeric True/False
       If IsNumeric(FieldsValues(i)) Then
           strval = strval & "<sub>" & FieldsValues(i) & "</sub>"
       Else
           strval = strval & FieldsValues(i)
       End If
    Next
    Return strval
End Function

متد BindData : از اين متد براي دستكاري ديتاست و نسبت دادن مقادير به كنترل مربوطه استفاده شده است .
متد GetProperFormat : از اين متد براي نمايش صحيح فرمول استفاده مي شود .
در نهايت خروجي كه اين برنامه ايجاد خواهد كرد به شكل زير خواهد بود .

منبع : www.c-sharpcorner.com

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


رمز نگاري در NET. (قسمت اول)

در اين مقاله قصد داريم بطور خلاصه نگاهي داشته باشيم بر رمزنگاري و كارهايي كه در .NET Framework براي حمايت از رمزنگاري انجام شده است .

نويسنده mansoor

تاريخ ارسال 1383/6/16

رمز نگاري در .NET ( قسمت اول )

در اين مقاله قصد داريم بطور خلاصه نگاهي داشته باشيم بر رمزنگاري و كارهايي كه در .NET Framework براي حمايت از رمزنگاري انجام شده است . در اينجا كار را با معرفي رمزنگاري شروع خواهيم كرد و سپس به بررسي روش هاي مختلف اين كار مي پردازيم و در قسمت دوم به بررسي الگوريتم ها و شي هاي مختلفي كه در .NET براي اين كار تدارك ديده شده است مي پردازيم .

رمزنگاري

ما اغلب بدون آنكه بدانيم از رمزنگاري استفاده مي كنيم براي مثال ، زماني را به ياد آوريد كه سعي مي كنيد با استفاده از علائم پيامي را به دوستتان برسانيد ، در حاليكه معني علامت ها را فقط شما و دوستتان مي دانيد و يا نوشته اي كه به گونه اي نوشته شده است كه فقط خودتان و كساني كه شما را مي شناسند مي توانند بخوانند ؛ بنابراين همه ما در زندگي از رمزنگاري استفاده كرده ايم و اين كار جديدي نيست .
رمزنگاري دانش بهم ريختن كاراكترهاي بامعني براي ايجاد رشته اي بي معني براي كساني كه نبايد به متن و داده اصلي دسترسي داشته باشند مي باشد . دانش رمزنگاري سال هاست كه وجود دارد ، حتي قبل از بوجود آمدن كامپيوترها . رمزنگاري ، در طول ساليان دراز هنري بوده كه توسط افراد مختلف به كار برده مي شده است و تكنيك هاي مختلفي براي ايجاد امنيت اطلاعات از آنها باقي مانده است . در بيست سال گذشته اين هنر تبديل به دانش فراگيري شده است . با ورود كامپيوترها علم توانسته رمزهاي نسبتاً غير قابل شكستي ايجاد كند .
رمزنگاري به عنوان يكي از پيچيده ترين جنبه هاي برنامه نويسي توسط برنامه نويسان در نظر گرفته مي شود . استفاده از الگوريتم هاي رمزنگاري به مانند بازي كودكانه اي كه هر كسي بتواند انجام دهد نمي باشد ؛ بلكه به دانش سطح بالايي از رياضيات نياز دارد . خوشبختانه در MICROSOFT .NET كلاس هاي جديدي ايجاد شده كه اين الگوريتم هاي پيچيده و مشكل را به پروپرتي ها و متد هاي سهل الاستفاده اي براي كاربران تبديل كرده است . اين مقاله نگاه كلي بر روش هاي رمزنگاري تدارك ديده شده توسط .NET Framework خواهد داشت .
در ابتدا به معرفي اصطلاحات فني بكار برده شده در رمزنگاري مي پردازيم :
• PlainText يا ClearText : به داده هايي كه بدون وجود معيار خاصي بتوان آنها را خواند و فهميد PlainText مي گويند .
• Encryption ( رمز بندي ) : به روش تغيير شكل دادن PlainText به فرمي كه مفهوم آن مشخص نباشد رمزبندي اطلاعات مي گويند .
• Key (كليد ) : كليد رشته اي از بيت ها مي باشد كه براي رمزنگاري و رمزگشايي اطلاعاتي كه بايد انتقال يابد استفاده مي شود . اين رشته به صورت مجموعه اي از عددها / كاراكترها مي باشد كه به صورت تصادفي توليد مي شود تا بوسيله آن بتوان اطلاعات را رمزنگاري / رمزگشايي نمود .

انواع رمزنگاري

پس از آشنايي با واژگان فني ، اجازه دهيد تا با انواع رمزنگاري آشنا شويم . دو روش براي رمزنگاري وجود دارد : رمزنگاري با استفاده از كليد خصوصي و رمزنگاري با استفاده از كليد عمومي .
رمزنگاري با استفاده از كليد خصوصي

رمزنگاري با استفاده از كليد خصوصي ، تا قبل از ظهور رمزنگاري با استفاده از كليد عمومي در سال 1976 تنها روش مرسوم براي اينكار بوده است . امپراتوراني همچون ژوليس سزار از اين روش براي انتقال پيام هاي رمز استفاده مي كرده اند . در اين روش نياز است كه طرفين ارتباط از يك كليد مشترك استفاده كنند كه همان كليد خصوصي مي باشد . در روش كليد خصوصي، شما براي به رمز درآوردن پيامتان از يك كليد كه فقط شما از آن اطلاع داريد استفاده مي كنيد و براي رمزگشايي پيام نيز به همان كليد نياز مي باشد . استفاده از روش كليد خصوصي تنها هنگامي كه كليد رمز محرمانه باشد موثر مي باشد . با وجود اين ضعف باطني وليكن براي ايجاد و اجراي اين روش منابع زيادي مورد نياز نيست و كار نسبتاً ساده اي مي باشد .
اجازه دهيد مثالي را بيان كنم – در نظر بگيريد كه ژوليس سزار مي خواهد با استفاده از كليد خصوصي پيام محرمانه اي را به فرماندهان ارتش خود برساند ؛ براي اينكه فرماندهان بتوانند پيام او را رمزگشايي كنند نياز است تا كليد خصوصي را بدانند ؛ بنابراين لازم است كه ژوليس كليد خصوصي را نيز برايشان بفرستد . اما اگر اين كليد و رمز آن به دست دشمنان سزار بيفتد ، ديگر پيام امنيت خود را از دست مي دهد . علاوه بر اين، اگر فرمانده كليد خصوصي را به افسر زيردست خود بگويد او نيز مي تواند پيام را رمزگشايي نمايد .

رمزنگاري با استفاده از كليد عمومي

رمزنگاري با كليد عمومي بر اين اساس بنا شده است كه فرستنده و گيرنده پيام هر كدام كليد خصوصي خواهند داشت كه فقط خودشان مي دانند و يك كليد عمومي وجود دارد كه هر كسي مي تواند آن را بداند . هر فرآيند رمزنگاري /رمزگشايي حداقل به يك كليد عمومي و يك كليد خصوصي نياز دارد ، كه هر كدام به هم با قوانين رياضي مرتبط هستند . در اين صورت پيامي را كه توسط كليد عمومي به رمز در آورده شده باشد فقط با استفاده از كليد خصوصي مرتبط به آن ، مي توان رمزگشايي كرد .
در اينجا به بررسي نمونه اي مي پردازيم – قبل از اينكه ژوليس پيامي براي فرمانده سپاهش بفرستد ، او نياز دارد كه جفت كليد خصوصي و عمومي را ايجاد كند . بنابراين فرمانده آزادانه مي تواند كليد عمومي را در بين افراد زيردستش پخش كند ، اما كليد خصوصي را نزد خود نگه مي دارد . هنگامي كه ژوليس مي خواهد پيامي براي فرمانده سپاه بفرستد ، از كليد عمومي براي رمزنگاري پيام استفاده مي كند و سپس اين پيام را مي فرستد . در اين مورد او تنها كسي است كه مي تواند پيام را رمزگشايي كند . از آنجايي كه جفت كليد به اين صورت عمل مي كنند كه تنها پيام هايي كه با كليد عمومي رمزنگاري شده باشند را مي توان با كليد خصوصي رمزگشايي كرد بنابراين ديگر نيازي به انتقال كليد هاي محرمانه نمي باشد . به اين ترتيب خطر لو رفتن كليد از بين مي رود .
عكس اين عمل هم به خوبي انجام مي شود . فرض كنيد كه فرمانده پيامي را كه توسط كليد خصوصي اش رمزنگاري شده است را براي ژوليس بفرستد .در اين صورت ژوليس با استفاده از كليد عمومي مي تواند پيام را رمزگشايي كند .اما مي دانيم كه كليد عمومي محرمانه نيست و هر كسي مي تواند آن را داشته باشد . به هر حال استفاده از اين متد دستكاري نشدن پيام را توسط ديگران تضمين مي كند چون در صورت هر گونه تغييري ديگر نمي توان پيام را با استفاده از كليد عمومي رمزگشايي كرد.

ادامه دارد...

مرجع :

http://www.c-sharpcorner.com/Code/2004/July/CryptographyInDotNET.asp

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


رمز نگاري در NET. (قسمت دوم)

در اين مقاله قصد داريم بطور خلاصه نگاهي داشته باشيم بر رمزنگاري و كارهايي كه در .NET Framework براي حمايت از رمزنگاري انجام شده است .

نويسنده mansoor

تاريخ ارسال 1383/6/16

NET. و رمز نگاري

.NET مجموعه اي از اشيا را براي رمزنگاري تدارك ديده است كه الگوريتم هاي مشهور و پركاربردي همچون hashing ( درهم سازي ) ، encryption ( رمزبندي ) و توليد امضاي ديجيتال را حمايت مي كنند . اين اشيا طوري طراحي شده اند كه بتوان با تركيب اين توانايي هاي ابتدايي اعمال پيچيده تري مانند امضا و رمزنگاري مستندات را به راحتي انجام داد . اشيا رمزنگاري در .NET براي پشتيباني از سرويس هاي داخلي استفاده مي شوند اما همچنين براي برنامه نويساني كه به حمايت هاي رمزنگاري نياز دارند نيز در دسترس مي باشند . در .NET Framework بسياري از اين الگوريتم ها و اشيا ي استاندارد رمزنگاري پياده سازي شده است و قابل استفاده مي باشند . مانند دسترسي آماده به قابليت هاي ساده تاييد اعتبار در .NET Framework ؛ اشياي اصلي رمزنگاري نيز همچنين به سادگي از طريق استفاده از كتابخانه كدهاي مديريت شده اي كه بر پايه جريان داده ( Stream Based ) مي باشد امكان پذير مي باشد . اين سرويس هاي رمزنگاري در فضاي نام System.Security.Cryptography در .NET Framework تدارك ديده شده اند . الگوريتم هاي پياده سازي شده در اين فضاي نام شامل موارد زير مي باشد :

• الگوريتم هاي رمزنگاري با استفاده از كليد عمومي ( نامتقارن ) RSA و DSA : الگوريتم هاي نا متقارن بر روي يك بافر ثابت عمليات انجام مي دهند . آنها از كليد عمومي براي رمزنگاري / رمزگشايي استفاده مي كنند . از الگوريتم RSA مي توان به عنوان يك الگوريتم نامتقارن نام برد كه RSA حروف ابتدايي نام سه مخترع آن يعني Rivest ،Shamir ، Adleman مي باشد . اين يك الگوريتم كليد عمومي مشهور مي باشد كه از نسخه استاندارد غير رسمي آن براي امضاي ديجيتال و همچنين رمزنگاري به خوبي مي توان استفاده كرد . DSA_CSP يك پياده سازي براي الگوريتم امضاي ديجيتال DSA ( Digital Signature Algorithm ) مي باشد ؛ اين يك الگوريتم كليد عمومي مي باشد كه از آن مي توان براي ايجاد و تاييد امضاي ديجيتال استفاده كرد .

• الگوريتم هاي رمزنگاري با استفاده از كليد خصوصي ( متقارن ) RSA ، DES و TripleDES : از الگوريتم هاي متفارن براي تغيير دادن بافرهاي با طول متغير و انجام يك عمل بر روي داده هاي ورودي تكرار شونده استفاده مي شود . در اين روش ها از يك كليد محرمانه براي رمزنگاري و رمزگشايي داده استفاده مي كنند . استاندارد رمزنگاري داده DES ( Data Encryption Standard )يك استاندارد گسترده جهاني براي رمزنگاري داده مي باشد كه در ابتداي دهه 1970 منتشر شد . اين مشهورترين الگوريتم رمزنگاري مي باشد كه با استفاده از كلاس DES_CSP پياده سازي شده است . اين كلاس جرياني را ارائه مي كند كه شما آن را در داده قرار مي دهيد و آن با استفاده از يك كليد واحد عمليات رمزنگاري / رمزگشايي را انجام مي دهد . الگوريتم TripleDES سه بار بر روي يك بلوك داده با استفاده از يك كليد عملياتي را انجام مي دهد . RC2 كه سر نام Rivest Cipher يا Ron’s Code (Rivest و Ron نام مخترعان اين الگوريتم مي باشد ) مي باشد . RC2 يك الگوريتم متقارن مي باشد كه با كليد با سايز متفاوت كار مي كند .اين روش مانند بسياري از روش هاي ديگر رمزنگاري دز .NET مي باشد كه ابتدا يك بلوك داده محرمانه ايجاد مي كند و سپس بر روي آن عملياتش را انجام مي دهد كه اين روش در مقابل الگوريتم هاي جريان داده محرمانه ساز قرار دارد .

• الگوريتم هاي درهم سازي MD5 و SHA1: يك الگوريتم درهم سازي يك طرفه مي باشد كه داده اي با طول متغير را از ورودي مي گيرد و يك مقدار Hash ، 128 بيتي توليد مي كند. الگوريتم SHA1 نيز يك روش Hashing مي باشد كه يك مقدار 160 بيتي Hash ايجاد مي كند كه از مقداري كه MD5 توليد مي كند طولاني تر است .

Cryptographic Service Provider (CSP) چيست ؟

CSP يك موجوديت براي اجراي محاسبات رمزنگاري مي باشد . كلاس CSP از كلاس هاي متناظر پايه مشتق شده است و راه حل هايي را براي يك الگوريتم مشخص پياده سازي مي كند . براي مثال، كلاس DESCryptoServiceProvider از كلاس DES مشتق شده است و استاندارد رمزنگاري ديجيتال را پياده سازي كرده است . شما مي توانيد هم از كلاس هاي تدارك ديده شده و هم از راه حل هاي خودتان استفاده نماييد .

از كدام الگوريتم استفاده كنيم ؟

در اينجا به ارائه يك راهبرد عمومي براي كمك در تصميم گيري در مورد استفاده از روش هاي مختلف رمزنگاري مي پردازيم .
الگوريتم هاي متقارن يا كليد خصوصي الگوريتم هاي خيلي سريعي هستند كه براي رمزنگاري جريان هاي بزرگ داده بسيار مفيد مي باشند . از اين الگوريتم ها هم براي رمزنگاري و هم رمزگشايي استفاده مي شود . اين روش ها با آنكه بطور منصفانه اي امن مي باشند ولي در صورت وجود وقت كافي كاملاً قابل شكستن مي باشند . به عنوان مثال يك شخص مي تواند با انجام يك جستجو بر روي تركيب هاي مشخصي از مقادير به كلمه رمز دست يابد . از آنجايي كه هر كدام از اين الگوريتم ها از يك كليد با طول ثابت يا كاراكترهاي ASCII استفاده مي كنند بنابراين يك برنامه رمزياب مي تواند با امتحان كردن تركيب هاي متفاوت در نهايت به يك مقدار رمز دست يابد . يكي از استفاده هاي معمول از اين نوع الگوريتم ها براي ذخيره و بازيابي رشته هاي ارتباطي به پايگاه داده مي باشد .

الگوريتم هاي نامتقارن يا كليد عمومي به سرعت الگوريتم هاي متقارن عمل نمي كنند . اما شكستن آنها بسيار مشكل تر مي باشد . اين الگوريتم ها از دو كليد ، يكي خصوصي و ديگري عمومي استفاده مي كنند . از كليد عمومي براي به رمز در آوردن پيام و از كليد خصوصي فقط براي رمزگشايي پيام استفاده مي شود . كليدهاي خصوصي و عمومي با قوانين رياضي به هم پيوند خورده اند و بنابراين براي انجام موفقيت آميز عمليلت رمزنگاري به هر دوي اين كليد ها نياز است . الگوريتم هاي نامتقارن به خاطر كاهش كارآيي خيلي براي استفاده همراه مقادير زياد داده مناسب نمي باشند . يكي از استفاده هاي معمول الگوريتم هاي نامتقارن در به رمز درآوردن و انتقال يك كليد رمز متقارن به بخش ديگر و آغاز مسير انتقال اطلاعات مي باشد و سپس از الگوريتم هاي متقارن براي ارسال پيام ها در مسيري آزاد و امن استفاده مي شود .

مقادير درهم سازي شده هنگامي استفاده مي شود كه شما به هيچ وجه نمي خواهيد مقادير اصلي بازيابي شوند و يا كسي به راحتي بتواند آن را كشف كند. درهم سازي بر روي هز زشته اي با طول دلخواه انجام مي شود . كه حاصل آن مجموعه اي ثابت از بايت ها مي باشد . از اين روش مي توان بر روي مقادير كوچكي از داده مانند كلمات رمز استفاده كرد . اگر كاربر يك كلمه رمز را در يك صفحه ورودي امن وارد كند برنامه مي تواند اين مقدار را Hash كرده و در پايگاه داده نگهداري كند . حتي اگر اين پايگاه داده نيز هك شود ، از آنجايي كه اين كلمه رمز به صورت Hash شده ذخيره شده است بنابراين ديگر كسي نمي تواند به مقدار واقعي آن دسترسي پيدا كند . وقتيكه كاربر براي ورود به سيستم اقدام مي كند و كلمه رمز خود را وارد مي كند اين كلمه Hash مي شود و با كلمه رمز Hash شده اي كه در پايگاه داده نگهداري مي شود مقايسه مي شود و در صورتي كه برابر باشند تاييد و وارد سيستم مي گردد .

حال پس از اينكه با الگوريتم هاي مختلف رمزنگاري تاحدودي آشنا شديد اجازه دهيد تا به بررسي يك مثال از رمزنگاري و رمزگشايي فابل ها با استفاده از فضاي نام System.Security.Cryptography بپردازيم . در اين مثال از روش مديريت شده ريجنديل (Rijndeal ) استفاده شده است . كلاس مديريت شده Rijndeal از نسخه مديريت شده الگوريتم ريجنديل استفاده مي كند . اين كلاس غير قابل ارث بري مي باشد . اين كلاس در فضاي نام زير قرار دارد .

System.Object
System.Security.Cryptography.SymmetricAlgorithm
System.Security.Cryptography.Rijndael
System.Security.Cryptography.RijndaelManaged

كد اين نمونه به صورت زير مي باشد .

// Encrypting and decrypting files using the Rijndael Managed
// encryption method.
using System;
using System.IO;
using System.Security.Cryptography;

class CryptoEx
{
    public static void Main(string[] args)
    {
        if (args.Length != 1)
        {
            Console.WriteLine("FileName Not Entered. Specify a
               filename to encrypt.");
            return;
        }

        string file = args[0];
        string tempfile = Path.GetTempFileName();

        // Open the file to read
        FileStream fsIn  = File.Open(file,FileMode.Open,FileAccess.Read);
        FileStream fsOut =
             File.Open(tempfile, FileMode.Open,FileAccess.Write);

        // Create an instance and calling the CreateEncryptor method which
        // creates a symmetric encryptor object

        SymmetricAlgorithm symm = new RijndaelManaged();
        ICryptoTransform transform = symm.CreateEncryptor();
        CryptoStream cstream =
             new CryptoStream(fsOut,transform,CryptoStreamMode.Write);

        BinaryReader br = new BinaryReader(fsIn);

        cstream.Write(br.ReadBytes((int)fsIn.Length), 0, (int)fsIn.Length);

        cstream.FlushFinalBlock();
        cstream.Close();
        fsIn.Close();
        fsOut.Close();

        Console.WriteLine("Created Encrypted File {0}", tempfile);

        fsIn = File.Open(tempfile,FileMode.Open,FileAccess.Read);
        transform = symm.CreateDecryptor();
        cstream = new CryptoStream(fsIn,transform,CryptoStreamMode.Read);

        StreamReader sr = new StreamReader(cstream);
        Console.WriteLine("Decrypted the File: " + sr.ReadToEnd());
        fsIn.Close();
}

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


تبديل فايل Text به Image

در این مقاله چگونگی تبدیل یک فایل به فرمت Text را به فرمت Image (مانند Jpeg، Gif و ...) یاد خواهید گرفت

نويسنده admin

تاريخ ارسال 1383/6/22

تبدیل فایل Text به Image

در این مقاله چگونگی تبدیل یک فایل به فرمت Text را به فرمت Image (Jpeg، Gif و ...) یاد خواهید گرفت. این مطلب کاربردهای مختلفی دارد. آیا تا به حال در فرم عضویت بعضی سایت ها دیده اید که یک کلمه به صورت Random بر روی صفحه ظاهر می شود و شما باید آن کلمه را در یک TextBox وارد کنید؟ شاید هنوز کاربرد این تکنیک را ندانید. این تکنیک به منظور جلوگیری از ساخت Username های نامعتبر توسط برنامه های اتوماتیک انجام می شود. برنامه های اتوماتیک نمی توانند عکسی که به طور Random روی صفحه نمایش داده می شود را پردازش و تبدیل به یک رشته بکنند. در این موارد، شما می توانید یک کلمه را به صورت Random در برنامه تان ایجاد و آن را تبدیل به یک Image نمایید. البته تبدیل فایل های Text به Image کاربردهای دیگری نیز دارد. به عنوان مثالی دیگر، در بعضی موارد لازم است که خروجی یک Table یا گزارش از Database را به صورت Image ذخیره کنید.

خوب! کار را شروع کنیم...

فرض کنید که فایل Text ای به نام “MyFile.txt” داریم و می خواهیم آن را به “MyFile.jpeg” تبدیل نماییم. ابتدا باید محتویات فایل “MyFile.txt” را خوانده و در یک رشته قرار دهید. قبل از شروع، فضاهای نامی مورد استفاده را به برنامه ضمیمه کنید:

C#

using System.IO;
using System.Drawing;

VB.NET

Imports System.IO
Imports System.Drawing

حال، با استفاده از کلاس StreamReader محتویات فایل Text را می خوانیم:

C#

StreamReader sr = new StreamReader("MyFile.txt");
string str = sr.ReadToEnd();
sr.Close();

VB.NET

Dim sr As New StreamReader(“MyFile.txt”)
Dim str As String
str = sr.ReadToEnd()
sr.Close()

پس از این مرحله، رشته str محتویات فایل “MyFile.txt” را در بر می گیرد. (کلیه Whitespace ها و Newline ها حفظ می شوند.)

اکنون، باید یک object از کلاس Bitmap، که برای کار با فایل های گرافیکی به کار می رود، بسازیم.

C#

Bitmap bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb);

VB.NET

Dim bitmap As New Bitmap(800, 600, PixelFormat.Format32bppArgb);

800 طول عکس و 600 عرض آن است. آرگومان سوم، PixelFormat.Format32bppArgb نوع پیکسل های عکس ما را مشخص می کند. در این مورد، یعنی هر پیکسل 32 بیت است و از رنگ های ARGB پشتیبانی می کند.

A = Alpha یا Transparency (میزان شفافیت)
R = Red
G = Green
B = Blue

شما می توانید در صورت لزوم، ابعاد و نوع پیکسل دیگری برای عکس مورد نظرتان انتخاب کنید. PixelFormat مقادیر مختلفی برای انتخاب نوع پیکسل دارد که می توانید جزئیات بیشتر آن را در MSDN بیابید.

توجه: کلاس Bitmap را با عکس های فرمت Bitmap اشتباه نکنید! این کلاس می تواند به هر نوع عکسی، از جمله Gif، Jpeg، Bitmap، Png و ... اشاره کند.

پس از ساخت Bitmap، باید توسط متد ()Graphics.FromImage یک شیء گرافیکی برای نوشتن یا ترسیم روی Bitmap تهیه کنیم. کلاس Graphics در فضای نامی System.Drawing قرار دارد و از آن می توان برای انعکاس هر چیزی (متن، شکل گرافیکی و یا تصویر) بر روی فضایی که به آن اشاره می کند، استفاده نمود. توجه داشته باشید که نمی توانید مستقیماً از روی کلاس Graphics یک object بسازید. برای تهیه یک object از نوع Graphics، باید از یکی از متدهای Static (در #C) و یا Shared آن (در VB.NET) استفاده کنید. این متدها عبارتند از:

Graphics.FromHdc()
Graphics.FromHdcInternal()
Graphics.FromHwnd()
Graphics.FromHwndInternal()
Graphics.FromImage()

در این مثال، ما از متد آخری ()Graphics.FromImage برای تهیه یک object گرافیکی که به فایل MyFile.jpeg اشاره می کند، استفاده می کنیم. جزئیات سایر این متدها را می توانید در MSDN بخوانید.

C#

Graphics grfx = Graphics.FromImage(bitmap);

VB.NET

Dim grfx As New Graphics
Grfx = Graphics.FromImage(bitmap)

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

DrawImage()
DrawString()
DrawRectangle()
DrawPolygon()
DrawElipse()
.
.
.
FillRectangle()
FillPolygon()
FillElipse()
.
.
.

اکنون، با استفاده از متد ()DrawString رشته ای که از فایل “MyFile.txt” خواندیم را بر روی این object ترسیم می کنیم:

C#

grfx.FillRectangle(Brushes.White, 0, 0, 800, 600);
grfx.DrawString(str, new Font("Tahoma", 10), Brushes.Black, 0, 0);

VB.NET

Dim font As New Font(“Tahoma”, 10)
grfx.FillRectangle(Brushes.White, 0, 0, 800, 600)
grfx.DrawString(str, font, Brushes.Black, 0, 0)

ذکر چند نکته درباره تکه کد بالا ضروری به نظر می رسد:

1- ابتدا، با استفاده از متد FillRectangle() ، Background تصویر را با رنگ سفید رنگ می کنیم. آرگومان اول این متد، یک Brush (قلم مو) است که در اینجا ما Brushes.White را به عنوان یک قلم موی سفید ساده مشخص کرده ایم. Brushes یک کلاس است و White یک Property از نوع Static (در #C) و یا Shared (در VB.NET) است. آرگومان های بعدی این متد، به ترتیب عبارتند از x، y، width و height. با مقادیری که ما به جای این آرگومان ها قرار دادیم، کل تصویر رنگ می شود.

2- پس از اینکه Background تصویر را با رنگ سفید رنگ کردیم، متن مورد نظر را با متد ()DrawString بر روی تصویر می نویسیم. آرگومان اول این متد، رشته مورد نظر، آرگومان دوم آن، فونت مورد نظر، آرگومان سوم، قلم موی مورد نظر و 2 آرگومان آخر، x و y شروع متن را مشخص می کنند.

شما می توانید متن مورد نظر را با هر فونت، سایز و رنگی که دوست دارید بر روی تصویر منعکس کنید.

در پایان، کافی است که Bitmap ای که درست کردید را با استفاده از متد Save() بر روی دیسک ذخیره کنید:

C#

bitmap.Save("MyFile.jpeg", ImageFormat.Jpeg);

VB.NET

bitmap.Save("MyFile.jpeg", ImageFormat.Jpeg)

کل کدی که برای تبدیل یک فایل Text به Image باید بنویسید، در زیر آمده است.

C#

// Read the text file and save its content to str
StreamReader sr = new StreamReader("MyFile.txt");
string str = sr.ReadToEnd();
sr.Close();

// Create a bitmap
Bitmap bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb);

// Get a Graphics object from the bitmap
Graphics grfx = Graphics.FromImage(bitmap);

// Write the str to the bitmap
grfx.FillRectangle(Brushes.White, 0, 0, 800, 600);
grfx.DrawString(str, new Font("Tahoma", 10), Brushes.Black, 0, 0);

// Save the bitmap to disk
bitmap.Save("MyFile.jpeg", ImageFormat.Jpeg);

VB.NET

' Read the text file and save its content to str
Dim sr As New StreamReader(“MyFile.txt”)
Dim str As String
str = sr.ReadToEnd()
sr.Close()

' Create a bitmap
Dim bitmap As New Bitmap(800, 600, PixelFormat.Format32bppArgb);

' Get a Graphics object from the bitmap
Dim grfx As New Graphics
Grfx = Graphics.FromImage(bitmap)

' Write the str to the bitmap
Dim font As New Font(“Tahoma”, 10)
grfx.FillRectangle(Brushes.White, 0, 0, 800, 600)
grfx.DrawString(str, font, Brushes.Black, 0, 0)

' Save the bitmap to disk
bitmap.Save("MyFile.jpeg", ImageFormat.Jpeg);

امبدوارم که ابن مقاله مفید واقع شده باشد. لطفاً در صورتی که می خواهید این مقاله را در سایت خود قرار دهید، نام نویسنده و آدرس سایت ما را نیز ذکر کنید.

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


طرز ساخت يك TextBox كه فقط مقادير عددي را قبول مي كند

TextBox هايي كه فقط مقادير عددي را قبول مي كنند، برنامه شما را Safe تر كرده و امكان Bug هاي پيش بيني نشده را كاهش مي دهند. در اين مقاله، روش ساخت اينگونه TextBox ها را در Windows Forms خواهيم ديد.

نويسنده admin

تاريخ ارسال 1383/7/3

در اين مقاله مي خواهيم نحوه ساخت TextBox هايي كه فقط كاراكترهاي عددي را قبول مي كنند(Numeric TextBox) را ياد بگيريم. توجه داشته باشيد كه اين مقاله مربوط به مبحث Windows Forms است و در ASP.NET نمي توانيد از اين روش استفاده كنيد.

استفاده از TextBox هاي عددي در مواردي كه مي خواهيد كاربر را به تايپ اعداد و ارقام محدود كنيد مناسب هستند. با استفاده از اينگونه TextBox ها برنامه هاي شما Safe (مطمئن) تر خواهند بود و احتمال Bug هاي پيش بيني نشده پايين مي آيد.

در اين مقاله ابتدا با استفاده از يك پروژه از نوع Windows Control Library يك TextBox عددي ساخته و سپس با استفاده از يك پروژه از نوع Windows Application آن را تست مي كنيم.

ساخت كنترل Numeric TextBox

1- در VS.NET ، منوي File > New > Project را انتخاب كنيد.

2- در پنجره New Project، آيتم Windows Control Library را انتخاب نماييد. اين نوع پروژه ها براي نوشتن Control هايي كه در Windows Application ها به كار مي روند، استفاده مي شوند.

3- وقتي پروژه باز شد، يك فايل به نام UserControl1.cs در آن قرار دارد. اين فايل را Delete كنيد. سپس بر روي پروژه Right-Click كرده و گزينه Add New Item را انتخاب نماييد. در پنجره Add New Item، آيتم Custom Control را انتخاب كنيد و در قسمت Name، نام آن را NumericTextBox تايپ كنيد.

4- پس از اينكه اين فايل به پروژه شما اضافه شد، روي آن Right-Click كنيد و گزينه View Code را بزنيد تا كد كلاس آن را مشاهده كنيد. اكنون، بايد پدر اين كلاس را از Control به TextBox تغيير دهيد تا قابليت هاي يك TextBox ساده را به ارث ببرد. براي اين منظور، خط مربوط به تعريف كلاس را به صورت زير تغيير دهيد:

public class NumericTextBox : System.Windows.Forms.TextBox

5- حال، كلاس NumericTextBox مانند يك TextBox معمولي عمل مي كند. اكنون، بايد كاري كنيم كه اين Control تنها كاراكترهاي عددي را بپذيرد. براي اين منظور بايد متد OnKeyPress را override كنيم.

OnKeyPress چيست ؟

تقريباً تمام Control ها در NET. از Event ها پشتيباني مي كنند. Event ها كاربردهاي بسياري در دنياي برنامه نويسي شيء گرا دارند كه در اين مقاله فرصت كافي براي توضيح آن ها نيست. اما فعلاً در همين حد بدانيد كه وقتي اتفاقي در يك كلاس رخ مي دهد، (مثلاً يكي از متدهاي‌ آن فراخواني مي شود)، آن كلاس مي تواند وقوع اين اتفاق را به كلاس هاي ديگر اطلاع دهد. به عنوان يك مثال ساده، فرض كنيد كه يك كلاس به نام هواپيما نوشته ايد كه متدي به نام TakeOff (از زمين بلند شدن) دارد. وقتي هواپيما از زمين بلند مي شود، بايد اين اتفاق را به كلاس ديگري (مثل برج مراقبت) اطلاع دهد. اين كار از طريق Event ها انجام مي شود.

در دنياي Control ها هم همين گونه است. وقتي يك اتفاق بر روي يك Control مي افتد، مثلاً وقتي كه روي آن Click مي كنيد يا يكي از كليدهاي كيبورد را روي آن مي فشاريد، يك Event در سيستم بلند مي شود و اين Event باعث مي شود كلاس هاي ديگر از اين اتفاق مطلع شوند. تمام Control ها يك سري Event هاي مشترك دارند كه يكي از آن ها KeyPress است. اين Event وقتي در سيستم بلند مي شود كه شما روي يك Control باشيد و يكي از دكمه هاي Keyboard را بزنيد. در اينجا، ما از اين Event استفاده مي كنيم تا دكمه اي كه فشرده شده است را پيدا كنيم.

معمولاً در ارتباط با هر Event يك متد (تابع) وجود دارد كه با overide كردن آن مي توان بر نحوه عملكرد آن تغييراتي اعمال كرد. بنابراين، در اينجا ما مي توانيم با override كردن اين متد، نحوه عملكرد كلاس NumericTextBox را هنگامي كه كاربر يك دكمه از Keyboard را روي آن مي فشارد تغيير دهيم و تنها كاراكترهايي را قبول كنيم كه بين ارقام 0 تا 9 باشند. براي اينكار بايد كد زير را در كلاس NumericTextBox بنويسيد.

protected override void OnKeyPress(KeyPressEventArgs e)
{
       if (!Char.IsDigit(e.KeyChar))
             e.Handled = true;
       base.OnKeyPress(e);
}

اما كمي توضيح درباره اين تابع! در اينجا، e آرگومان اين تابع، يك Property به نام KeyChar دارد كه كاراكتري است كه توسط كاربر بر روي Keyboard فشرده شده است. با استفاده از متد ()IsDigit در كلاس Char، مي توان عدد بودن اين كاراكتر را بررسي كرد. در صورتي كه اين كاراكتر از نوع ارقام بين 0 تا 9 نباشد، ما مقدار e.Handled را برابر true قرار مي دهيم. به اين معني كه در همين جا به اين Event پاسخ داده ايم و جلوي حركت آن در سيستم را مي گيريم. به اين ترتيب، كاراكتر وارد شده، در TextBox نمايش داده نخواهد شد.

معمولاً زماني كه يك متد را override مي كنيد، بهتر است كه با استفاده از كلمه كليدي base ، متد كلاس پدر را نيز صدا بزنيد. اين عمل در خط آخر اين متد نمايش داده شده است.

كار ما در اينجا تمام شده است! اكنون اين پروژه را Build كنيد. خروجي اين پروژه يك فايل DLL است كه در مرحله بعدي با Reference دادن به آن، مي توانيم كليه كنترل هاي تعريف شده در آن را (در اينجا NumericTextBox) بر روي ToolBox نمايش دهيم.

ساخت برنامه NumericTextBoxTest به منظور تست كنترل NumericTextBox

1- يك پروژه از نوع Windows Application باز كنيد.

2- بر روي Form1.cs، دوبار كليك كنيد تا پنجره آن باز شود. حال، در قسمت ToolBox، آيتم Components را باز كنيد. در اينجا، Right-Click كنيد و گزينه Add/Remove Items را كليك كنيد. پنجره Add/Remove Items ظاهر مي شود.

3- حال، بر روي دكمه Browse كليك كنيد و سپس به فولدري كه در آن پروژه NumericTextBox را ساخته برويد. آنگاه فولدر bin\debug را باز كنيد و در آنجا فايل NumericTextBox.dll را انتخاب كنيد. آيتم NumericTextBox به ليست NET Framework Components. اضافه مي شود.

4- بر روي دكمه OK كليك كنيد. اكنون، آيتم NumericTextBox به ليست Component ها در ToolBox اضافه مي شود. حال، مي توانيد با عمل Drag & Drop اين آيتم را بر روي فرم مورد نظر بياندازيد و مانند يك TextBox معمولي از آن استفاده كنيد. تنها تفاوت اين است كه اين TextBox فقط مقادير عددي را مي پذيرد.

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


نحوه فراخواني API هاي ويندوز در NET.

اين مقاله نحوه برقراري ارتباط با API هاي ويندوز را در محيط NET. به شما آموزش مي دهد.

نويسنده admin

تاريخ ارسال 1383/7/4

یکی از سوالاتی که برای بسیاری از مبتدیان در دنیای برنامه نویسی NET. مطرح می باشد، این است که آیا در NET. می توان به توابع API ویندوز دسترسی پیدا کرد یا خیر ؟! بسیاری گمان می کنند که با آمدن NET.، توابع API ویندوز بلااستفاده شده اند و دیگر به درد نمی خورند! اما اینطور نیست. با وجود اینکه NET Class Library. بسیاری از کارها را برای برنامه نویسان، ساده و Object-Oriented ساخته، اما هنوز در مواردی لازم است که سراغ API های ویندوز برویم و اعمال خاصی را انجام دهیم که در کلاس های NET. پیاده سازی نشده اند. در این مقاله نحوه ارتباط با API های ویندوز را یاد خواهیم گرفت.

Platform Invoke چیست ؟

Platform Invoke یکی از قابلیت های NET. است که به شما این امکان را می دهد که API های ویندوز را در Managed Code صدا بزنید. برای استفاده از API های ویندوز، ابتدا باید نام تابع مورد نظر و نام DLL ای که این تابع در آن تعریف شده است را پیدا کنید. در MSDN کلیه API ها بر اساس موضوع طبقه بندی شده اند که مي توانيد با فیلتر کردن مطالب Platform SDK آن ها را راحت تر بیابید. در پایین صفحه مربوط به توضیحات هر تابع، نام DLL ای که آن تابع در آنجا تعریف شده آمده است. معمولاً 3 DLL کلی هستند که توابع ويندوز در آن ها تعریف شده اند:

1- User32.DLL: شامل توابع لازم برای ارتباط با منوها، Timer ها و ...
2- GDI32.DLL: شامل توابع گرافیکی و فونت
3- Kernel32.DLL: شامل توابع Low-Level سیستم عامل

پس از اینکه نام تابع و DLL مورد نظر را پیدا کردید، باید با استفاده از DllImport آن را به برنامه تان متصل کنید. در این مرحله باید Data Type های تابع مورد نظر را به Data Type هاي معادل آنها در Managed Code تبديل كنيد. اگر تا به حال برنامه نویسی ویندوز با ++‍C نکرده باشید، تشخیص اینکه کدام Data Type در NET. معادل Data Type مورد نظر در Windows است برای شما مشکل خواهد بود. با این حال، لیستی از پرکاربردترین Data Type های ویندوز و معادل آن ها در NET. را در جدول زیر آورده ام. در صورتی که می خواهید جزئیات بیشتر درباره نحوه تبدیل Data Type های ویندوز به NET. بدانید، پیشنهاد می کنم مبحث Platform Invoke > Marshaling Data را در MSDN مطالعه نمایید. جهت پیدا کردن این مطلب، در قسمت Index بنویسید Platform Invoke. سپس لیستی از آیتم هایی که به این مبحث مربوط می شوند در بخش Index ظاهر می شوند. در این لیست، گزینه Marshaling Data را کلیک کرده و مطالعه نمایید. توجه داشته باشید که فیلتر باید بر روی گزینه (no filter) باشد. در غیر اینصورت مبحث Platform Invoke را در لیست Index نخواهید یافت.

در جدول زیر، لیستی از Data Type های ویندوز به همراه معادل آن ها در NET. را می بینید. به ستون اول دقت کنید. Data Type هایی که در این ستون می بینید، به کرات در API های ویندوز استفاده شده اند. معادل هر Data Type در ویندوز، در ستون دوم (Managed class name) آمده است.

Unmanaged type in Wtypes.h | Managed class name
HANDLE | System.IntPtr
BYTE | System.Byte
SHORT | System.Int16
WORD | System.UInt16
INT | System.Int32
UINT | System.UInt32
LONG | System.Int32
BOOL | System.Int32
DWORD | System.UInt32
ULONG | System.UInt32
CHAR | System.Char
LPSTR | System.String or System.StringBuilder
LPCSTR | System.String or System.StringBuilder
LPWSTR | System.String or System.StringBuilder
LPCWSTR | System.String or System.StringBuilder
FLOAT | System.Single
DOUBLE | System.Double

یک مثال

در اینجا می خواهیم از تابع GetComputerName که در ویندوز به صورت زیر تعریف شده است در برنامه مان استفاده کنیم:

int GetComputerName(LPSTR buffer, LPDWORD size);

به خاطر داشته باشید که LP در ویندوز به معنای Long Pointer است و در مواردی به کار می رود که قرار باشد یک متغیر با آدرس به API ارسال شود. در #C، در صورتی که از انواع Value Type (مثل int، char، float و ...) استفاده می کنید، لازم است قبل از نام متغیر، کلمه کلیدی ref (به معنی reference) را اضافه کنید. در صورتی که از انواع Reference Type (مثل کلاس ها) استفاده می کنید، نیازی به استفاده از این کلمه کلیدی نیست.

بنابراین، با توجه به جدول فوق، می توان تابع ()GetComputerName را به صورت زیر در NET. به برنامه متصل کرد:

public class Win32API
{
     [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
     public static extern int GetComputerName(StringBuilder buffer, ref uint size);
}

DllImport یک Attribute است که به CLR می گوید که این تابع در کجا تعریف شده است. آرگومان دوم این Attribute ، یعنی CharSet = CharSet.Auto برای فراخوانی توابعی که از 2 فرمت ANSI و Unicode استفاده می کنند لازم است. بسیاری از توابع ویندوز (مانند GetComputerName) در 2 فرمت می آیند: GetComputerNameA و GetComputerNameW. در این موارد، لازم است که تشخیص اینکه از کدام نسخه استفاده شود را به CLR واگذار کنید. عبارت CharSet.Auto این کار را به طور اتوماتیک انجام می دهد.

در اینجا، ما یک کلاس به نام Win32API تعریف کرده ایم و توابع API ای که می خواهیم از آنها استفاده کنیم را در این کلاس قرار خواهیم داد. شما هم می توانید API هایی که زیاد با آنها کار می کنید را در یک یا چند کلاس از نظر موضوعی دسته بندی کنید. به چنین کلاسی Wrapper گفته می شود. این تکنیک در نگهداری برنامه ها و استفاده مکرر از کد تاثیر بسزایی دارد.

یک نکته مهم: در هنگام Declare توابع API، توجه داشته باشید که این توابع را باید همواره از نوع static و extern تعریف کنید تا CLR بتواند آن ها را در DLL های مربوطه پیدا کند.

اما نحوه استفاده از این تابع! فرض کنید که می خواهیم اسم کامپیوتر را با استفاده از تابع ()GetComputerName گرفته و در یک رشته به نام ComputerName قرار دهیم. برای این منظور، می نویسیم:

StringBuilder buffer = new StringBuilder(128);
uint size = (uint)buffer.Capacity;
Win32API.GetComputerName(buffer, ref size);
string ComputerName = buffer.ToString();

البته، فراخوانی API های ویندوز پیچیدگی ها و مشکلات زیادی دارد که توضیح آن ها از حوصله این مقاله خارج است. در این مقاله فقط می خواستیم کلیاتی درباره نحوه فرخوانی API ها در NET. را یاد بگیریم. جهت مطالعه جزئیات بیشتر درباره این مبحث، مطلب Platform Invoke را در MSDN مطالعه نمایید.

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد؟ (قسمت اول)

در اين سري مقالات قصد داريم شما را با ويژگي هايي كه براي ايجاد وب سايت هاي بين المللي در ASP.NET وجود دارد آشنا كنيم .

نويسنده mansoor

تاريخ ارسال 1383/7/27

New Page 2

چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد ؟

اينترنت در آغاز توسط انگليسي زبانان بكار گرفته شد، اما با گسترش نفوذ اينترنت در جهان تعداد افراد غير انگليسي زباني كه از اين رسانه استفاده مي كنند افزايش يافته است و با توجه به جمعيت زياد كشورهاي آسيايي و اروپايي كه كاربر اينترنت مي باشند و مي خواهند با هم كار كنند ، نياز است كه سايت هايي با زبان ها و فرهنگ هاي مختلف ايجاد كرد تا افراد غير همزبان با ما نيز بتوانند از آن استفاده كنند . به هر حال انجام اين عمل كار بسيار خوبي مي باشد اما پياده سازي آن مشكلاتي را براي برنامه نويسان وب سايت ايجاد مي كند.
چهار چوب .NET شامل ويژگي هاي مختلفي براي كمك به ايجاد وب سايت هاي بين المللي مي باشد . خيلي از اين خصيصه ها بر روي همه نوع از برنامه ها اعم از Windows Form ها و يا ASP.NET قابل اجرا مي باشند . اگرچه ASP.NET در ترجمه محتوا نمي تواند به شما كمكي كند اما مي تواند در مديريت محتوايي كه يك بار ترجمه شده است به شما كمك كند . در اين سري مقالات قصد داريم شما را با ويژگي هايي كه براي ايجاد وب سايت هاي بين المللي در ASP.NET وجود دارد آشنا كنيم .
در اين مقالات از يك وب سايت نمونه كه امكان دسترسي به مقالات خبري را مي دهد استفاده مي شود . در اين سايت بازديدكنندگان مي توانند زبان مورد نظر خود را از يك ليست كشويي انتخاب نمايند و مقالات مورد نظرشان را در صورت وجود در آن زبان مشاهده نمايند . در اين وب سايت از ويژگي هاي محلي سازي .NET (.NET Localization) براي قرار دادن محتواي از قبل ترجمه شده با توجه به زبان انتخاب شده در جاي خود و نمايش آن به كاربر استفاده مي شود . براي اين منظور در .NET مجموعه اي بسيار مفيد براي كمك به شما فراهم شده است كه زمان زيادي براي شما صرفه جويي مي كند .زيرا جنبه هاي بسيار زيادي در محلي سازي وجود دارد كه شما بايد براي انجام يك پروژه موفق مد نظر داشته باشيد

ملاحظاتي درباره زبان و فرهنگ

در هنگام ايجاد يك وب سايت مسايلي وجود دارد كه در هر فرهنگ و زباني بگونه اي متفاوت مي باشند كه بايد به آنها توجه كرد .اين مسايل شامل موارد زير مي باشند :

  • محتواي پايگاه داده . بخش اعظم اطلاعات شامل اخبار ، مقالات ، مشخصات محصولات و مانند آن اغلب در پايگاه داده ها قرار مي گيرند . اگرچه خيلي از سايت ها اين مطالب را در فايل هاي HTML نگه داري مي كنند .

  • گرافيك . به واقع هر سايتي براي خود مشخصه هاي گرافيكي دارد كه خيلي از بخش هاي آن با تغيير زبان تغيير نمي كنند . ولي مطمئناً هر عكسي كه شامل متن باشد نيازمند بين المللي سازي مي باشد و يا مممكن است تصويري شامل سمبل هايي باشد كه در زبان هاي مختلف معاني متفاوتي داشته باشند .

  • منابع متني . كه شامل اعداد و مطالب ثابت سايت مثل جمله حق نشر ، صفحه خوش آمدگويي ورودي سايت و غيره مي باشد . اكثر وب سايت ها اين مطالب را در صفحات جداگانه اعم از HTML و يا aspx نگه داري مي كنند .

  • تاريخ .در فرهنگ هاي مختلف تاريخ به شكل هاي متفاوتي نمايش داده مي شود . براي مثال تاريخ " اول دسامبر 2004 " در انگلستان به فرم "04/12/1 " و در آمريكا به فرم "04/1/12 " نمايش داده مي شود . بنابراين نمايش تاريخ به فرم صحيح براي كاربران با فرهنگ هاي مختلف بسيار مهم مي باشد .
    علاوه بر اين چهار حوزه گفته شده ، مسايل ديگري نيز وجود دارد كه بايد آنها را نيز در كار در نظر گرفت .اين مسايل شامل واحدهاي پولي ، فرمت هاي محلي براي نوشتن اعداد ، مرتب سازي و بزرگي و كوچكي حروف در زبان هايي مختلف و واحدهاي اندازه گيري مي باشد .

فرآيند ترجمه

فرآيند ترجمه بخش مهمي از بين المللي سازي وب سايت را شامل مي شود . در اينجا تعدادي پرسش وجود دارد كه در هنگام طراحي برنامه بين المللي تان بايد به آنها پاسخ دهيد :

  • چه كسي محتوا را ترجمه خواهد كرد ؟

  • سايت از چه زبان هايي حمايت خواهد كرد ؟

  • در هنگام بروز مشكلات زبان اوليه براي نمايش منابع و اشكالات نمايش داده شده چيست؟
    در اين سايت از چهار زبان انگليسي ، چيني ، فرانسه و ژاپني استفاده مي شود .

نگاشت محتوا به كلاس ها

در وب سايت نمونه اي كه در طي اين مقالات ايجاد خواهيم كرد مقالات خبري را در چندين زبان مختلف ترجمه و نگه داري مي كنيم و با توجه به زبان انتخاب شده توسط بازديد كننده نمايش داده مي شود . در اين سايت متن مقالات ، صفحات و تاريخ و تصاوير با توجه به فرهنگ آن زبان نمايش داده مي شود .
همانگونه كه مرسوم است سايت خبري ما نيز مقالاتش را در پايگاه داده ذخيره مي كند زيرا در اين روش ايجاد يك رابط مديريتي براي ويرايشگران و روزنامه نگاران ساده مي باشد . اولين گام در ايجاد اين برنامه ساختن يك رابط كاربر براي نمايش شرح اخبار مي باشد . مشكلي كه در اين كار نهفته است اين است كه كدام نسخه زباني از مقاله بايد نمايش داده شود. در اينجا نيازمندي هاي ساده اين سايت گفته شده است :

  • در اين سايت محتواي هر مقاله در چهار زبان مختلف ذخيره مي گردد .

  • كاربران زبان مورد نظرشان را از بين زبان هاي : English-UK ، French-France ، Chinese-China و Japanese-Japan انتخاب مي كنند .

  • زبان پيش فرض English-UK مي باشد .

  • در اين سايت مقالات خبري در صورت وجود با توجه به زبان انتخاب شده نمايش داده مي شود .

  • هر مقاله شامل يك شناسه منحصر بفرد ، عنوان ، متن مقاله و تاريخ انتشار مي باشد .

  • از آنجاييكه اين فقط يك نمونه براي آشنايي با بين المللي سازي مي باشد بنابراين هيچ واسطي براي فرستادن ، ويرايش و حذف مقالات وجود ندارد و داده هاي آزمايشي به صورت مستقيم در پايگاه داده SQL Server درج خواهد شد .

در اين سايت كلاسي به نام Article وجود دارد كه توسط آن نمونه اي از مقاله در يك زبان معين ارائه مي شود . در ابتداي فايل اين كلاس (Article.cs ) فضاي نام هاي مورد نياز زير را قرار مي دهيم .

using System.Data;
using System.Globalization;

فضاي نام System.Data كلاس DataSet را فراهم مي كند و فضاي نام System.Globalization كلاس هايي را كه براي محلي سازي اطلاعات از آنها استفاده مي شود را فراهم مي كند كه مهمترين آنها كلاس CultureInfo مي باشد ، اين كلاس نماينگر يك فرهنگ مي باشد و از آن براي مشخص كردن فرهنگي كه براي نمايش محتوا بايد بكار برده شود استفاده مي شود .
كلاس Article يك سري اعضاي خصوصي (private ) دارد كه براي نگه داري شناسه ، عنوان ، متن مقاله و تاريخ انتشار و فرهنگ ( هر نمونه از Article بخشي از محتوا را در يك فرهنگ مشخص نمايش مي دهد ) بكار رفته در آن استفاده مي شوند .

private int articleID;
private string articleTitle = "";
private string articleBody = "";
private DateTime articlePublicationDate;
private CultureInfo articleCulture;

سپس تعدادي پروپرتي براي اين فيلدهاي خصوصي وجود دارد كه محتواي اين فيلدها را بر روي صفحه براي هر مقاله انتخاب شده نمايش مي دهد :

public string Title
{
    get { return articleTitle; }
}

public string Body
{
    get { return articleBody; }
}

public DateTime PublicationDate
{
    get { return articlePublicationDate; }
}

public CultureInfo Culture
{
    get { return articleCulture; }
}

public int ArticleID
{
    get { return articleID; }
}

حال در پايگاه داده SQL Server 2000 يك ديد (view) به نام ArticleDetail ايجاد مي كنيم كه به مانند تصوير شماره يك مي باشد .

تصوير شماره يك

هر رديف از ديتاست اين ديد نمايانگر يك نسخه از يك مقاله در يك زبان مشخص مي باشد و هر نسخه شامل شناسه مقاله ، تاريخ ، عنوان مفاله و رشته مشخص كننده فرهنگ مي باشد .
توجه : اگرچه هم SQL Server 2000 و هم Access از استاندارد يوني كد پشتيباني مي كنند اما شما ممكن است كه نياز داشته باشيد تا كامپيوترتان را براي نمايش كاراكترهاي زبان هاي مختلف پيكربندي كنيد ؛ براي اين كار بايد پشتيباني از زبان هاي خارجي را در Windows نصب كرده باشيد .

كلاس Article يك سازنده اورلود شده دارد كه يك شناسه از نوع integer را براي مشخص كردن شناسه مقاله و يك شي از نوع System.Globalization.CultureInfo كه نمايانگر فرهنگ بكار رفته در آن مقاله مي باشد را مي گيرد و يك شي از نوع Article بر مي گرداند .

public Article(int articleID, CultureInfo culture)
{
}

حال پرس و جوي SQL زير را در سازنده قرار مي دهيم تا با استفاده از دو آرگومان سازنده ، ترجمه مرتبط با مقاله خواسته شده را بازيابي كند .

string Sql = "SELECT * FROM ArticleDetail WHERE ArticleID=" + articleID + " AND LanguageID='" + culture.Name + "'";

سازنده مقدار پرس و جوي SQL را به يك متد استاتيك كمكي به نام GetDataSet() مي فرستد تا در آن سطرهاي مرتبط برگردنده شوند .

using System;
using System.Data;
using System.Data.SqlClient;
using System.Web;

namespace Multilingual
{
    public class Database
    {
         public static DataSet GetDataSet(string Sql)
         {
             DataSet DS = new DataSet();
             string myPhysicalPath =
                HttpContext.Current.Request.PhysicalApplicationPath;
             string connectionString =
                "Server=optimism;Database=sqlservername;
                UID=sqlserveraccountname;PWD=mypassword;";
             SqlConnection myConnection =
                new SqlConnection(connectionString);
             SqlDataAdapter myDataAdapter =
                new SqlDataAdapter(Sql, myConnection);
             DataSet myDataSet = new DataSet();
             myDataAdapter.Fill(myDataSet);
             return myDataSet;
        }
    }
}

بنابراين ، كلاس Article يك مقاله را بوسيله ايجاد يك عبارت SQL و فرستادن آن به متد GetDataSet() از شي DataBase بازيابي مي كند .

DataSet dataSet = Database.GetDataSet(Sql);

در صورتيكه پرس و جو هيچ سطري از ديد را برنگرداند پس اينچنين مقاله اي در آن فرهنگ خاص موجود نمي باشد ، در اين صورت بلاك كد بعدي يك پرس و جوي جديد را براي جستجوي نسخه انگليسي مقاله كه همان نسخه پيش فرض مي باشد را اجرا مي كند .

if (dataSet.Tables[0].Rows.Count == 0)
{
    Sql = "SELECT * FROM ArticleDetail WHERE ArticleID=" + articleID + " AND
         LanguageID='" + "en-gb" + "'";
    dataSet = Database.GetDataSet(Sql);
}

حال در صورتيكه پس از اجراي عبارت SQL دوم نيز هيچ مقاله اي با آن مشخصات پيدا نشد استثناي زير اجرا مي گردد .

if (dataSet.Tables[0].Rows.Count == 0)
{
    Exception exception = new Exception("Article not available");
    throw exception;
}

و در صورتيكه نتيجه اي برگردانده شود سازنده مقادير اعضاي خصوصي را در آنها قرار مي دهد . كه اين اعضا شامل عنوان ، متن مقاله ، تاريخ انتشار و فرهنگ آن مي باشد .

    DataTable dt = dataSet.Tables[0];
    articleTitle = dt.Rows[0]["Title"].ToString();
    articleBody = dt.Rows[0]["Body"].ToString();
    articlePublicationDate = DateTime.Parse
          (dt.Rows[0]["PublicationDate"].ToString());
    articleCulture = CultureInfo.
    CreateSpecificCulture(dt.Rows[0]["LanguageID"].ToString());
}

در خط اخر سازنده متد CreateSpecificCulture() قرار دارد كه براي ايجاد يك شي جديد CultureInfo مورد استفاده قرار مي گيرد از اين شي براي بيان فرهنگ مقاله استفاده مي شود . متد CreateSpecificCulture() رشته اي كه نام فرهنگ مي باشد مانند "en-GB " را مي گيرد و شي CultureInfo را كه دربرگيرنده اكثر مشخصات فرهنگي يك زبان مي باشد را بر مي گرداند .

ادامه دارد...

منبع : http://www.devx.com/dotnet/Article/6997

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد؟ (قسمت دوم)

در اين سري مقالات قصد داريم شما را با ويژگي هايي كه براي ايجاد وب سايت هاي بين المللي در ASP.NET وجود دارد آشنا كنيم .

نويسنده mansoor

تاريخ ارسال 1383/8/6

New Page 2

چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد ؟ (قسمت دوم)

نمايش محتوا با استفاده از كنترل سرور

در اين برنامه براي نمايش مقالات بر روي صفحه از كنترل هاي سرور استفاده مي شود  .اين كنترل سرور يك پروپرتي دارد كه از آن براي نشان دادن شماره مقاله استفاده مي شود . اين كنترل به صورت خودكار فرهنگ صحيح را در هنگام نمايش مقاله انتخاب مي كند . كلاس كنترل سرور با تعريف يك فيلد متغير خصوصي براي نگه داري شماره شناسه مقاله و يك پروپرتي براي تغييرات مقدار آن شروع مي شود .

using System.Globalization;
 using System.Threading;

 public class ArticleControl : System.Web.UI.Control
 {
        private int articleID;
        public int ArticleID
        {
              get { return articleID; }
              set { articleID = value; }
        }

با استفاده از متد CreateChildControl() اين كنترل سرور تگ هاي HTML صفحات را ايجاد مي كنيم . ابتدا  فرهنگي كه قرار است صفحات با توجه به آن ايجاد شوند را با اجراي شي CurrentUICulture كه از كلاس Thread در فضاي نام System.Threading بدست مي آيد استخراج مي شود .

protected override void CreateChildControls()
{
       CultureInfo culture =
           Thread.CurrentThread.CurrentUICulture;

متد  CreateChildControl() سازنده كلاس Article را فراخواني مي كند و مقدار culture و شناسه مقاله را به آن مي دهد و شي Article  را براي نمايش بر روي صفحه ايجاد مي كند .

       Article myArticle = new Article(articleID, culture);

 شي myArticle صفحه را با ايجاد يك سري شي LiteralControl رندر مي كند .

      LiteralControl literal;
      literal = new LiteralControl("<h1>" +
         myArticle.Title + "</h1>");
      Controls.Add(literal);
      literal = new LiteralControl("<b><i>" +
         myArticle.PublicationDate.ToLongDateString() +
         "</i></b><br /><br />");
      Controls.Add(literal);
      literal = new LiteralControl(myArticle.Body +
        "<br />");
      Controls.Add(literal);
   }

 حال با استفاده از اين كنترل سرور درج كردن مقاله در صفحه ساده مي باشد ، براي مثال:

   <%@ Page language="c#" %>
   <%@ Register TagPrefix="NewsSite"
      Namespace="Multilingual.Controls"
      Assembly="Multilingual" %>

   <html>
      <body>
         <NewsSite:ArticleControl runat="Server"
            id="ArticleCtrl" ArticleID="1" />
      </body>
   </html>

با استفاده از طراحي سه لايه براي اين سايت منطق برنامه (Program Logic) در اشيا عملياتي(Business) نگه داري مي شود و فايل هاي .aspx براي واسط و لي اوت در نظر گرفته مي شود . رهنمود @Register در فرم وب مشخص مي كند كه .NET در كجا بايد به دنبال كنترل بگردد . در اين مورد رهنمود @Register مشخص مي كند كه كلاس مورد نظر در فضاي نام Multilingual.Controls قرار دارد . شما تگ <NewsSite:ArticleControl> را به همراه پروپرتي ArticleID آن در صفحه درج مي كنيد و در صورتيكه مقاله اي با آن شناسه وجود نداشته باشد استثنايي رخ مي دهد . تصوير زير نتيجه كدهاي بالا مي باشد . و براي مشاهده مقالات در زبان هاي مختلف شما مي بايست شناسه مقاله را در رشته پرس و جو تغيير دهيد . فرهنگ نمايش صفحه از thread ي كه كدهاي صفحه در آن اجرا مي شوند گرفته مي شود . همچنين شما مي توانيد مقدار فرهنگ را در رهنمود @Page با استفاده از پروپرتي Culture تغيير دهيد .

تصوير مقاله نمايش داده شده

براي تغيير پروپرتي Culture در اينجا مي بايد ويژگي هاي Culture و UICulture را در خط اول تغيير دهيد .

<%@ Page language="c#" Culture="fr-FR" UICulture="fr-FR" %>

بعد از انجام اين تغيير همان مقاله را اين بار به زبان فرانسه مشاهده خواهيد كرد . بايد توجه داشته باشيد كه فقط عنوان و متن مقاله با تغيير زبان تغيير نكرده است ، بلكه فرمت نمايش تاريخ نيز با توجه به فرمت نمايش تاريخ در كشور فرانسه تغيير كرده است . در ادامه خواهيد ديد كه چگونه به صورت پويا مي توان تنظيمات فرهنگ را تغيير داد .

همان مقاله به زبان فرانسوي

پروپرتي UICulture  آنچنان فرق زيادي با Culture ندارد و از Culture براي نمايش اطلاعات فرهنگي زبان مورد نظر استفاده مي شود و از UICulture براي مشخص كردن چگونگي نمايش واسط كاربري استفاده مي شود . توجه داشته باشيد كه در صورتيكه فرهنگ صفحه مشخص نباشد يك استثنا رخ مي دهد و اگر شما كد فرهنگي را وارد كرده باشيد كه ترجمه اي به آن زبان براي آن مقاله وجود نداشته باشد آنگاه مقاله پيش فرض كه به زبان انگليسي مي باشد نمايش داده خواهد شد .
تا اينجا شما فقط مي توانيد با استفاده از رهنمود @Page و ايجاد تغييرات به صورت دستي در آن ، مقاله ها را در فرهنگ هاي مورد نظر مشاهده نماييد . در ادامه درباره چگونگي ايجاد واسط كاربري كه با استفاده از آن كاربر بتواند فرهنگ مورد نظر خود را انتخاب كند بحث خواهد شد .

روش ايجاد واسط كاربري براي انتخاب زبان

همان گونه كه مشاهده كرديد مي توان با استفاده از رهنمود @Page فرهنگ نمايش صفحه را براي همه كاربران به يك شكل از پيش تعيين شده تنظيم كرد . اما در اين برنامه نياز است تا تنظيمات فرهنگي هر كاربر نگه داري شود . به اين ترتيب كه كاربر وقتيكه به سايت متصل شد زبان مورد نظر خود را انتخاب كند و نتيجه اين انتخاب در جلسه(Session) مربوط به آن كاربر  بر روي سرور ذخيره شود . بنابراين اين سايت نياز به يك ليست كشويي دارد كه در آن نام زبان هاي مورد حمايت سايت ليست شده باشند و كاربر با انتخاب زبان مورد نظر خود ، نام اين زبان در يك كوكي پايدار كه شامل مقدار رشته فرهنگ مي باشد ذخيره گردد و بدين گونه در بازديدهاي آينده كاربر صفحات درخواستيش را به همان زباني كه قبلاً انتخاب كرده مشاهده كند .

متد Application_BeginRequest() در فايل global.asax.cs از مقدار كوكي استفاده مي كند و ASP.NET  اين متد را براي هر درخواست فراخواني مي كند . اين متد مقدار كوكي را مي خواند و مشخصه فرهنگي آن thread را به طور صحيح تنظيم مي كند . كد صفحه نيز تنظيمات را براي نمايش مقاله در فرهنگ مناسبش انجام مي دهد . ابتدا در صورتيكه كوكي شامل رشته فرهنگ بود آن رشته را مشخص مي كنيم .

   protected void Application_BeginRequest(Object sender, EventArgs e)
   {
      string culturePref;
      if (Request.Cookies["CulturePref"] != null)
      {
         culturePref = Request.Cookies["CulturePref"].Value;
      }

 سپس يك بلاك  try-catch  با استفاده از مقدار كوكي ، فرهنگ آن thread را تنظيم مي كند . اداره كردن خطا برنامه را در مقابل مقادير غير مجاز كوكي محافظت مي كند .

      try
      {
       Thread.CurrentThread.CurrentCulture =
           CultureInfo.CreateSpecificCulture(culturePref);
      }
      catch
      {
         Thread.CurrentThread.CurrentCulture =
           new CultureInfo("en-GB");
      }
      Thread.CurrentThread.CurrentUICulture =
        Thread.CurrentThread.CurrentCulture;
 }

خط آخر اين متد مقدار CurrentUICulture را برابر مقدار CurrentCulture قرار مي دهد . زيرا در اين برنامه نيازي به متفاوت بودن اين دو مقدار با هم نمي باشد .
در كنترل سرور بعدي يك واسط ايجاد مي شود تا بازديد كنندگان با استفاده از آن زبانشان را انتخاب نمايند ( همچنين مقدار فرهنگ را در كوكي تنظيم نمايد) . در اين كنترل نام چهار زبان مورد حمايت در اين سايت در يك ليست كشويي قرار مي گيرد كه اين ليست در يك فرم قرار دارد كه اين فرم يك فرم سمت سرور نمي باشد ( در اين فرم صفتrunat=”server” وجود ندارد .) زيرا در هر صفحه مي خواهيم فقط از يك فرم سمت سرور استفاده نماييم . همه صفحات اين وب سايت شامل يك انتخابگر زبان مي باشند بنابراين از فرم استاندارد HTML استفاده مي كنيم .به اين ترتيب فرم داده ها را به يك صفحه به نام cultureChooser.aspx كه متد Page_load() آن شامل كد زير مي باشد مي فرستد .

   CultureInfo culture =
      CultureInfo.CreateSpecificCulture
     (Request.QueryString["CultureChoice"].ToString());
   HttpCookie cookie = new HttpCookie
      ("CulturePref", culture.Name);
   cookie.Expires = DateTime.Now.AddYears(100);
   Response.Cookies.Add(cookie);
   string referrer = Request.UrlReferrer.ToString();
   Response.Redirect(referrer);

هدف اصلي در استفاده از اين كد در متد Page_load() اين صفحه ذخيره كردن مقدار فرهنگ در يك كوكي مي باشد . اما اين كد كاربر را نيز به صفحه اي كه از آن آمده است برمي گرداند كه اين كار براي كاربر شبيه يك نوسازي ساده صفحه مي باشد كه بعد از آن صفحه را به زبان انتخاب شده مي بيند .
پس از افزودن كنترل سرور انتخاب فرهنگ و نوسازي صفحه يك ليست كشويي بر روي صفحه ديده مي شود كه مي توان با استفاده از آن زبان مورد نظر را انتخاب كرد .

  <NewsSite:CultureControl runat="Server" id="CultureCtrl">
  </NewsSite:CultureControl>

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد؟ (قسمت سوم)

در اين سري مقالات قصد داريم شما را با ويژگي هايي كه براي ايجاد وب سايت هاي بين المللي در ASP.NET وجود دارد آشنا كنيم .

نويسنده mansoor

تاريخ ارسال 1383/8/7

New Page 2

چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد ؟ (قسمت سوم)

محلي سازي ساير منابع متني

علاوه بر ذخيره مقالات در پايگاه داده، مي بايست مقادير ثابت سايت مثل پيام خوش آمد گويي و جمله حق نشر را نيز محلي سازي كرد . براي اين كار از فايل هاي منبع (resx) استفاده مي شود . شما مي توانيد اين فايل هاي منبع را هم در Visual Studio .NET ايجاد كنيد و هم فايل متني آن را ايجاد كنيد و سپس آن را تبديل به فايل resx كنيد . همچنين مي توانيد فايل هاي منبع را با استفاده از برنامه نويسي و استفاده از كلاس System.resources.ResourceWriter ايجاد نماييد .
در اين مثال فايل منبع زبان انگليسي Resources.resx مي باشد .فايل هاي .resx فايل هاي منبع مي باشند ، اين فايل ها به فرم XML هستند و به راحتي مي توان آنها را ويرايش كرد . از آنجاييكه اين فايل ها به فرم قابل تشخيص براي انسان مي باشند مي توان مقادير آنها را به طور مستقيم ترجمه كرد .اين فايل ها مي توانند شامل اشيا پشت سرهمي مانند اطلاعات متني باشند . سايت نمونه ما شامل رشته هاي منبع براي پيام خوش آمدگويي ، جمله حق نشر و متني كه در بالاي ليست كشويي نوشته مي شود مي باشد . در تصوير زير شما مي توانيد اين فليل را ببينيد .

فايل Resources.resx

اين فايل شامل فيلد هاي مقدار (value) ، توضيح (comment) و نام (name) مي باشد كه از فيلد comment براي توضيح مختصري درباره هدف اين مقدار استفاده مي شود .كد با استفاده از مقدار فيلد name رشته مورد نظر را از اين فايل دريافت مي كند .

در Visual Studio .NET فايل منبع زبان پيش فرض در داخل اسمبلي اصلي نگه داري مي شود . حال براي ايجاد يك فايل منبع براي زبان فرانسه مي بايست يك فايل منبع به نام Resources.fr.resx ايجاد كرد . نامگذاري اين فايل به همين صورت گفته شده مهم مي باشد زيرا Visual Studio .NET از اين نام براي نگه داري ارتباط منطقي بين فايل ها و فرستادن اين اطلاعات براي كامپايلر استفاده مي كند . در اين مورد از “ fr “ براي مشخص كردن اينكه اين فايل نسخه فرانسوي فايل Resources.resx مي باشد استفاده مي شود .نسخه فرنسوي فايل منبع فقط شامل دو رشته مي باشد كه در ادامه خواهيم ديد كه چگونه برنامه رشته مفقود را اداره مي كند .

شما مي توانيد روند ايجاد فايل منبع را براي زبان هاي مختلف تكرار نماييد . در صورتيكه اكنون پروژه را بسازيد و شاخه bin  سايت را مشاهده كنيد چيزهاي جالبي مي بينيد .
فايل منبع اوليه كه انگليسي مي باشد (resources.resx) در اسمبلي اصلي قرار دارد . Visual Studio .NET سه زبان ديگري كه اين سايت از آنها حمايت مي كند و ما براي آنها فايل منبع ساخته ايم را همراه با اسمبلي خودشان ايجاد مي كند . و هر كدام را در پوشه هاي جداگانه قرار مي دهد و از مشخصه فرهنگي آنها براي نامگذاري آنها استفاده مي كند . به شكل زير توجه كنيد .
 تصوير ساختار پوشه bin ايجاد شده براي پروژه

بعد از كامپايل منابع ، شما مي توانيد از طريق كدنويسي به اين منابع دسترسي داشته باشيد و رشته مناسب را براي فرهنگ مورد استفاده انتخاب كنيد . براي انجام اين كار يك كنترل سرور ديگر به نام SiteTextControl ايجاد مي كنيم كه مي توان آن را در هر كجا از صفحه كه مي خواهيم محلي سازي انجام دهيم اضافه كرد ؛ اين كنترل سرور يك پروپرتي عمومي براي قرار دادن نام رشته اي مانند “Copyright” كه مي خواهيم به آن دسترسي داشته باشيم دارد .

   public string Name
   {
      get   { return textName; }
      set   { textName = value; }
   }

متد CreateChildControl() كه براي ايجاد تصوير گرافيكي كنترل مورد استفاده قرار مي گيرد در اين مورد فقط متن منبع مربوطه را بدون هيچ تگHTML  ي مي نويسد . براي بازيابي متن مي بايست يك نمونه از كلاس System.Resources.ResourceManager را ايجاد كرد تا از طريق آن به فايل هاي منبع دسترسي پيدا كنيم .  براي مقدار دهي اين شي بايد نام فايل منبعي كه مي خواهيم از آن استفاده كنيم را به همراه ارجاعي به اسمبلي در حال اجرا به آن بدهيم تا بداند كه در كجا بايد به دنبال رشته هاي منبع بگردد .

   ResourceManager res = new ResourceManager
      ("Multilingual.Resources",
      Assembly.GetExecutingAssembly());

براي بدست آوردن مقدار رشته منبع بايد متد GetString() را صدا زده و پارامتر textName را كه بوسيله پروپرتي Name كنترل سرور آن را ست كرده ايم به اين متد بدهيم .

   string text = res.GetString(textName);

در نهايت يك كنترل literal باري نگهداري رشته منبع و افزودن آن به ساختار كنترل صفحه ايجاد مي كنيم .

   LiteralControl literal = new LiteralControl(text);
   Controls.Add(literal);

توجه داشته باشيد كه لازم نيست فرهنگ را در كد مديريت كرد . چهارچوب .NET اين كار را براي شما انجام مي دهد . زيرا فرهنگ  thread قبلاً در Application_BeginRequest() تنظيم شده است . براي مثال براي افزودن جمله حق نشر به صفحه مقاله ، كنترل SiteTextControl را به صفحه اضافه كنيد و نام منبع مورد نظر را براي نمايش مقاله با استفاده از پروپرتي Name مشخص كنيد .

   <NewsSite:SiteTextControl runat="Server"
      id="CopyrightMessage" Name="Copyright" />

پس از افزودن كنترل و نوسازي صفحه مقاله جمله حق نشر ظاهر خواهد شد . در صورتيكه شما فرهنگ را با استفاده از ليست كشويي تغيير دهيد ، كنترل جمله حق نشر را با توجه به زبان انتخاب شده نمايش مي دهد .

در اين مقاله شما با نحوه استفاده از ويژگي هاي اصلي محلي سازي در چهارچوب .NET كه شامل شي CultureInfo و فايل هاي منبع مي باشد آشنا شديد . شما همچنين روش تغيير تنظيمات فرهنگ را در سطح صفحه مشاهده كرديد و با روش درج كردن محتواي محلي در صفحه چه با استفاده از پايگاه داده و چه با استفاده از فايل منبع آشنا شديد .

در مقالات آينده سعي خواهد شد تا قسمت هاي ديگر محلي سازي در .NET و تكنيك هاي اين كار را معرفي كنيم .

منبع: http://www.devx.com/dotnet/Article/6997

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


مهندسي نرم افزار و معرفي UML (قسمت اول)

يكي از مباحث مهم در علم كامپيوتر بحث مهندسي نرم افزار مي باشد كه متاسفانه در ايران در وب سايت ها كمتر به آن پرداخته مي شود . در حاليكه امروزه شركت ها بدون داشتن اصول مشخص مهندسي نرم افزار هيچگاه تصميم به ايجاد سيستم هاي نرم افزاري نمي گيرند...

نويسنده mansoor

تاريخ ارسال 1383/8/9

مهندسي نرم افزار و معرفي UML

بخش اول

يكي از مباحث مهم در علم كامپيوتر بحث مهندسي نرم افزار مي باشد كه متاسفانه در ايران در وب سايت ها كمتر به آن پرداخته مي شود . در حاليكه امروزه شركت ها بدون داشتن اصول مشخص مهندسي نرم افزار هيچگاه تصميم به ايجاد سيستم هاي نرم افزاري نمي گيرند . بنابراين من در اين سايت قصد دارم تا در يك سري مقالات شما خوانندگان گرامي را با اين مقوله تا آنجا كه مي توانم بيشتر آشنا كنم .

همانگونه كه مي دانيد طراحي و توليد سيستم هاي نرم افزاري داراي يك چرخه حيات مي باشد كه در علم مهندسي نرم افزار به بررسي اين چرخه حيات و عوامل مرتبط با آن پرداخته مي شود . به طور كلي مراحل اين چرخه به شرح زير مي باشد :

  • فعاليت جمع آوري نيازمندي هاي و مشخص كردن آنها . اين نيازمندي ها كاري را كه سيستم مي بايست انجام دهد را مشخص مي كنند .

  • فعاليت تحليل نيازمندي ها براي درك بهتر آنها .

  • فعاليت طراحي براي اينكه مشخص شود كه سيستم چگونه نيازمندي ها را برآورده مي كند .

  • فعاليت ساخت سيستم .

  • آزمايش سيستم براي تاييد اينكه آيا سيستم نيازمندي ها را برآورده كرده است يانه ؟

  • و در نهايت فعاليت تحويل سيستم .

حال متدلوژي هاي مختلفي براي انجام اين فعاليت ها وجود دارد و هر كدام به نحوي به انجام اين كار ها مي پردازند .

متدولوژي

در ابتدا بايد به تعريف متدلوژي و اينكه يك متدلوژي چه كاري انجام مي دهد پرداخت .

تعريف : متدلوژي يا فراروش مجموعه اي است همگرا و هدف مدار از مفاهيم ، عقايد ، ارزش ها و اصولي كه بوسيله منابعي در جهت حل مسايل گروهي بكار گرفته مي شود و مي خواهد تغييرات مطلوبي را در وضع موجود يك سيستم بطور غير تصادفي ايجاد نمايد .

يك متدلوژي در حقيقت سه وظيفه دارد .

  1. فرموله كردن مسئله .

  2. بيان نحوه حل مسئله

  3. پياده سازي مسئله .

هدف من در اينجا بررسي متدلوژي هاي شي گرا مي باشد . ديدگاه شي گرايي از اواسط دهه 70 ميلادي در مباحث برنامه نويسي كامپيوتر متولد شد . پس از گذشت چند سال و در اوايل دهه 90 به جهت ناكارآمدي روش هاي سنتي در مباحث تحليل و طراحي سيستم هاي اطلاعاتي و كامپيوتري و نيز ظهور سيستم هايي كه مدل سازي آنها به روش هاي سنتي بسيار ناقص بود ، تحليل گران و طراحان سيستم را به اين فكر انداخت تا از ديدگاه شي گرا علاوه بر برنامه نويسي در زمينه تحليل و طراحي سيستم نيز استفاده كنند .

از جمله اين متدلوژي هاي شي گرا كه در طول سال ها ايجاد گرديد مي توان متدولوژي هاي Fusion و Booch و rumbaugh و متدواوژي Yourdon را نام برد . تا در نهايت در سال 1996 آقايان Boch,Rumbaugh و Jacobson در كنار هم گرد آمدهند و پايه هاي " زبان مدل سازي يكپارچه "(Unified Modeling Language ) يا همان UML را ايجاد كردند . اين زبان مدل سازي در سال 97 توسط (OMG (Object Management Group در آمريكا به عنوان يك استاندارد پذيرفته شد و شركت هاي مشهوري نظير Oracle و Microsoft از آن پشتيباني كردند .

ضرورت مدل سازي

همانگونه كه براي ساخت يك ساختمان نياز به وجود نقشه و طرح اوليه انجام كار مي باشد ، مي توان براي توليد سيستم هاي نرم افزاري نيز از طرح و نقشه اوليه استفاده كرد كه به اين عمل مدل سازي گفته مي شود . يك فراروش مي بايد توانايي مدل كردن داشته باشد . بنابراين براي انجام اين كار هر فراروش يك سري علائم و عناصر مدل سازي و رهنمود خواهد داشت .

تعريف كلي UML

UML زباني است براي مشخص سازي ، مجسم سازي ، ساخت و مستندسازي دست آوردهاي سيستم هاي نرم افزاري و مدل سازي كسب و كار و ديگر سيستم هاي غير نرم افزاري .

در اينجا ابتدا چند مفهومي كه امكان دارد با آن آشنا نباشيد را معرفي خواهم كرد .

شي (Object ) : انسان ، مكان يا هر چيزي يك شي است .

مسئوليت (Responsibility ) : چيزي است كه به شي اختصاص داده ميشود و سه جنبه دارد .

  • آنچه كه شي راجع به خودش مي داند .

  • كساني كه شي را مي شناسند و با هم ارتباط دارند .

  • كارهايي كه شي انجام مي دهد .

سناريو : يك مجموعه پشت سر هم يا متوالي مي باشد كه منجر به انجام كار خاصي مي گردد .

كلاس : مجموعه اي از اشيا كه داراي صفات ، اعمال و ارتباطات يكسان هستند در يك كلاس قرار مي گيرند و هر يك از اين اشيا نمونه اي (Instance ) از آن كلاس به حساب مي آيند .

در ادامه و مقالات آينده براي اينكه مفاهيم UML و عناصر آن را بهتر متوجه شويد كار را با بررسي يك مورد آموزشي ادامه خواهيم داد . اين مورد يك سيستم مديريت پروژه مي باشد .

توجه : در اينجا هدف پياده سازي و انجام يك پروژه كامل نمي باشد بلكه سعي مي شود در خلال اين مثال به بررسي UML بپردازيم .

يك سيستم مديريت پروژه مي بايست توانايي مديريت پروژه ها و منابع و راهبري سيستم را داشته باشد .بنابراين نقش هاي زير در آن تعريف مي شود .

  • مدير پروژه (Project Manager ) : اين نقش مسئول تضمين تحويل محصولي با كيفيت در زمان و هزينه مشخص ، با توجه به محدوديت منابع مي باشد .

  • مدير منابع ( Resource manager ) : اين نقش مسئول تضمين تامين منابع انساني آموزش ديده و ماهر براي انجام پروژه ها مي باشد .

  • مديريت افراد (Human Manager ) : اين نقش مسئول تضمين بروز بودن و كافي بودن مهارت هاي افراد و كامل بودن كيفيت انجام كار براي يك پروژه مي باشد .

  • مدير و راهبر سيستم (System Administrator ) : مسئول تضمين فراهم نمودن سيستم مديريت پروژه براي يك پروژه مي باشد .

ادامه دارد ...

لطفاً در صورتي كه هر گونه سوالي در ارتباط با اين مقاله داريد، با آدرس mansoor@dotnetexperts.net تماس بگيريد.

منابع :

كتاب چكيده UML ، مهندس مهدي ساعدي

كتاب Learning UML نوشته Sinan Si Alhir

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


فرستادن يك آرايه يا DataTable به يك Stored Procedure

آيا تا بحال خواسته ايد كه يك DataTable يا يك آرايه كه شامل ده ها، ده ها هزار ( و يا حتي ميليون ها ) ركورد مي باشد را در فقط يك فراخواني پايگاه داده به يكStored Procedure در SQL Server 2000 بفرستيد ؟ و يا تا بحال خواسته ايد كه ليست شناسه هاي ركوردها را براي انتخاب يا حذف به يك Stored Procedure بفرستيد ؟

نويسنده mansoor

تاريخ ارسال 1383/8/9

فرستادن يك آرايه يا DataTable به يك Stored Procedure
مقدمه

آيا تا بحال خواسته ايد كه يك DataTable يا يك آرايه كه شامل ده ها، ده ها هزار ( و يا حتي ميليون ها ) ركورد مي باشد را در فقط يك فراخواني پايگاه داده به يكStored Procedure در SQL Server 2000 بفرستيد ؟ و يا تا بحال خواسته ايد كه ليست شناسه هاي ركوردها را براي انتخاب يا حذف به يك Stored Procedure بفرستيد ؟ اگر اين كارها را انجام نداده ايد و يا نتوانستيد كه براي انجام آن راه حلي پيدا كنيد پس راه حل اين كار را مي توانيد در اينجا ببينيد .

حقه انجام اين كار تبديل ليست هاي داده به آرايه اي از بايت مي باشد ، كه اين آرايه ها را سپس به عنوان پارامتر از نوع image به Stored Procedure مي فرستيم . سپس در Stored Procedure اين تصوير به يك جدول متغير كه شامل داده هاي اصلي مي باشد تبديل مي شود . تابع SQL Server زير يكي از توابع تبديل پارامتر از نوع image به يك جدول متغير مي باشد . اين تابع يك جدول از نوع متغير varchar ايجاد مي كند .

CREATE FUNCTION dbo.GetTableVarchar(@Data image)
RETURNS @DataTable
    TABLE (RowID int primary key IDENTITY , Value Varchar(8000))
AS
BEGIN
    --First Test the data is of type Varchar.
    IF(dbo.ValidateExpectedType(103, @Data)<>1) RETURN

    --Loop thru the list inserting each
    -- item into the variable table.
    DECLARE @Ptr int, @Length int,
        @VarcharLength smallint, @Value Varchar(8000)
    SELECT @Length = DataLength(@Data), @Ptr = 2
    WHILE(@Ptr<@Length)
    BEGIN
        --The first 2 bytes of each item is the length of the
        --varchar, a negative number designates a null value.
        SET @VarcharLength = SUBSTRING(@Data, @ptr, 2)
        SET @Ptr = @Ptr + 2
        IF(@VarcharLength<0)
            SET @Value = NULL
        ELSE
            BEGIN
                SET @Value = SUBSTRING(@Data, @ptr, @VarcharLength)
                SET @Ptr = @Ptr + @VarcharLength
            END
       INSERT INTO @DataTable (Value) VALUES(@Value)
    END
    RETURN
END

من همچنين تعدادي كلاس C# براي ايجاد آرايه هايي از نوع بايت از نوع داده هاي مختلف ايجاد كرده ام .

توجه : كد هايي كه در ادامه مي آيد بخشي از يك برنامه براي مزرعه پرورش صدف مي باشد .

در اين مثال براي فراخواني پايگاه داده از كلاس SQLHelper كه يكي از بلاك هاي برنامه مايكروسافت مي باشد استفاده كرده ام . شما مي توانيد اين بلاك برنامه را در MSDN مشاهده كنيد. فرستادن يك ليست از شناسه هاي integer براي انتخاب ركوردهاي مربوطه در متد زير اقلام چك شده ي يك ليست باكس را گرفته و شناسه هاي آنها را به يك Stored Procedure مي فرستيم . Stored Procedure سپس يك مجموعه از نتايج را كه شامل جزييات هر شناسه انتخاب شده مي باشد را بر مي گرداند .

private DataSet GetSelectedSnailDetails()
{
    SQLIntListCreator snailIDs = new SQLIntListCreator();
    foreach(Snail aSnail in mySelectionCheckedListBox.CheckedItems)
        snailIDs.AddValue(aSnail.SnailID);

    return SQLHelper.ExecuteDataset(CONN_STRING,
        "GetSnailDetails", snailIDs.GetList());
}

از Stored Procedure زير براي گرفتن ليستي از نوع داده int كه به فرم image ( آرايه اي از بايت) مي باشد ؛ استفاده مي شود . اين روال ليست را به جدول متغيري از نوع int تبديل مي كند سپس اين جدول را به ستون SnailID از جدول Snails متصل مي نمايد ، تا بتواند جزييات را براي هر صدف انتخاب شده برگرداند .

CREATE PROCEDURE GetSnailDetails
    @SnailIDs image
AS
    SELECT Snail.*
    FROM dbo.GetTableInt(@SnailIDs) SIDs
    INNER JOIN Snails ON SIDs.Value = Snails.SnailID
GO

روال ذخيره شده براي حذف همه صدف ها در ليست @Snails از نوع image به فرم زير مي باشد .

CREATE PROCEDURE DeleteSnails
    @SnailIDs image
AS
    DELETE Snail
    FROM dbo.GetTableInt(@SnailIDs) SIDs
    INNER JOIN Snails ON SIDs.Value = Snails.SnailID
GO

متد فرستادن مجموعه اي از حالات صدف به Stored Procedure براي بهنگام سازي به فرم زير مي باشد .

private void UpdateSnailStatuses(Snail[] snails)
{
    SQLIntListCreator snailIDs = new SQLIntListCreator();
    SQLVarcharListCreator statuses =
       new SQLVarcharListCreator();
    SQLRowversionListCreator rowVersions =
       new SQLRowversionListCreator();

    foreach (Snail aSnail in snails)
    {
        snailIDs.AddValue(aSnail.SnailID);
        statuses.AddValue(aSnail.Status);
        rowVersions.AddValue(aSnail.RowVersion);
    }

    SQLHelper.ExecuteNonquery(CONN_STRING,
        "UpdateSnailStatuses", snailIDs.GetList(),
        statuses.GetList(), rowVersions.GetList());
}

از روال زير نيز براي بهنگام سازي حالات صدف ها استفاده مي شود .

CREATE PROCEDURE dbo.UpdateSnailStatuses
   @SnailIDs image,
   @Statuses image,
   @RowVersions image
AS
   UPDATE Snail
   SET Snail.Status = Statuses.Value
   FROM Snail
   INNER JOIN GetTableInt(@SnailIDs) SnailIDs
       ON Snail.SnailID = SnailIDs.Value
   INNER JOIN GetTableVarchar(@Statuses) Statuses
       ON SnailIDs.RowID = Statuses.RowID
   INNER JOIN GetTableRowversion(@RowVersions) RowVersions
       ON Statuses.RowID = RowVersions.RowID
   WHERE TSEQUAL(Snail.RowVersion, RowVersions.Value)

RETURN @@ERROR

فرستادن يك DataTable به يك Stored Procedure براي درج در يك جدول

از كد زير براي تبديل داده هاي يك DataTable به پنج آرايه از نوع بايت استفاده مي شود . اين آرايه ها سپس به Stored Procedure ي AddSnails براي درج در جدول Snail فرستاده مي شوند .

private void AddSnails(DataTable snails)
{
    SQLVarcharListCreator species = new SQLVarcharListCreator();
    SQLDatetimeListCreator dOB = new SQLDatetimeListCreator();
    SQLNvarcharListCreator location = new SQLNvarcharListCreator();
    SQLBitListCreator isMale = new SQLBitListCreator();
    SQLMoneyListCreator value = new SQLMoneyListCreator();

    foreach(DataRow row in snails.Rows)
    {
        species.AddValue(row["Species"]);
        dOB.AddValue(row["DOB"]);
        location.AddValue(row["Location"]);
        isMale.AddValue(row["IsMale"]);
        value.AddValue(row["Value"]);
    }

    // A command is explicitly created here
    // instead of using SQLHelper as we need to be
    // able to set the CommandTimeout property
    // big enough to insert 1 000 000 records.
    using (SqlConnection cnn = new SqlConnection(CONN_STRING))
    {
        cnn.Open();
        SqlCommand comInst = new SqlCommand("AddSnails", cnn);
        comInst.CommandType = CommandType.StoredProcedure;
        comInst.CommandTimeout = 10000;

        comInst.Parameters.Add("@Species", species.GetListAndReset());
        comInst.Parameters.Add("@DOB", dOB.GetListAndReset());
        comInst.Parameters.Add("@Location", location.GetListAndReset());
        comInst.Parameters.Add("@IsMale", isMale.GetListAndReset());
        comInst.Parameters.Add("@Value", value.GetListAndReset());
        comInst.ExecuteNonQuery();
    }
}

و از Stored Procedure زير براي تبديل تصوير به جدول متغيرها و اتصال آنها به هم و درج داده هاي حاصله در جدول Snail استفاده مي شود .

ALTER PROCEDURE dbo.AddSnails
(
    @Species image,
    @DOB image,
    @Location image,
    @IsMale image,
    @Value image
)
AS
    INSERT INTO Snail (Species, DOB, Location, IsMale, Value)
    SELECT Species.Value, DOB.Value,
       Location.Value, IsMale.Value, Value.Value
    FROM GetTableMoney(@value) Value
    INNER JOIN GetTableBit(@isMale) IsMale ON Value.RowID = IsMale.RowID
    INNER JOIN GetTableVarchar(@species) Species
        ON IsMale.RowID = Species.RowID
    INNER JOIN GetTableDateTime(@dOB) DOB ON Species.RowID = DOB.RowID
    INNER JOIN GetTableNvarchar(@location) Location
        ON DOB.RowID = Location.RowID

RETURN @@ERROR

تصوير زير اتصال همه جداول متغير ها را نشان مي دهد .

كارايي استفاده از اين روش

براي مقايسه سرعت درج با استفاده از روش گفته شده در بالا (و بيان كارايي آن) با روش استاندارد وارد كردن يكي يكي ركورد ها به پايگاه داده ها مقايسه زير با استفاده از يك كامپيوتر پنتيوم 4 همراه با 512 مگا بايت حافظه رم انجام شده است .در اين مقايسه بخش كلاينت و سرور هر دو بر روي يك ماشين قرار داشته است . و در صورتيكه بخواهيم اين آزمايش را بر روي يك شبكه سريع انجام دهيم زمان به مراتب كمتري خواهد داشت .

Records Inserted | Standard one stored procedure call per record (msec) | One stored procedure call for all records (msec)
1 | 2 | 10
10 | 22 | 14
100 | 219 | 60
1000 | 2 259 | 505
10 000 | 22 593 | 4 083
100 000 | 301 368 | 44 645
1 000 000 | 3 094 385 | 571 020

منبع : http://www.codeproject.com/cs/database/PassingArraysIntoSPs.asp

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


بررسي نحوه ذخيره سازي Resource ها در اسمبلي هاي .NET

در حالت عادي ما به تصاوير يا متن هاي مورد نيازمان از طريق فايل هاي روي هارد ديسک دسترسي داريم ، اما گاهي اوقات نياز داريد که برنامه از منابع خارجي که درون خودش ذخيره کرده استفاده کند. در اين صورت شما هنگام توزيع برنامه ديگر نگراني درباره مسير فايل هاي مورد نياز آن که هنگام نصب برنامه از کاربر درخواست مي شود را نداريد...

نويسنده raminho2004

تاريخ ارسال 1383/8/18

.net Assembly توانائي ذخيره سازي منابع اضافه شده به برنامه ها ، از قبيل اطلاعات متني و تصاوير مورد نياز برنامه را دارد .

در حالت عادي ما به تصاوير يا متن هاي مورد نيازمان از طريق فايل هاي روي هارد ديسک دسترسي داريم ، اما گاهي اوقات نياز داريد که برنامه از منابع خارجي که درون خودش ذخيره کرده استفاده کند. در اين صورت شما هنگام توزيع برنامه ديگر نگراني درباره مسير فايل هاي مورد نياز آن که هنگام نصب برنامه از کاربر درخواست مي شود را نداريد.

حال طريقه استفاده از .net Assembly را شرح مي دهيم:

ابتدا مراحل زير را صورت دهيد.
1- يک پروژه جديد ايجاد کنيد.
2- در Solution Explorer بر روي نام پروژه کليک راست کرده و سپس روي گزينه Add Existing Item کليک کنيد.
3- در پنجره Open نوع فايل را به All Files تغيير دهيد.
4- پس از انتخاب فايل ها روي آنها کليک راست کرده و Properties را انتخاب کنيد.
همانطور که مي بينيد مقدار اوليه خصوصيت Build Action مربوط به فايل ، Content ميباشد که بايد به Embedded Resource تغيير کند.

حال فايل هاي انتخابي شما بخشي از .Net Assembly هستند.

فراخواني و نحوه استفاده از فايل هاي اضافه شده :
فرض مي کنيم که شما يک تصوير با نام 1.bmp و يک فايل متني با نام Test.txt را به برنامه وارد کرده ايد.ما اين دو فايل را در رويداد Form_Load فراخواني و نمايش مي دهيم.

ابتدا System.IO را در برنامه Import کنيد:

Imports System.IO

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'Assembly تعريف متغيري از نوع
    Dim asm As System.Reflection.Assembly = _
        Me.GetType.Assembly.GetEntryAssembly

    Dim my_namespace As String = _
        asm.GetName().Name.ToString
    'String به متغيري از نوع Assemblyنسبت دادن نام

    Dim pic_stream As Stream
    Dim bt As Bitmap

    pic_stream = _
        asm.GetManifestResourceStream(my_namespace + ".1.bmp")

    If Not pic_stream Is Nothing Then
        bt = New Bitmap(pic_stream)

        Dim pbox As New PictureBox()
        'به آن Image و نسبت دادن PictureBox ساخت
        With pbox
           .Image = bt
           .Left = 600
           .Top = 200
           .Width = 200
           .Height = 200
           .Visible = True
        End With

        Me.Controls.Add(pbox)
        pic_stream.Close()
    End If

    Dim text_stream As Stream = _
        asm.GetManifestResourceStream(my_namespace _
        + ".test.txt")

    If Not (text_stream Is Nothing) Then
        Dim stream_reader As New StreamReader(text_stream)

        Dim lbl As New Label()
        'در آن Test.txt و قرار دادن محتويات فايل Lable ساخت يک
        With lbl
           .Text = stream_reader.ReadToEnd()
           .Top = 75
           .Left = 5
           .Width = 500
           .Height = 500
           .Visible = True
        End With

        Me.Controls.Add(lbl)
        stream_reader.Close()
    End If
End Sub

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


چگونه می توان مقدار موجود در بانک اطلاعاتی را به یک DropDownList نسبت داد ؟

آیا تا به حال شده که برای نسبت دادن مقادیر به یک DropDownList در فرم های Edit خود به مشکل بر بخورید !

نويسنده babakjahangiri

تاريخ ارسال 1383/8/29

چگونه می توان مقدار موجود در بانک اطلاعاتی را به یک DropDownList نسبت داد ؟

آیا تا به حال شده که برای نسبت دادن مقادیر به یک DropDownList در فرم های Edit خود به مشکل بر بخورید !

فرض کنید یک dropdownlist بر روی صفحه Design Form خود دارید یا نام Drd1 حال می خواهید مقداری را که در بانک اطلاعاتی ذخیره شده به این DropDownlist نسبت یدهید و گزینه مربوط را select کنید .

<asp:DropDownList id="drd1" runat=server>
     <asp:ListItem Value="M">Male</asp:ListItem>
     <asp:ListItem Value="F">Female</asp:ListItem>
</asp:DropDownList>

در قسمت Code Behind :

Databasevalue مقداری هست که شما از بانک اطلاعاتی گرفته اید.

Select Case databasevalue
    Case "M"
        Drd1.Items.FindByValue("M").Selected = True
    Case "F"
        Drd1.Items.FindByValue("F").Selected = True
End Select

اگر خواستید که Select کردن بر اساس Name صورت بگیرد اینگونه می نویسید .

Select Case databasevalue
    Case "M"
        Drd1.Items.FindByName("Male").Selected = True
    Case "F"
        Drd1.Items.FindByName("Female").Selected = True
End Select

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


ساخت يك كنترل در زمان اجرا

گاهي از اوقات در برنامه احتياج هست که يک کنترل ( براي مثال يک Button يا يک Image ) را در هنگام اجرا بوجود آوربد . اين کار در vb6 با استفاده از توابع API صورت مي گرفت ولي در VB.NET اين کار را به راحتي آب خوردن مي توان درون برنامه انجام داد.

نويسنده raminho2004

تاريخ ارسال 1383/8/29

ساخت يك كنترل در زمان اجرا

گاهي از اوقات در برنامه احتياج هست که يک کنترل ( براي مثال يک Button يا يک Image ) را در هنگام اجرا بوجود آوربد . اين کار در vb6 با استفاده از توابع API صورت مي گرفت ولي در VB.NET اين کار را به راحتي آب خوردن مي توان درون برنامه انجام داد.

در .NET کافيست که يه نمونه از کنترل مورد نظر را در حافظه تعريف کنيد و بعد از تنطيم خصوصيات با استفاده از متد Controls.Add() آن را روي فرم ظاهر کنيد.

براي مثال يک نمونه از Button اينگونه ساخته مي شود:

Dim btn As New Button() 'Declare a New Instance of an Button
With btn 'Set Control Properties
   .Text = "Created at Run time"
   .Width = 150
   .Height = 20
   .Location = New Point(100, 200)
End With
Me.Controls.Add(btn) 'Add the Control to Form

تا اينجا دکمه ساخته شده و روي فرم قرار گرفته است ، ولي چگونه مي توان براي رويدادهاي اين دکمه نيز برنامه نوشت؟
براي اين منظور ابتدا بايد يک روال براي رويداد مورد نظر و با همان پارامترهايي که براي يک دکمه معمولي بکار مي رود نوشت ، براي مثال رويداد کليک يک دکمه :

Sub onclick(ByVal sender As Object, ByVal e As EventArgs)
    'Insert Event Code Here
End Sub

و سپس اين رويداد را به روال مورد نظر نسبت مي دهيم به صورت زير :

AddHandler رويداد مربوط به کنترل, AddressOf نام روال نوشته شده براي رويداد

براي مثال:

AddHandler btn.Click, AddressOf onclick 'Set the Control Event With Its Sub

با استفاده از دستور RemoveHandler مي توان ارتباط ميان رويداد و کنترل را از ميان برداشت. براي مثال:

RemoveHandler btn.Click, AddressOf onclick

با دستور Me.Controls.Remove() نيز مي توانيد يک کنترل را در زمان اجرا از فرم حذف کنيد.

در مثال زير ابتدا دکمه اي را در حافظه تعريف کرده و سپس به کنترل هاي روي فرم اضافه مي کند ، با يک روال نيز در رويداد کليک مي گوئيم که کادر پيام با مضمون کليک شدن روي دکمه ظاهر گردد و در پايان نيز دکمه مورد نظر را حذف مي کنيم:

Dim btn As New Button()

Overloads Sub onclick(ByVal sender As Object, ByVal e As EventArgs)
    MsgBox("You Click :" & CType(sender, Button).Text)
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  Handles MyBase.Load
    With btn 'Set Control Properties
        .Text = "Created at Run time"
        .Width = 170
        .Height = 20
        .Location = New Point(100, 200)
    End With
    'Set the Control Event With Its Sub
    AddHandler btn.Click, AddressOf onclick

    'Add the Control to Form
    Me.Controls.Add(btn)
End Sub

'Button1 Created in Design View
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 Handles Button1.Click
    RemoveHandler btn.Click, AddressOf onclick
    Me.Controls.Remove(btn)
End Sub

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


استفاده از اشاره گر ها در #C

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

نويسنده reza

تاريخ ارسال 1383/9/3

استفاده از اشاره گرها در #C

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

  • کارایی بسیار زیاد.

  • ارتباط و استفاده از ساختارهای باینری موجود.

  • تعامد پیشرفته با اشیاء COM.

طراحان #C به کدهایی که در آنها از اشاره گرها استفاده شده نام Unsafe یا غیر مطمئن داده اند. استفاده از کد unsafe تنها در صورتی مجاز می باشد که همه چیز تحت کنترل بوده و کد مورد نظر از هر لحاظ قابل اطمینان باشد. در این مقاله بطور مختصر به چگونگی بکاربردن این خصوصیت #C اشاره شده است.

برای استفاده از اشاره گر نیاز به انجام اعمال زیر می باشد.

  • علامت گذاری کلاس، ساختار و متد مورد نظر با شناسه unsafe.

  • استفاده از اشاره گر برای برطرف ساختن نیاز موجود.

  • کامپایل کردن کد ایجاد شده با سوئیچ unsafe/.

در زیر دو مثال برای استفاده از اشاره گرها بیان شده است.

سری فیبوناچی

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

// compile with: /unsafe
using System;
class Test
{
public static unsafe void Main()
{
int* fib = stackalloc int[100];
int* p = fib;
*p++ = *p++ =
1;
for (int i=2; i<100; ++i, ++p)
*p = p[-1] + p[-2];
for (int i=0; i<10; ++i)
Console.WriteLine (fib[i]);
}
}

نکته قابل توجه در این مثال استفاده از شناسه stackalloc می باشد. با استفاده از این شناسه می توان بلاکی از حافظه را در اختیار گرفت. فضای اختصاص داده شده توسط Garbage Collector قابل جمع اوری نمی باشد و محدوده آن در همان متد و یا بلاک استفاده شده می باشد. آدرس اول بلاک را می توان در یک اشاره گر ذخیره نمود. همانطور که در کد بالا مشاهده می نمایید اشاره گرها در #C شبیه به C می باشند.

کپی کردن عناصر آرایه

در این مثال عناصر یک آرایه در آرایه دیگر با استفاده از اشاره گرها ذخیره سازی می شوند.

// compile with: /unsafe
using System;

class Test
{
   // The unsafe keyword allows pointers to be used within
   // the following method:
   static unsafe void Copy(byte[] src, int srcIndex,
       byte[] dst, int dstIndex, int count)
   {
      if (src == null || srcIndex < 0 ||
          dst == null || dstIndex < 0 || count < 0)
      {
          throw new ArgumentException();
      }
      int srcLen = src.Length;
      int dstLen = dst.Length;
      if (srcLen - srcIndex < count ||
          dstLen - dstIndex < count)
      {
          throw new ArgumentException();
      }

      // The following fixed statement pins the location of
      // the src and dst objects in memory so that they will
      // not be moved by garbage collection.
      fixed (byte* pSrc = src, pDst = dst)
      {
         byte* ps = pSrc;
         byte* pd = pDst;

        // Loop over the count in blocks of 4 bytes, copying an
        // integer (4 bytes) at a time:
        for (int n =0 ; n < count/4 ; n++)
        {
           *((int*)pd) = *((int*)ps);
           pd += 4;
           ps += 4;
        }

        // Complete the copy by moving any bytes that weren't
        // moved in blocks of 4:
        for (int n =0; n < count%4; n++)
        {
           *pd = *ps;
           pd++;
           ps++;
        }
      }
   }

   static void Main(string[] args)
   {
      byte[] a = new byte[100];
      byte[] b = new byte[100];
      for(int i=0; i<100; ++i)
         a[i] = (byte)i;
      Copy(a, 0, b, 0, 100);
      Console.WriteLine("The first 10 elements are:");
      for(int i=0; i<10; ++i)
         Console.Write(b[i] + " ");
      Console.WriteLine("\n");
  }
}

نکته قابل توجه در این مثال استفاده از عبارت fixed می باشد. با استفاده از این عبارت می توان از اختصاص فضای مجدد به متغیر یا متغییرها توسط Garbage Collector جلوگیری نمود.

منبع : MSDN April 2003

توصيه به دوستان

چاپ اين صفحه

ذخيره در ليست Favorites

بازگشت به ليست مقالات
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


.NET Experts - Articles

سايت NET Experts. فعاليت خود را از ابتداي مرداد ماه 1383 آغاز كرده است.

از شما دوستان گرامي تقاضا داريم به منظور پربار كردن اين سايت و فراهم آوردن محيط غني از اطلاعات تخصصي و به روز درباره NET. مقالات خود را (تاليف يا ترجمه) براي ما ارسال نماييد. كليه مقالات شما به نام خودتان در سايت ثبت خواهد شد و به هر كاربر به ازاي هر مقاله ارسالي 1 امتياز تعلق مي گيرد. كاربران با امتياز بالاتر رسماً به عنوان اعضاي تيم فني سايت NET Experts. معرفي و به آن ها دسترسي هاي وي‍ژه اي از جمله مديريت انجمنها (به زودي)، مقالات و ... اعطاء خواهد گرديد.

فرم ارسال مقاله

1383/9/3 - استفاده از اشاره گر ها در #C

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

1383/8/29 - چگونه می توان مقدار موجود در بانک اطلاعاتی را به یک DropDownList نسبت داد ؟

آیا تا به حال شده که برای نسبت دادن مقادیر به یک DropDownList در فرم های Edit خود به مشکل بر بخورید !

1383/8/29 - ساخت يك كنترل در زمان اجرا

گاهي از اوقات در برنامه احتياج هست که يک کنترل ( براي مثال يک Button يا يک Image ) را در هنگام اجرا بوجود آوربد . اين کار در vb6 با استفاده از توابع API صورت مي گرفت ولي در VB.NET اين کار را به راحتي آب خوردن مي توان درون برنامه انجام داد.

1383/8/18 - بررسي نحوه ذخيره سازي Resource ها در اسمبلي هاي .NET

در حالت عادي ما به تصاوير يا متن هاي مورد نيازمان از طريق فايل هاي روي هارد ديسک دسترسي داريم ، اما گاهي اوقات نياز داريد که برنامه از منابع خارجي که درون خودش ذخيره کرده استفاده کند. در اين صورت شما هنگام توزيع برنامه ديگر نگراني درباره مسير فايل هاي مورد نياز آن که هنگام نصب برنامه از کاربر درخواست مي شود را نداريد...

1383/8/9 - مهندسي نرم افزار و معرفي UML (قسمت اول)

يكي از مباحث مهم در علم كامپيوتر بحث مهندسي نرم افزار مي باشد كه متاسفانه در ايران در وب سايت ها كمتر به آن پرداخته مي شود . در حاليكه امروزه شركت ها بدون داشتن اصول مشخص مهندسي نرم افزار هيچگاه تصميم به ايجاد سيستم هاي نرم افزاري نمي گيرند...

1383/8/9 - فرستادن يك آرايه يا DataTable به يك Stored Procedure

آيا تا بحال خواسته ايد كه يك DataTable يا يك آرايه كه شامل ده ها، ده ها هزار ( و يا حتي ميليون ها ) ركورد مي باشد را در فقط يك فراخواني پايگاه داده به يكStored Procedure در SQL Server 2000 بفرستيد ؟ و يا تا بحال خواسته ايد كه ليست شناسه هاي ركوردها را براي انتخاب يا حذف به يك Stored Procedure بفرستيد ؟

1383/8/7 - چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد؟ (قسمت سوم)

در اين سري مقالات قصد داريم شما را با ويژگي هايي كه براي ايجاد وب سايت هاي بين المللي در ASP.NET وجود دارد آشنا كنيم .

1383/8/6 - چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد؟ (قسمت دوم)

در اين سري مقالات قصد داريم شما را با ويژگي هايي كه براي ايجاد وب سايت هاي بين المللي در ASP.NET وجود دارد آشنا كنيم .

1383/7/27 - چگونه مي توان برنامه هاي ASP.NET بين المللي ايجاد كرد؟ (قسمت اول)

در اين سري مقالات قصد داريم شما را با ويژگي هايي كه براي ايجاد وب سايت هاي بين المللي در ASP.NET وجود دارد آشنا كنيم .

1383/7/4 - نحوه فراخواني API هاي ويندوز در NET.

اين مقاله نحوه برقراري ارتباط با API هاي ويندوز را در محيط NET. به شما آموزش مي دهد.

1383/7/3 - طرز ساخت يك TextBox كه فقط مقادير عددي را قبول مي كند

TextBox هايي كه فقط مقادير عددي را قبول مي كنند، برنامه شما را Safe تر كرده و امكان Bug هاي پيش بيني نشده را كاهش مي دهند. در اين مقاله، روش ساخت اينگونه TextBox ها را در Windows Forms خواهيم ديد.

1383/6/22 - تبديل فايل Text به Image

در این مقاله چگونگی تبدیل یک فایل به فرمت Text را به فرمت Image (مانند Jpeg، Gif و ...) یاد خواهید گرفت

1383/6/16 - رمز نگاري در NET. (قسمت اول)

در اين مقاله قصد داريم بطور خلاصه نگاهي داشته باشيم بر رمزنگاري و كارهايي كه در .NET Framework براي حمايت از رمزنگاري انجام شده است .

1383/6/16 - رمز نگاري در NET. (قسمت دوم)

در اين مقاله قصد داريم بطور خلاصه نگاهي داشته باشيم بر رمزنگاري و كارهايي كه در .NET Framework براي حمايت از رمزنگاري انجام شده است .

1383/5/20 - Password Hashing در #C

اگر شما بخواهيد كه كلمه رمزتان را به صورت معمولي در Database يا فايل ذخيره كنيد، در صورتيكه هكري بتواند به آن فايل يا Database دسترسي پيدا كند به راحتي مي تواند اين كلمات رمز را مشاهده و از آنها استفاده نمايد . بنابراين براي مخفي سازي كلمات رمز كاربران در Database مي توان يك مقدار درهم سازي شده از آن كلمه رمز ايجاد كرد و...

1383/5/20 - نمايش صحيح فرمول هاي شيمي در DataGrid

در اين مقاله مي خواهيم نمايش صحيح فرمول هاي شيمي را در كنترل DataGrid نشان دهيم . يعني مي خواهيم ببينيم كه چگونه مي توان فرمولي كه در پايگاه داده به شكل CO2 ذخيره شده است را به شكل واقعي آن در فرم وب نمايش داد.

1383/5/19 - اجراي همزمان چند عمل با استفاده از Thread ها در NET.

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

1383/5/19 - ايجاد ارتباط TCP ميان سرويس دهنده و سرويس گيرنده توسط #C

در اين مقاله يک مثال کوچک و ساده در مورد چگونگي برقراري ارتباط بين سرويس دهنده و سرويس گيرنده با استفاده از پروتكل TCP مورد بررسي قرار مي گيرد.

1383/5/17 - استفاده از XP Theme در برنامه هاي کاربردي NET.

بطور پيش فرض برنامه هايي که در ويندوز XP و 2003 با زبانهاي برنامه نويسي NET. ايجاد مي گردند از Theme موجود استفاده نمي کنند و ظاهر آنها بصورت برنامه هاي کلاسيک ويندوز مي باشد. براي فعال ساختن اين موضوع ...

1383/5/15 - ايجاد يك ارتباط ايمن با SQL Server در ASP.NET

نگهداري صريح رمزعبور و Hard Code نمودن آن در برنامه هاي کاربردي و وب سايتها قابل قبول نمي باشد. SQL Server داري امکاني با عنوان Trusted Connection مي باشد که از طريق آن اعتبار سنجي لازم براي دسترسي به منابع SQL Server از روي نام Login انجام مي شود....

1383/5/13 - ويژگي هاي افزوده شده به ASP.NET 2.0

بررسي ويژگي هاي افزوده شده به ASP.NET 2.0، معماري صفحه، Master Page ها، اشتراك كدها در برنامه كاربردي، ايجاد Theme و Skin و ...

صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


.NET Experts - Classes

مفتخريم كه براي اولين بار در ايران با حضور مدرسان واجد الشرايط كه داراي مدرك رسمي MCAD از شركت مايكروسافت مي باشند، اقدام به برگزاري دوره هاي آموزشي تخصصي NET. نموده ايم. دوره هاي مورد نظر به 2 صورت كلاسيك و رفع اشكال ارائه مي شوند.

1- دوره هاي كلاسيك: اين دوره ها شامل كليه سرفصل هاي مجموعه كتاب هاي MCSD هستند كه بر اساس مورد ممكن است در 2 دوره مقدماتي و پيشرفته و يا 1 دوره كامل تدريس شوند. دوره هاي كلاسيك براي اشخاصي است كه هيچ گونه آشنايي با مبحث مورد نظر ندارند و يا آشنايي آن ها با اين مباحث كم مي باشد.

2- دوره هاي رفع اشكال: با توجه به درخواست هاي متعدد از جانب اشخاصي كه تا حدي آشنايي با مباحث دارند ولي فرصت و يا حوصله طي كردن دوره كامل كلاسيك را ندارند، تصميم گرفتيم كلاس هاي رفع اشكال را نيز برگذار كنيم. سرفصل هاي مورد نظر در اين كلاس ها استاندارد نيستند و بر اساس نقاط ضعف و قوت هر دانشجو متفاوت است. در دوره هاي رفع اشكال، دانشجو از ميان سرفصل هاي استاندارد، تنها مواردي را كه در آن ها ضعف دارد (يا با آن ها ناآشناست) انتخاب مي كند. شهريه اين دوره ها بر اساس تعداد جلسات توافقي بين مدرس و دانشجو تعيين مي گردد.

ليست دوره هاي آموزشي تخصصي NET. به همراه تعداد جلسات و شهريه آن ها در جدول زير آمده است.

دوره آموزشي | تعداد جلسات | شهريه (ريال) | سرفصل هاي تدريس شده
C#.NET | 15 | 700,000 | PDF
Visual Basic.NET | 15 | 700,000 | N/A
Windows Forms (Basics) | 15 | 600,000 | N/A
Windows Forms (Advanced) | 15 | 600,000 | N/A
ASP.NET (Basics) | 15 | 700,000 | PDF
ASP.NET (Advanced) | 15 | 700,000 | PDF
.NET Framework | 10 | 600,000 | PDF
ADO.NET | 15 | 700,000 | N/A
XML Web Services | 10 | 600,000 | PDF
UML | 10 | 800,000 | N/A

1- كليه دوره ها به صورت تئوري/كاربردي مي باشند و هر جلسه آموزشي با يك تمرين براي جلسه آينده خاتمه مي يابد.

2- كلاس ها به صورت نيمه خصوصي (حداكثر 5 نفر) تشكيل مي شوند.

2- جلسه آخر هر دوره شامل يك پروژه نهايي و رفع اشكال (Troubleshooting) مي باشد.

3- مدرسين دوره هاي NET. داراي مدرك مايكروسافت مي باشند.

لطفاً جهت كسب اطلاعات بيشتر با ما تماس بگيريد...
صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات


The page cannot be found
The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.

Please try the following:

  • If you typed the page address in the Address bar, make sure that it is spelled correctly.
  • Open the home page, and then look for links to the information you want.
  • Click the Back button to try another link.

HTTP 404 - File not found
Internet Information Services

Technical Information (for support personnel)

  • More information:
    Microsoft Support


.NET Experts - News

صفحه اصلي

معرفي NET.
درباره NET. و معماري آن
اخبار IT
منابع علمي NET.
دوره هاي آموزشي NET.
آموزش از راه دور
محيط هاي بحث و تبادل نظر
بانك مقالات
كتاب هاي الكترونيكي (eBooks)
خريد نرم افزار
ساير امكانات