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

<October 2008>
SunMonTueWedThuFriSat
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
RSS 2.0 | Atom 1.0 | CDF
Google Reader
del.icio.us blog.mehdiVK.net latest Posts
Add to my Yahoo!
Subscribe with Bloglines
Subscribe in NewsGator Online

my Feedster
Add to my AOL
Furl blog.mehdiVK.net latest Posts
Subscribe to Rojo


Total Posts: 152
This Year: 61
This Month: 13
This Week: 7
Comments: 107
newtelligence dasBlog 1.9.6264.0


وبلاگ مهدی ولیخانی
وبلاگ مهدی ولیخانی در رابطه با تکنولوژی دات نت
Thursday, September 18, 2008
scriptaculous کتابخانه ای جاوا اسکریپتی برای کار با رابط کاربری


script.aculo.us نام کتابخانه ای جاوا اسکریپتی است که برای ارتقاء رابط کاربری یک برنامه تحت وب به کار می رود . این کتابخانه  Cross Browser شامل بخش های زیر است:

1 - animation framework
2 - drag and drop
3 - Ajax controls
4 - DOM utilities
5 - unit testing

به وب سايت این کتابخانه سربزنید و حتما دموی های این کتابخانه را مشاهده کنید.


  (  |  )  ( Comments [0] | Trackback )
Friday, October 12, 2007
غیر فعال کردن button در صورت کلیک بر روی آن ، یک راه حل

یکی از روش هائی که برای جلوگیری از چند بار کلیک بر روی button ها در یک صفحه وب استفاده می شود غیر فعال کردن button بلافاصله بعد از کلیک بر روی آن می باشد ، در این روش دیگر کاربر نمی تواند چند بار کلیک کند و متوجه میشود که صفحه در حال پردازش است و میبایستی تا فعال شدن button منتظر باشد ، نمایش یک پیغام بلافاصله بعد از غیرفعال کردن button و یا نمایش یک عکس gif هم می تواند در این راه به شما کمک کند.
روش پیاده سازی چنین سناریوی بسیار ساده است ، کافیست که رویداد Onclick رو به button مربوطه اضافه نمائید و سپس در آن رویداد button را غیر فعال کرده و سپس رویداد PostBack را صدا بزنید . یک نمونه برنامه به شکل زیر است :

System.Text.StringBuilder sbValid = new System.Text.StringBuilder();
sbValid.Append("this.value = 'Please wait...';");
sbValid.Append("this.disabled = true;");
sbValid.Append(this.Page.GetPostBackEventReference(this.btnSubmit));

تنها موردی که باقی می ماند تا این سناریو به صورت کامل پیاده سازی شود بحث کنترلهای اعتبار سنجی یا همان Validation Controls می باشد ، در این روش به محض کلیک بر روی button ، کنترل مورد نظر غیر فعال میشود و سپس رویداد مربوط به Post Back صدا زده می شود ، برای حل این مشکل کافیست قبل از غیرفعال کردن تابع Page_ClientValidate را صدا بزنیم ، این تابع به ما میگوید که صفحه معتبر است یا خیر / پس کد کامل به شرح زیر می شود :

System.Text.StringBuilder sbValid = new System.Text.StringBuilder();
sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ");
sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ");
sbValid.Append("this.value = 'Please wait...';");
sbValid.Append("this.disabled = true;");
sbValid.Append(this.Page.GetPostBackEventReference(this.btnSubmit));

حال در صورتیکه صفحه معتبر نباشد button غیر فعال نمی شود .

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

منبع مقاله :Disable Button On PostBack (ASP.NET) - also works with validation controls

موفق باشید.
Technorati Tags: , ,

  (  |  )  ( Comments [0] | Trackback )
Friday, September 14, 2007
زبان XHTML و مشخصه Height=100% برای تگ Table - بخش دوم

در بخش اول این مقاله به عدم پشتیبانی XHTML از Height=100% اشاره کردیم ، به بیان یک راه حل برای حل این مشکل پرداختیم ، راه حل ارائه شده مشکل را بصورت کامل در مرورگر FireFox حل می کرد اما همچنان در IE با مشکل Scroll داشتن صفحه روبرو بودیم ، در این پست تمام تلاش خود را برای ارائه یک راه حل (شاید هم تنها راه حل) برای از بین بردن این Scroll آزاردهنده خواهیم کرد .

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

بخش 1 - اضافه کردن css
در صورتیکه بخش css مطلب قبلی را به یاد داشته باشید بخشی که باعث میشد که Scroll در مرورگر IE ایجاد شود بخش زیر بود :

#MainCell
{
    background-color:gray;
    height:100%;
}
در صورتیکه بتوانیم از دستورات شرطی css استفاده کنیم و بخش height=100% را به شکلی تنظیم کنیم که تنها وقتی مرورگری به غیر از IE بود در صفحه استفاده شود مشکل تا حدودی حل می شود ، اشتباه نکنید قرار نیست ما این بخش را با استفاده از جاوا اسکریپت پیاده سازی کنیم ، این بخش را بوسیله قدرت css پیاده سازی خواهیم کرد.

مرورگر IE تا نسخه 6 از این نوع css پشتیبانی نمی کرد:
html>body #MainCell
{ height:100%; }
پس اگر قرار باشد بخشی را در فایل css داشته باشیم که بخواهیم در مرورگری به غیر از IE استفاده شود از همین بخش استفاده می کردیم ، کافی بود آن بخش اختصاصی را به شیوه فوق در فایل css   تعریف کنیم ، اما مشکل اینجاست که IE 7.0 از این نوع css هم پشتیبانی می کند ، اما خوب باز هم یک ترفند دیگری وجود دارد ، آن هم استفاده از css زیر است که IE 7.0 هم آن را پشتیبانی نمی کند:
html>/**/body #MainCell
{
        height:100%;
}
با این کار تونستیم بخشی که مشکل ساز هست را در IE استفاده نکنیم ، اما با حذف این بخش دیگر Footer به انتهای صفحه منتقل نمی شود ، اینجاست که جاوا اسکریپت این مشکل را حل خواهد کرد:

بخش 2 - اضافه کردن Javascript ی که تنها در IE اجرا شود
سناریوی این بخش هم به این صورت است که یک متد را در دو رویداد PageLoad , PageResize صفحه صدا میزنیم ، در متد فراخوانده شده کاری که می کنیم این است که ارتفاع صفحه را در یک متغیر ذخیره کرده ، دو مقدار ثابت 150 , 75 پیکسل که مربوط به Header , Footer هستند را از آن کم کرده مقدار باقی مانده که همانا! مقدار فضای باقی مانده از صفحه است را به سلولی که قرا است محتویات صفحه در آن قرار بگیرد نسبت می دهیم ، به این شکل:

<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"  
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <style> body , html { height:100%; margin:0px; } #MainTable { height:100%; width:100%; } #MainCell { background-color:gray; height:100%; } #HeaderCell { height:150px; background-color:blue; } #FooterCell { height:75px; background-color:red; } </style> </head> <body onload="Page_OnLoad();" onResize="Page_OnLoad();"> <table id="MainTable"> <tr><td id="HeaderCell"></td></tr> <tr><td id="MainCell"></td></tr> <tr><td id="FooterCell"></td></tr> </table> <script type="text/javascript" language="javascript"> function Page_OnLoad() { document.getElementById("MainCell").style.height =
document.body.clientHeight - 250; } </script> </body> </html>

با این دو بخش مشکل به صورت کامل حل شد ، اما شاید این سوال برای شما پیش بیاید که چرا استفاده از تگ های Div نسبت به این روش سخت تر هست ، برای اینکه که سادگی و سختی و مشکلاتی که در هر روش وجود دارد را شما خودتان ببینید و خودتان تصمیم بگیرید که در صورت نیاز از کدام روش استفاده نمائید آن روش را هم در یک پست جداگانه ارائه خواهم داد ، اما در طراحی روز دنیا از Table دیگر استفاده نمی شود و این روش به نوعی منسوخ باشد!

نمونه صفحه که هم در IE , هم در FF کار می کند را می توانید از زیر دانلود کنید:


موفق باشید.

Technorati Tags: , , , , , ,

  (  |  |  )  ( Comments [0] | Trackback )
Wednesday, September 12, 2007
تغییر تنظیمات پیش فرض در کنترل های ASP.net Ajax Control Toolkit

تا چندی پیش به شکل خیلی ریز به بررسی و استفاده از کنترلهای Microsoft ASP.net Ajax Control Toolkit نپرداخته بودم ، این پروژه جدید  باعث شد تا اندکی توجه به این کامپوننت Open Source داشته باشم ، در نگاه اول مجموعه ای است خوب و کاربردی برای برنامه نویسان دات نت که می تواند امکانات جالبی به برنامه های تحت وب شما بدهد ، اما این پروژه Ajax Control Toolkit  مشکلاتی نیز دارد که یکی از آنها که بنده جدیدا به آن برخورده ام مشکل عدم داشتن تنظیمات کافی برای کنترل ها است ، نبود این تنظیمات بیشتر موقعی احساس میشود که شما یک برنامه نویسی باشید که بخواهید از یک زبان راست به چپ به عنوان زبان برنامه تحت وب خوداستفاده کنید .
بنده این مشکل را در دو کنترل ValidatorCalloutExtender و NumericUpDownExtender به وضوح دیدم . سعی می کنم مشکلات را با طرح مثال هائی بیان کنم .

اولین مشکل در مورد اندازه بالنی است که بوسیله کنترل ValidatorCalloutExtender جهت نمایش پیغام ظاهر می شود ، اندازه این کنترل یک اندازه ثابت است و قابل تغییر توسط شما نمی باشد ، بنده این مورد را در فوروم سايت ASP.net بسیار جستجو کردم و متاسفانه اعلام شده بود که این تنظیمات به صورت Hard Code هستند و در صورت تمایل باید Source پروژه Microsot ASP.net Ajax را دانلود کرده و در فایل های js مربوط به هر کنترل تنظیماتی که بصورت Hard Code هستند را تغییر دهید و سپس فایل های dll جدید را به پروژه خود اضافه نمائید ، در صورتیکه سری به این کدها بزنید و برای نمونه برای حل مشکل طول و عرض بالن پیغامی که بوسیله Validator Callout Extender ظاهر میشود میبایستی فایل ValidatorCalloutBehavior.js که در شاخه ValidatorCallout پروژه AjaxControlToolkit می باشد را توسط ویرایشگر Visual Studio.net باز کرده و بخش زیر را تغییر دهید :

this._width = "250px";

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

محل نمایش این بالن همیشه سمت راست TextBox است ! و در زبان های راست به چپ که عنوان سمت راست TextBox قرار میگیرد (برعکس زبان ltr که سمت چپ است) مشکل عدم زیبائی به وجود می آید ، در واقع سمت چپ TextBox در زبان های ltr انتها محسوب می شود و بالن بر این اساس قرار میگیرد در حالیکه انتهای TextBox در زبان های rtl سمت راست هست . یک نمونه را در زیر می توانید مشاهده کنید :
 ValidatorCalloutExtender
در همین تصویر بالا اگر توجه کنید اندک تغییراتی هم در فونت می توانید مشاهده کنید ، که آن هم بوسیه همین تغییر در کدها صورت گرفته ، البته این یک مورد را می تونستیم از طریق بازی با css انجام دهیم ، به این صورت که یک تگ div  و یا span بیرون تگ تعریف کنترل بزاریم و با css فونت را عوض کنیم ولی چون برای من این تغییر میبایستی در تمام سطح پروژه اعمال می شد ترجیح دادم که این را هم به وسیله Hard Code اعمال کنم.

البته تغییر در Hard Code هم همچین چیز خوبی نیست ولی وقتی تنها گزینه پیش روی شما همین گزینه باشد چاره ای جز این ندارید ، فکر کنید که برای بروز کردن مجموعه کنترل های Ajax Control Toolkit مجبور باشید که تغییرات را دوباره بر روی پروژه جدیدی که از سايت CodePlex دانلود کرده اید اعمال کنید.

مشکل نمایش بالن در سمت راست یک TextBox در کنترل NumericUpDownExtender هم قابل مشاهده است ، بدین معنا که آیکون های فلش بالا و پائین نیز به مانند بالن در سمت راست هستند .

تا اینجای کار تنها چیزی که در رابطه با rtl , ltr مشکلی نداشته ReorderList است ، البته ReorderList برای خودش کلی مشکل داشته و داره و خواهد داشت ، اما کنترل فوق العاده کارآمدی است .


  (  |  |  )  ( Comments [2] | Trackback )
Tuesday, August 14, 2007
راه حلی برای رفع مشکل استفاده از tinyMCE در داخل Update Panel
logo.gif tinyMce یک ویرایشگر WYSIWYG متن باز می باشد که به دلیل قابلیت های بسیار زیاد و خوبی که دارد بین توسعه دهندگان نرم افزار محبوبیت زیادی دارد .
پروژه جدیدی که دارم روش به شدت کار می کنم بر مبنای Ajax است و در اکثر بخش ها از Ajax استفاده شده است.مطلب زیر نتیجه بررسی مشکل من در استفاده از tinyMce در داخل Update Panel می باشد.

tinyMce را به عنوان ویرایشگر برای این پروژه انتخاب کردم چرا که فیدبک خوبی از سوی مشتریان قبلی خودم گرفتم ، کار کردن باهاش راحته یک جوارائی ، اما مشکل اینجاست که این ادیتور با Update Panel مشکل داره.

مشکل از اینجا شروع می شه که وقتی tinyMce را در یک صفحه به خدمت میگیری در مرحله اول که صفحه لود میشه ادیتور بدون هیچ مشکلی جایگزین TextBox های مربوطه میشه و ادیتور بدون مشکل کار میکنه ، اما در Call Back ها دیگر ویرایشگر جایگزین TextBox ها نمی شود.
جستجو با استفاده از گوگل مرا به این وبلاگ رساند که به بیان یک راه حل در رابطه با این مشکل پرداخته است ، با اضافه کردن بخش های توضیح داده شده در این مطلب مشکل مربوط به استفاده از tiyMce در داخل Update Panel حل می شود. اما این کدها تمامی مشکلات را حل نمی کنند .  ، مشکل بعدی زمانی پیش می آید که شما بخواهید از tinyMce به عنوان یک User Control در پروژه خود استفاده کنید . در این حالت در هنگام Call Back ها tinyMce فایل های css مربوطه را گم می کند و style ها در call back لود نمی شوند و ظاهر ویرایشگر به هم میریزد .
برای این یک مشکل هنوز هیچ راه حلی پیدا نکردم جز اینکه فایل های css مربوطه را بصورت دستی با استفاده از تگ link به صفحه اضافه کنم ، اما باز مشکل به صورت 100درصد حل نشد چرا که نتوانستم فایل های cssی که آیکون های ادیتور از آن استفاده می کنند را پیدا بکنم ولی ظاهر ادیتور تا 95درصد به شکل درستش برمی گرد .

اما با کمی جستجو با استفاده از گوگل به این صفحه رسیدم ، یکی از استفاده کنندگان از tinyMce که اتفاقا توسعه دهنده دات نت هم است پیشنهاد داده بود که بیائید و tinyMce را بصورت یک Custom Control دات نتی در بیاوریم برای دات نت . این کاربر بعد از مدتی اولین نسخه از کنترل خود را ارائه داده است و اگر مطلبش را بخوانید متوجه می شوید که کنترل این کاربر هم با Ajax مشکلاتی را دارد (که با اضافه کردن دو قطعه کد فوق مشکل برطرف می شود.) ولی کنترلی که این کاربر ساخته با css ها مشکلی ندارد و tinyMce در Call back ها فایل های css خود را گم نمی کند .
خوبی این کنترل در این است که می توان از طریق خود کنترل به صورت برنامه نویسی و هم از طریق property های مربوطه که در این کنترل در نظر گرفته شده اند تنظیمات ادیتور را تغییر داد.

  (  |  )  ( Comments [0] | Trackback )
Thursday, October 05, 2006
روشی برای پیاده سازی پیغام های در حال پردازش ...
یکی از نیاز های سیستم های مبتنی بر Ajax داشتن پیغام های Waiting می باشد . با استفاده از یک سری عکس های gif . و نوشته می توان وضعیت فعلی را به کاربر گزارش داد.
روش های مختلفی برای پیاده سازی این داستان می باشد . یکی از این روش ها که من خیلی دوست دارم ، روش قفل کردن صفحه می باشد . در این روش به همراه نمایش پیامی مبنی بر در حال پردازش بودن صفحه ، صفحه خاکستری (یا هر رنگ دیگری) می شود به نحوی که کاربر نمیتواند بر روی عناصر موجود در صفحه کلیک کنید . ناچارا کاربر باید تا اتمام کار منتظر بماند .
در زیر به آموزش پیاده سازی این روش می پردازیم . روش زیر بر روی دو مرورگر FireFox , Internet Explorer قابل اجرا می باشد .
تنها با چند خط css و جاوا اسکریپت می توان چنین سیستمی را پیاده سازی کرد . برای شروع کار ما صفحه زیر را در نظر می گیرم..
<html>
<head>
</head>
<body>
<input type="submit" value="SubmitForm" />
</body>
</html>

می خواهیم الگوریتمی را پیاده سازی کنیم که صفحه به محض کلیک بر روی کنترل Submit قفل شود تا پردازش سمت سرور بدون مشکل شروع و نهایتا پایان یابد . بعد از اتمام پردازش صفحه به حالت عادی بازگردد. کار قفل کردن صفحه و نمایش پیغام را با استفاده از دو تک DIV تو در تو پیاده سازی می کنیم ...
صفحه html را به شکل زیر کامل میکنیم .
<html>
<head>
</head>
<body>
<div align="center" id="FreezePane" class="FreezePaneOff">
<div id="InnerFreezePane" class="InnerFreezePane"> </div>
</div>
<input type="submit" value="SubmitForm" />
</body>
</html>

در صفحه فوق تگ DIV که نام آن FreezePane می باشد نقش اصلی را بازی می کند . .
الگوریتم هم به شکل زیر می باشد :
با کلیک کاربر بر روی دکمه توسط جاوا اسکریپت کلاس FreezePane از FreezePaneOff به FreezePaneOn تبدیل شود
بخش جاوا اسکریپت را به کد صفحه اضافه می کنیم . همان بخشی که وظیفه تغییر کلاس ها را بر عهده دارد .
<html>
<head>
<script language="JavaScript">
function FreezeScreen(msg)
{
scroll(0,0);
var outerPane = document.getElementById('FreezePane');
var innerPane = document.getElementById('InnerFreezePane');
if (outerPane) outerPane.className = 'FreezePaneOn';
if (innerPane) innerPane.innerHTML = msg;
}
</script>
<head>
<body>
<div align="center" id="FreezePane" class="FreezePaneOff">
vdiv id="InnerFreezePane" class="InnerFreezePane"> </div>
</div>
<input type="submit" value="SubmitForm" />
</body>
</html>

چیزی که در این میان صحبتی از آن نشده است CSS است که به 90 درصد کار را انجام میدهد .
سه کلاس FreezePaneOff و FreezePaneOn و InnerFreezePane را هم به شکل زیر به صفحه اضافه می کنیم :
<html>
<head>
<script language="JavaScript">
function FreezeScreen(msg)
{
scroll(0,0);
var outerPane = document.getElementById('FreezePane');
var innerPane = document.getElementById('InnerFreezePane');
if (outerPane) outerPane.className = 'FreezePaneOn';
if (innerPane) innerPane.innerHTML = msg;
}
</script>
<style type="text/css">
.FreezePaneOff
{
visibility: hidden;
display: none;
position: absolute;
top: -100px;
left: -100px;
}
.FreezePaneOn
{
position: absolute;
top: 0px;
left: 0px;
visibility: visible;
display: block;
width: 100%;
height: 100%;
background-color: #666;
z-index: 999;
filter:alpha(opacity=85);
-moz-opacity:0.85;
padding-top: 20%;
}
.InnerFreezePane
{
text-align: center;
width: 66%;
background-color: #171;
color: White;
font-size: large;
border: dashed 2px #111;
padding: 9px;
}
</style>
</head>
<body>
<div align="center" id="FreezePane" class="FreezePaneOff">
<div id="InnerFreezePane" class="InnerFreezePane"> </div>
</div>
<input type="submit" value="SubmitForm" />
</body>
</html>

تنها چیزی که باقی می ماند این است که در Event کلیک دکمه تابع FreezeScreen را صدا بزنیم که الگوریتم ما شروع شود .
<html>
<head>
<script language="JavaScript">
function FreezeScreen(msg)
{
scroll(0,0);
var outerPane = document.getElementById('FreezePane');
var innerPane = document.getElementById('InnerFreezePane');
if (outerPane) outerPane.className = 'FreezePaneOn';
if (innerPane) innerPane.innerHTML = msg;
}
</script>
<style type="text/css">
.FreezePaneOff
{
visibility: hidden;
display: none;
position: absolute;
top: -100px;
left: -100px;
}
.FreezePaneOn
{
position: absolute;
top: 0px;
left: 0px;
visibility: visible;
display: block;
width: 100%;
height: 100%;
background-color: #666;
z-index: 999;
filter:alpha(opacity=85);
-moz-opacity:0.85;
padding-top: 20%;
}
.InnerFreezePane
{
text-align: center;
width: 66%;
background-color: #171;
color: White;
font-size: large;
border: dashed 2px #111;
padding: 9px;
}
</style>
</head>
<body>
<div align="center" id="FreezePane" class="FreezePaneOff">
<div id="InnerFreezePane" class="InnerFreezePane"> </div>
</div>
<input type="submit" value="SubmitForm" onclick="FreezeScreen('Your Data is Being Processed...');" />
</body>
</html>

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


این مقاله بر گرفته از مقاله آقای Scott Mitchell با عنوان Prevent Users from Submitting a Form Twice می باشد که در آدرس زیر قابل مشاهده است .
http://www.4guysfromrolla.com/webtech/100406-1.shtml

نویسنده این مقاله یک نسخه نمایشی هم برای این مطلب آماده کرده است که در آدرس زیر قابل مشاهده می باشد .
http://www.4guysfromrolla.com/demos/DontSubmitTwice2.htm


در صورتیکه نیاز به فایل های gif Animator برای پیاده سازی سیستم فوق دارید سه وب سایت زیر به شما در این راه کمک خواهند کرد : موفق باشید .

  (  |  |  )  ( Comments [0] | Trackback )