PDA

View Full Version : خبر: ساخت TextBox هوشمند



RoostaYeBekr
چهارشنبه 06 آذر 1387, 19:14 عصر
با سلام
:لبخند:
قضیه ی این برنامه ای که براتون فرستادم این است که می خواستم از اون کنترل آژاکس استفاده نکنم و یک TextBox هوشمند درست کنم.
:لبخندساده:
درحقیقت چیزی که باعث شده این TextBox هوشمند شود ، نوشتن کدهای innerHTML ، در Code Behind است. این برنامه ، فقط از یک function جاوااسکریپتی استفاده می کند.

قیافه ی این برنامه شکلیه :
http://www.sleezo.com/imgs/2008/nov/26/y2na.png

توجه : این برنامه را با Visual Studio.Net نوشتم ( تحت زبان C# ) .
توجه : قطعا اگر که تعداد رکوردها در دیتابیس زیاد شود ، این روش ، سرعت بسیار پائینی خواهد داشت.
تعداد رکوردهای داخل دیتابیس این برنامه ، 1300 رکورد است . هر کس خواست می تونه تعداد رکوردها را بیشتر کنه و حد ماکزیمم برای اینکه برنامه سرعت قابل قبولی داشته باشد را بدست آورد.
نتیجه : این برنامه برای رکوردهای بالا ، کارایی ندارد.
توجه : بنده قول می دهم که اگر زنده ماندم بزودی این فایرفاکس را روی کامپیوترم نصب کنم تا برنامه رو روی آن امتحان کنم . البته هر کس خواست برنامه رو با فایرفاکس امتحان کنه و نتیجه رو بگه.
توجه : دیتابیس را از پوشه ی APP_Data بردارید.

emad_67
پنج شنبه 07 آذر 1387, 00:01 صبح
خیلی وقت نکردم کدت رو نگاه کنم. ولی حجم سورس سمت کلاینت خیلی بالاست. البته به عنوان یه مثال کار خوبی هست ولی در عمل انجام همچین کاری اصلا درست نیست. چون شما ناچاری تمام اطلاعات رو بفرستی سمت کاربر تا از refresh صفحه جلوگیری کنی که ajax اصلا برای همن خلق شده. البته اینو نفهمیدم چرا حجم ViewState اینقدر زیاده شده؟؟؟

RoostaYeBekr
پنج شنبه 07 آذر 1387, 11:22 صبح
خیلی وقت نکردم کدت رو نگاه کنم. ولی حجم سورس سمت کلاینت خیلی بالاست. البته به عنوان یه مثال کار خوبی هست ولی در عمل انجام همچین کاری اصلا درست نیست. چون شما ناچاری تمام اطلاعات رو بفرستی سمت کاربر تا از refresh صفحه جلوگیری کنی که ajax اصلا برای همن خلق شده. البته اینو نفهمیدم چرا حجم ViewState اینقدر زیاده شده؟؟؟
با سلام
همانطور که گفتم :


توجه : قطعا اگر که تعداد رکوردها در دیتابیس زیاد شود ، این روش ، سرعت بسیار پائینی خواهد داشت.
تعداد رکوردهای داخل دیتابیس این برنامه ، 1300 رکورد است . هر کس خواست می تونه تعداد رکوردها را بیشتر کنه و حد ماکزیمم برای اینکه برنامه سرعت قابل قبولی داشته باشد را بدست آورد.
نتیجه : این برنامه برای رکوردهای بالا ، کارایی ندارد.

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


البته اینو نفهمیدم چرا حجم ViewState اینقدر زیاده شده

البته اگر کد برنامه رو نگاه می کردید ، متوجه می شدید . در هر صورت در پاسخ به این سوالتان باید بگویم که به نظر (شخصی ) خودم ، درست است که حجمش تا حدی زیاد شده ، ولی به دلیل اینکه به کارایی برنامه صدمه نزده ، و همچنین ، سرعت قابل قبولی هم دارد ، ( حداقل با این مقدار داده ) مشکلی ندارد و ضمنا یک علت دیگر هم اینکه : نوشتن هر برنامه ی هوشمندی ، قطعا کد بیشتری دارد.
من یک مدتی پیش یک شخصی که خیلی پر تجربه بود ( برای خودش ریش سفیدی بود ) کار می کردم . همیشه در بحث اولویت برنامه نویسی می گفت: سعی کنید تا آنجا که دیگر به کارایی برنامه صدمه نمی زند ، الویت را به ترتیب زیر قرار دهید :
1 - Client
2 - Server
3 - DataBase

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

الان داشتم فکر می کردم که اگر من این برنامه رو با Regular Expression ها هم می نوشتم ، باز هم حجمش خیلی تغییر نمی کرد.

raravaice
پنج شنبه 07 آذر 1387, 11:58 صبح
علت اینکه من اصرار دارم که از Ajax استفاده نکنم ، این است : یک بار شما یک پروژه ی ساده درست کن . بعد اندازه ی آن پروژه را ببین . بعد دوباره برو سر پروژه ات و فقط یک کنترل Ajax به آن اضافه کن . حالا دوباره اندازه ی پروژه ات را ببین .

کل حجم Ajax که برنامه شما به اون نیاز داره در پیچیده ترین حالت ممکن شاید 3Kb هم نشه!
کنترل های مایکرو سافت رو فراموش کن.

موفق باشید

RoostaYeBekr
پنج شنبه 07 آذر 1387, 12:59 عصر
کل حجم Ajax که برنامه شما به اون نیاز داره در پیچیده ترین حالت ممکن شاید 3Kb هم نشه!
کنترل های مایکرو سافت رو فراموش کن.

موفق باشید
ممنون .
البته من یک کم از اینی که گفتید ، تعجب کردم . آخه یک بار من یکی از کنترل های آژاکس را در یکی از پروژه هایم اضافه کردم . دقیقا اندازه ی پروژه ، پنج برابر شد.
بالاخره Ajax یک dll است که به برنامه اضافه می شود.
ببخشید ، می شه راجع به این جمله ی آخرتان ، بیشتر توضیح دهید.

raravaice
پنج شنبه 07 آذر 1387, 13:42 عصر
مطالعات خودت رو راجع به Ajax بیشتر کن!
Microsoft Ajax رو فراموش کن.


var ec =function(){};

ec.ajax=
function (Url,Parameter,IsPost){
var XL=null;
var ie5 = (navigator.appVersion.indexOf("MSIE 5.5")!=-1) ? 1 : 0;
try{
XL = new XMLHttpRequest();
}catch(e){
var s = (ie5) ? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP';
XL = new ActiveXObject(s);
}
XL.onreadystatechange = function(){if (XL.readyState == 4){result=XL.responseText;};};
XL.open('POST',Url, true);
XL.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
XL.setRequestHeader("Content-length", Parameter.length);
XL.setRequestHeader("Connection", "close");
XL.send(Parameter);
}
این شد Ajax ،به همین سادگی و کم حجمی! :)
Url و پارامتر هارو بهش میدی و جواب درخواست رو در result تحویل میگیری.

موفق باشید

RoostaYeBekr
پنج شنبه 07 آذر 1387, 14:29 عصر
با سلام
:لبخندساده:
خیلی ممنون raravaice . با Ajax ، آشتیمون دادید.
:تشویق:
حالا با تمام این اوصاف ، برای داده هایی با همان حجمی که در دیتابیسم دیدید ، نظر شما در رابطه با اینکه این برنامه با آژاکس نوشته شود و یا با جاوااسکریپت ، چیست ؟ منظورم اینه که به نظرتان بهتر نیست که این برنامه با همین شرایط با جاوااسکریپت ، نوشته شود؟

raravaice
پنج شنبه 07 آذر 1387, 15:45 عصر
بله! حتما از Ajax استفاده کنید.

موفق باشید

emad_67
شنبه 09 آذر 1387, 00:14 صبح
البته اگر کد برنامه رو نگاه می کردید ، متوجه می شدید
من کد شما رو دیدم و شما فقط 1 کنترل سمت سرور داری. ولی این حجم viewstate از کجا اینقدر زیاد شده؟ مگه viewstate مروبط که کنترل های سمت سرور نمیشه؟

Behrouz_Rad
شنبه 09 آذر 1387, 13:13 عصر
ایشون کدهای جاوا اسکریپت رو از طریق تابع get_HTML در زمان اجرا میسازن. تعداد این کدهای جاوا اسکریپت که اکثراً document.getElementById هستن بر اساس تعداد موارد پیدا شده است. کدهایی Client-based ای که در زمان اجرا ایجاد میشن هم در ViewState ذخیره میشن.
این کار غیر حرفه ای باعث شده که حجم ViewState به 730/5 کیلو بایت!!! برسه و بالطبع حجم صفحه به شدت افزایش پیدا کنه.

موفق باشید.

محمدامین شریفی
شنبه 09 آذر 1387, 13:27 عصر
من کد شما رو دیدم و شما فقط 1 کنترل سمت سرور داری. ولی این حجم viewstate از کجا اینقدر زیاد شده؟ مگه viewstate مروبط که کنترل های سمت سرور نمیشه؟
بچه ها انگار این asp.net خیلی تو این وبگاه مظلوم هست،اکثریت بر خلاف محصولات ماکروسافت حرف میزنند.(البته من هم الان با ff دارم این پست را مینویسم! و از IE هم بسیار شاکیم).
ولی آخر به نظر من امروزه قدرت یک زبان برنامه نویسی بسیار وابسته به IDE ان هست و از اینکه vs08 یک IDE بسیار قوی هست هیچ شکی نیست.
و اما در مورد viewstate ها هم باید گفت هرچه قدر یک کنترل توابع بیشتری و در پی آن argument های بیشتری داشته باشد viewstate هم سنگین تر میشود.من به شخصه ترجیح میدهم که تا جایی که میتوانم از کنترل های html استفاده کنم و حتما viewstate صفحه راfalse میکنم و هر کدام از کنترل ها که نیاز به viewstate داشته باشند آنرا جداگانه true میکنم.در ضمن یادتان باشد که datalistview از datagridewiev خیلی خیلی سبک تر است ولی به طبع آن هم ضعیف تراست.
در ضمن کار کردن با asp.net ajax هم خیلی راحت تر از javascript+webservice است،و برای مبتدی های مثل من که بلد نیستند برنامه های هایشان را cross platform کنند،لازم است

RoostaYeBekr
شنبه 09 آذر 1387, 21:36 عصر
با سلام
ببخشید آقای raravaice (http://barnamenevis.org/forum/member.php?u=37086) ، شما اطلاع دارید که در همین مثال به خصوص ( با همین موضوع و فایلی که من فرستادم ) ، اگر می خواستیم که از آژاکس استفاده کنیم ، آژاکس این قضیه را چطوری پیاده سازی می کرد ؟ ( بیشتر منظورم منطق برنامه است و تعداد دفعاتی که آژاکس برای پاسخ به این قضیه با دیتابیس Connection می زند . آخه اگر مثل من فقط در یک ارتباط ، تمام اطلاعات را گرفته باشد ، که من هم همین کار را کرده ام . ولی اگر در چند ارتباط دارد ، این کار را انجام می دهد ، به نظر شخصی خودم کار خیلی جالبی نمی کند . چون یک آدم با تجربه به من گفت که همیشه باید سعی کنیم که اگر قرار باشد فشاری در ارتباط با Server و DataBase در کار باشد ، بهتر است که این فشار بیشتر روی Server باشد و نه روی DataBase . من قبول دارم که در داده های بالا ، گرفتن تمام اطلاعات در یک ارتباط کار صحیحی نیست . ولی مسئله این است که من رکوردهایم فقط 1300 رکورد یا بهتر بگم فیلد است . چون فقط یک فیلد از دیتابیس گرفتم. البته شاید بگوئید که آژاکس در پیاده سازی این قضیه که مثل شما نمی دانسته که طرف 1300 رکورد می خواهد یا کمتر یا بیشتر . یک حالت کلی را در نظر گرفته . خوب حرف من هم همین است که مثال من یک حالت کلی قرار نبوده که باشد . راستش اون چیزی که از اول تو ذهن من بوده ، بدست آوردن یک ماکزیمم رکوردی است که فقط با یک ارتباط با دیتابیس ، به سرعت و کارایی برنامه صدمه نزند . خوب حالا که من می دانم فقط با یک ارتباط با دیتابیس ، کارم راه می افتد ، چرا بروم و از آژاکسی استفاده کنم که چند بار با دیتابیس ، Connection می زند ؟ )

اینکه گفتید که روی آژاکس مطالعه بیشتری کن ، رجوع دوباره ای کردم . ولی نمی دانم در این تاپیک هایی که دیدم چرا از دیتابیس حرف نمی زنند و همه اش بحث Server است؟

با تشکر


ضمنا آقای Behrouz_Rad (http://barnamenevis.org/forum/member.php?u=7945) ، بنده همانطور که در صفحه ی قبل ( همین تاپیک ) دیدید ، صحبت های آقای raravaice (http://barnamenevis.org/forum/member.php?u=37086) ، را خیلی زود پذیرفتم . اصلا هم قصد نداشتم که با این برنامه ای که فرستادم ، ذهن دیگران را منحرف کنم . فقط به این دلیل که تصور می کردم که برنامه ای که فرستادم ، شاید به درد کسی بخورد ، این برنامه را فرستادم. نمی دانم هم چند بار تا الان توی همین تاپیک گفتم که این برنامه برای داده های بالا ، کارایی ندارد. البته بعد هم که raravaice (http://barnamenevis.org/forum/member.php?u=37086) گفت : برای همین مقدار داده هم بهتر است از آژاکس استفاده کنم ، بنده حرف ایشان را به عنوان یک آدم با تجربه قبول کردم .
آقای Behrouz_Rad (http://barnamenevis.org/forum/member.php?u=7945) ، دائم به دیگران تذکر می دهید که قوانین سایت را مطالعه کنید . بنده به شما یادآوری می کنم که یکی از قوانین سایتتان این بود که از جواب های دل سرد کننده به دیگران خودداری کنید. راستش این چندمین باری است که من از شما اینطور پاسخ دادن را می بینم ( و قطعا 2 پاراگراف توضیحی که الان به شما دادم ، فقط مخصوص این پستتان نیست )

محمدامین شریفی
شنبه 09 آذر 1387, 22:52 عصر
من شخصا از آن 2 تاپیکی که جناب RoostaYeBekr (http://www.barnamenevis.org/forum/member.php?u=78936) زدند بسیار استفاده کردم.بخصوص تاپیک قبلیشان که به من یک ایده داد.اتفاقا با این 2 تاپیک RoostaYeBekr (http://www.barnamenevis.org/forum/member.php?u=78936) جان دارند مبانی حرفه ای ajax را برای ما آماتورها میگویند.
من سواد زیادی ندارم که بخواهم نظر بدهم ولی RoostaYeBekr (http://www.barnamenevis.org/forum/member.php?u=78936) جان استفاده از asp.net ajax به معنی استفاده مدوام از پایگاه داده نیست.

narsic
یک شنبه 10 آذر 1387, 01:17 صبح
آجاکس اصلا باعث افزایش حجم نمیشه فقط به دوستانی که از اینترنت با سرعت کم استفاده میکنن کمک میکنه به برنامه نویس انعطاف میده .
از ذکر مزایای بیشتر خود داری میکنم.
موفق باشید

RoostaYeBekr
چهارشنبه 20 آذر 1387, 17:09 عصر
من یک برنامه برای همین صورت مسئله درست کردم ( با آژاکس ). لینک آن در آدرس زیر است :
http://barnamenevis.org/forum/showthread.php?t=134942

مشکلی که من در همان تاپیک هم مطرح کردم این است که گاهی ما می آئیم بار را روی Server کمتر کنیم و از آژاکس استفاده می کنیم . در حالیکه فشار بیشتری روی DataBase می آوریم.

الان کسانی که اعتقاد دارند که این قضیه باید با آژاکس حل می شد ، کاش به این تاپیک بالائی من سر می زدند.

در آن تاپیک ، درست است که دائم برنامه ام PostBack نمی شود ، ولی آیا این درست است که ما برای هر حرف ، دائم به دیتابیس Connection بزنیم ؟

همانطور که قبلا گفتم ، یک شخص با تجربه ای به من گفت که اگر قرار است فشاری بیاید ، اول باید روی Client ، بعد Server و بعد DataBase باشد .

در حالیکه با این کار آژاکس ، الویت بالا به هم می خورد.

درست است که برنامه ی من در سمت سرور دارد کدهای javascript و چیزهای دیگر را می سازد ، ولی حسنش این است که یک بار به دیتابیس Connenction می زند و دیگر هیچ ارتباطی با دیتابیس نمی زند. ضمنا وقتی که کار برنامه ی Server هم تمام شد ، دیگر هیچ ارتباطی حتی با خود برنامه ی Server هم لازم نیست برقرار شود و از آنجا به بعد کلیه ی کارها توسط Client انجام می شود.

(تمام نکات بالا ، برای همین صورت مسئله و همین مقدار 1300 رکوردی است که بنده گفتم )

RoostaYeBekr
چهارشنبه 20 آذر 1387, 21:48 عصر
من شخصا از آن 2 تاپیکی که جناب RoostaYeBekr (http://www.barnamenevis.org/forum/member.php?u=78936) زدند بسیار استفاده کردم.بخصوص تاپیک قبلیشان که به من یک ایده داد.اتفاقا با این 2 تاپیک RoostaYeBekr (http://www.barnamenevis.org/forum/member.php?u=78936) جان دارند مبانی حرفه ای ajax را برای ما آماتورها میگویند.
من سواد زیادی ندارم که بخواهم نظر بدهم ولی RoostaYeBekr (http://www.barnamenevis.org/forum/member.php?u=78936) جان استفاده از asp.net ajax به معنی استفاده مدوام از پایگاه داده نیست.
با سلام و تشکر
گفتید :


استفاده از asp.net ajax به معنی استفاده مدوام از پایگاه داده نیست

آخه ببینید ماهیت این برنامه و برنامه های AutoComplete ، ( اگر قرار باشد که مثل من نوشته نشود و مثلا از آژاکس استفاده شود ) ، مگر می تواند غیر از این باشد که برای هر حرف به دیتابیس Connection زده نشود . حالا توی همین لینکی که در زیر فرستادم :
http://barnamenevis.org/forum/showthread.php?t=134942
درست است که PostBack نمی شود ، ولی مگر می شود که Connection هم زده نشود ؟ پس اگر زده نشود ، داده ها چطور باید به برنامه بیایند؟

emad_67
چهارشنبه 20 آذر 1387, 22:17 عصر
خوب شما یک دفعه connect کن و بعد داده ها رو بریز تو DataSet و بعد از روی DataSet داده ها رو بخون و بده به کلاینت. البته من ajax کار نکردم و نمیدونم شدنی هست یا نه، ولی مطمئنا روش هایی بهینه تری هم هست

RoostaYeBekr
چهارشنبه 20 آذر 1387, 22:27 عصر
خوب شما یک دفعه connect کن و بعد داده ها رو بریز تو DataSet و بعد از روی DataSet داده ها رو بخون و بده به کلاینت. البته من ajax کار نکردم و نمیدونم شدنی هست یا نه، ولی مطمئنا روش هایی بهینه تری هم هست
با سلام و تشکر
بالاخره اینی هم که گفتید واسه خودش ایده ای هست که به ذهن خودم نرسیده بود.

کسی با نظر آقای عماد ، مخالفتی نداره و به نظرتون راه درستی هست؟:متفکر:

البته باز من خودم روی این مسئله ای که آقای عماد گفت ، یک کم حرف دارم ::لبخندساده:
چون ( در آژآکس ) و در پیاده سازی با DataSet ، برای خواندن داده ها هر بار از برنامه ی Server دارد کمک می گیرد. ( البته بهتره بگم که در برنامه ی آقای عماد ، این DataSet دارد فضا در حافظه می گیرد و به نظرم به دلیل اینکه قرار است PostBack نشود ، حافظه ی گرفته شده اش را هم پس نمی دهد)
در حالیکه در روش خودم ، یک بار روی DataBase ، Connection می خورد. یک بار Server کارش را انجام می دهد و بقیه ی کارها با Client است و دیگر هیچ ارتباطی با DataBase یا Server نیست. ( در برنامه ی من این فضا گرفته نمی شود . چون DataView من ، به صورت محلی فقط در یک متد تعریف شده و با خارج شدن از آن متد ، حافظه را پس می دهد )

eAmin
پنج شنبه 21 آذر 1387, 11:39 صبح
ببینم شما داری حرف چه آجاکسی رو می زنی . ms ajax رو میگی که خیلی بچه گانه هستش و یا اینکه خودت از اول می خوای توی ادیتور کد بزنی.

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

ببینم تا حالا شما ajax رو سمت سرور یا سمت کلاینت فرقی نمی کنه خودت از بیس کد هاش رو جنریت کردی یا نه؟

سلام.

ببین ms ajax بچگانه نیست!
ms ajax هم یه جور فریم ورک یا لایبرری هست، مثل jQuery , PrototypeJS و motools که برای راحت تر شدن استفاده از اون، اون رو به صورت کامپوننت و کنترل در آوردن تا بشه بهتر ازش استفاده کرد.
امکانات ms ajax کمتر از فریم ورکهای دیگه نیست، اگر شما بیشتر در رابطه با ms ajax اطلاعات کسب کنید مطمئنا متوجه می شید که چه امکاناتی رو برای شما فراهم می کنه، حجم بالای این فریم ورک بی دلیل نیست، در غیر اینصورت می تونستن فقط هسته اصلی ای جکس رو پیاده سازی کنن و به این اندازه حجمش رو نمی بردن بالا!

در ضمن من خودم هم از ms ajax استفاده نمی کنم، نه تنها اون بلکه از هیچ فریم ورکی استفاده نمی کنم، چون نیازی تا به حال بهشون نداشتم.

RoostaYeBekr
پنج شنبه 21 آذر 1387, 11:43 صبح
گفتید :




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

گفتم دیگه که برای دسترسی به اون برنامه آژاکسی به لینک زیر مراجعه کنید:
http://barnamenevis.org/forum/showthread.php?t=134942
لینک بالا هم از PageMethod استفاده می کند.

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

ضمنا کاش شما همین که گفتید:




ببینم تا حالا شما ajax رو سمت سرور یا سمت کلاینت فرقی نمی کنه خودت از بیس کد هاش رو جنریت کردی یا نه؟

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