PDA

View Full Version : گفتگو: GridView و استفاده Ajax برای ویرایش یک رکورد آن



mohsen_zelzela00
چهارشنبه 19 اسفند 1388, 21:17 عصر
با سلام خدمت اساتید محترم


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

http://barnamenevis.org/forum/attachment.php?attachmentid=45418&d=1268241291

(در ضمن نمی خواهم از کنترل Toolkit استفاده کنم)

Milad Mohseny
پنج شنبه 20 اسفند 1388, 01:23 صبح
ميتوني با توابع javascript هم اين كارو انجام بدي مثلاً اوني كه به فكر من ميرسه اينه
شما تو حالت عادي اگه اطلاعات مثلاً نوع ترخيص رو داخل lable يا غيره تو Gridview نمايش بدي و براي اون id در نظر بگيري تو رويداد onclick يا onclientclick كليد ويرايش ميتوني تابع جاوااسكريپتت رو صدا كني و با document.getElementById اون lable مورد نظر رو پيدا كني و مقدار innerHTML اون رو به value شي textbox مربوطه مثلاً نوع ترخيص نصبت بدي و الي آخر.

mohsen_zelzela00
پنج شنبه 20 اسفند 1388, 11:38 صبح
ميتوني با توابع javascript هم اين كارو انجام بدي مثلاً اوني كه به فكر من ميرسه اينه
شما تو حالت عادي اگه اطلاعات مثلاً نوع ترخيص رو داخل lable يا غيره تو Gridview نمايش بدي و براي اون id در نظر بگيري تو رويداد onclick يا onclientclick كليد ويرايش ميتوني تابع جاوااسكريپتت رو صدا كني و با document.getElementById اون lable مورد نظر رو پيدا كني و مقدار innerHTML اون رو به value شي textbox مربوطه مثلاً نوع ترخيص نصبت بدي و الي آخر.

این روش جالبی هست ولی یه مسله دیگه که هست اینه که بعضی از جدول های DataBase حاوی فیلد های زیادی هستند(مثلاً29 فیلد) که من 10 فیلد از آن را در Grid خودم نشان میدم ولی وقتی روی آیکون ویرایش کلیک میکنه میخوام تمام فیلدها رو در textbox ها نشون بده

ممنون میشم کمک کنید

Milad Mohseny
پنج شنبه 20 اسفند 1388, 14:54 عصر
این روش جالبی هست ولی یه مسله دیگه که هست اینه که بعضی از جدول های DataBase حاوی فیلد های زیادی هستند(مثلاً29 فیلد) که من 10 فیلد از آن را در Grid خودم نشان میدم ولی وقتی روی آیکون ویرایش کلیک میکنه میخوام تمام فیلدها رو در textbox ها نشون بده
خوب با يه حلقه ميشه روشي كه گفتم رو براي همه textbox ها انجام بدي براي راحتي كار id مربوط به textbox ها رو با يه قانون خاص نام گذاري كن مثلاً txt_1 , txt_2, txt_3 ,... كه با يه حلقه به راحتي ميشه به همشون دسترسي پيدا كرد.

mohsen_zelzela00
پنج شنبه 20 اسفند 1388, 15:20 عصر
خوب با يه حلقه ميشه روشي كه گفتم رو براي همه textbox ها انجام بدي براي راحتي كار id مربوط به textbox ها رو با يه قانون خاص نام گذاري كن مثلاً txt_1 , txt_2, txt_3 ,... كه با يه حلقه به راحتي ميشه به همشون دسترسي پيدا كرد.


مشکل این نیست مشکل اینه که من مقدار 10 فیلد را به label ها نسبت می دم ولی وقتی می خوام ویرایش کنم انتظار دارم که تمام 29 فیلد را در textbox های مربوطه نشان دهد با توجه به اینکه برای استفاده از DOM من باید مقدار هر 29 فیلد را درون 29 Label قرار دهم و پس از کلیک بر آیکون ویرایش اطلاعات رو از این 29 label بخونم و. درون textbox ها نشون بدم

Milad Mohseny
پنج شنبه 20 اسفند 1388, 15:27 عصر
مشکل این نیست مشکل اینه که من مقدار 10 فیلد را به label ها نسبت می دم ولی وقتی می خوام ویرایش کنم انتظار دارم که تمام 29 فیلد را در textbox های مربوطه نشان دهد با توجه به اینکه برای استفاده از DOM من باید مقدار هر 29 فیلد را درون 29 Label قرار دهم و پس از کلیک بر آیکون ویرایش اطلاعات رو از این 29 label بخونم و. درون textbox ها نشون بدم
متوجه شدم. شما ميتوني اون اطلاعاتي كه تو كلاينت و در حال نمايش داري رو با روشي كه گفتم بهtextbox هاي متناظر نسبت بدهي و براي فيلد هايي كه تو صفحه نداري ajax رو با callback پياده سازي كني (نمونه (http://barnamenevis.org/forum/showthread.php?t=52380)) و مثلاً فيلد كليدي ركورد جاري رو بفرستي سمت سرور و جستجو رو انجام بدي و مقدار بقييه فيلد هارو به سمت كلاينت بفرستي و به textbox هاي متناظر نسبت بدهي

mohsen_zelzela00
یک شنبه 23 اسفند 1388, 10:47 صبح
دوست عزیز من کد زیر رو برای کدهای DOM استفاده کردم




<script language="javascript" type="text/javascript">

function bb() {

var x = document.getElementById("CLEARANCE_ID").innerHtml;
alert(x)

}


</script>



ولی جواب نمی ده ممنون میشم اگه کدی که نوشتم مشکلی داره بهم بگید

راستی یک سوال دیگه ای که در این ضمینه دارم اینه که وقتی من روی آیکون ویرایش کلیک می کنم همه Litral ها مثلاً ستون CLEARANCE_ID یک ID دارند حالا خود برنامه از کجا باید بفهمد که من کدام رکوردد مد نظرم است

ممنون

mehdi.mousavi
یک شنبه 23 اسفند 1388, 22:38 عصر
با سلام خدمت اساتید محترم
من یک Grid به صورت زیر طراحی کردم و میخوام وقتی که کاربر بر روی آیکون ویرایش کلیک کند بدون postBack اطلاعات را در textbox های بالای آن نمایش دهد من در اینجا فقط با قسمت Ajax آن مشکل دارم ممنون میشم اگه من رو راهنمایی کنید (در ضمن نمی خواهم از کنترل Toolkit استفاده کنم)

سلام.
شما چند راه دارید:


اطلاعاتی که میخواهید توی Grid نشون بدید رو بصورت XML Data Island به client برگردونید و سپس توی Client، جدول رو Bind کنید و ... هر وقت هم روی Edit هر Row کلیک شد، میتونید اطلاعات مورد نظر row رو با ID مربوطه توی XML (بازهم سمت Client) پیدا کنید، و TextBox ها و کلا کنترلهای موجود مورد نظر رو پر کنید. این کار مستلزم این هستش که به JavaScript مسلط باشید.
میتونید از Client Callback ها استفاده کنید. ASP.NET امکانی داره به اسم Client Callback که بهتون اجازه میده فراخوانی یک متود Client-Side منجر به فراخوانی متودی سمت سرور بشه. بدین ترتیب شما میتونید بدون انجام عمل Full Postback، اطلاعات اون ردیف خاص رو در بگیرید و در Client بازهم با استفاده از JavaScript اونها رو به درون فیلدهای مورد نظر خودتون کپی کنید. البته دقت کنید که اطلاعات بصورت XML (در حالت پیش فرض) به Client بر میگرده. بعضیها، (از جمله خود من)، ترجیح میدن اطلاعات رو بصورت JSON دریافت کنن تا اطلاعات کمتری توی این رفت و برگشت ها از (یا به) سرور منتقل بشه. برای اینکار هم باید با HttpModule و برخی دیگه از مفاهیم آشنا باشید که فعلا توصیه میکنم JSON رو برای شروع نادیده بگیرید.
میتونید یک Web Method توی Page یا وب سرویسی مجزا داشته باشید، و با استفاده از Proxy ای که بطور خودکار تولید میشه، براحتی اطلاعات مورد نظر رو از سرور (با فراخوانی وب متود) بگیرید و بازهم با JavaScript اونها رو در TextBox ها و فیلدهای مورد نظر خودتون پر کنید.
می تونید از دو UpdatePanel مجزا استفاده کنید (که البته اینجا اطلاعات بیشتری روی خط رد و بدل خواهد شد). بدین ترتیب که در UpdatePanel اول، اون بخش از فرم رو قرار میدید که در بالا قرار گرفته. در UpdatePanel دوم میتونید GridView رو قرار بدید. وقتی روی Row ای Click شد، میتونید UpdatePanel بالایی رو فقط Refresh کنید، بدین ترتیب UpdatePanel پایینی دست نخواهد خورد. خوبی این روش اینه که همه چی سمت سرور انجام میشه، اما بدیش اینه که Full Postback هستش، در واقع Page Life Cycle بطور کامل سمت سرور (برای این صفحه) اجرا میشه و کل اطلاعات به Client بر میگرده، اما فقط بخش مورد نظر (Panel بالایی) Update خواهد شد.
میتونید از jQuery استفاده کنید. با jQuery میتونید اطلاعات رو از طریق وب متود یا وب سرویسی سمت سرور دریافت کنید (ترجیحا به فرمت JSON، چون jQuery ابزار لازم برای کار با JSON رو در اختیارتون قرار میده)، و سپس براحتی فیلدهای مورد نظر رو پر کنید.

روش دیگه ای به ذهنم نمیرسه :) موفق باشید.

mohsen_zelzela00
یک شنبه 23 اسفند 1388, 22:52 عصر
سلام.
شما چند راه دارید:


اطلاعاتی که میخواهید توی Grid نشون بدید رو بصورت XML Data Island به client برگردونید و سپس توی Client، جدول رو Bind کنید و ... هر وقت هم روی Edit هر Row کلیک شد، میتونید اطلاعات مورد نظر row رو با ID مربوطه توی XML (بازهم سمت Client) پیدا کنید، و TextBox ها و کلا کنترلهای موجود مورد نظر رو پر کنید. این کار مستلزم این هستش که به JavaScript مسلط باشید.
میتونید از Client Callback ها استفاده کنید. ASP.NET امکانی داره به اسم Client Callback که بهتون اجازه میده فراخوانی یک متود Client-Side منجر به فراخوانی متودی سمت سرور بشه. بدین ترتیب شما میتونید بدون انجام عمل Full Postback، اطلاعات اون ردیف خاص رو در بگیرید و در Client بازهم با استفاده از JavaScript اونها رو به درون فیلدهای مورد نظر خودتون کپی کنید. البته دقت کنید که اطلاعات بصورت XML (در حالت پیش فرض) به Client بر میگرده. بعضیها، (از جمله خود من)، ترجیح میدن اطلاعات رو بصورت JSON دریافت کنن تا اطلاعات کمتری توی این رفت و برگشت ها از (یا به) سرور منتقل بشه. برای اینکار هم باید با HttpModule و برخی دیگه از مفاهیم آشنا باشید که فعلا توصیه میکنم JSON رو برای شروع نادیده بگیرید.
میتونید یک Web Method توی Page یا وب سرویسی مجزا داشته باشید، و با استفاده از Proxy ای که بطور خودکار تولید میشه، براحتی اطلاعات مورد نظر رو از سرور (با فراخوانی وب متود) بگیرید و بازهم با JavaScript اونها رو در TextBox ها و فیلدهای مورد نظر خودتون پر کنید.
می تونید از دو UpdatePanel مجزا استفاده کنید (که البته اینجا اطلاعات بیشتری روی خط رد و بدل خواهد شد). بدین ترتیب که در UpdatePanel اول، اون بخش از فرم رو قرار میدید که در بالا قرار گرفته. در UpdatePanel دوم میتونید GridView رو قرار بدید. وقتی روی Row ای Click شد، میتونید UpdatePanel بالایی رو فقط Refresh کنید، بدین ترتیب UpdatePanel پایینی دست نخواهد خورد. خوبی این روش اینه که همه چی سمت سرور انجام میشه، اما بدیش اینه که Full Postback هستش، در واقع Page Life Cycle بطور کامل سمت سرور (برای این صفحه) اجرا میشه و کل اطلاعات به Client بر میگرده، اما فقط بخش مورد نظر (Panel بالایی) Update خواهد شد.
میتونید از jQuery استفاده کنید. با jQuery میتونید اطلاعات رو از طریق وب متود یا وب سرویسی سمت سرور دریافت کنید (ترجیحا به فرمت JSON، چون jQuery ابزار لازم برای کار با JSON رو در اختیارتون قرار میده)، و سپس براحتی فیلدهای مورد نظر رو پر کنید.

روش دیگه ای به ذهنم نمیرسه :) موفق باشید.

ببخشید استاد به نظر شما کدام روش بهتره و که بتونم سریع اون رو پیاده کنم چون وقت زیادی ندارم شاید 2 یا 3 روز و پرژه من تقریباً کامل هست ولی در این مورد خیلی دارم اذیت میشم
(الته نمی خوام از updatePanel استفاده کنم و می خوام کد بنویسم)

mehdi.mousavi
یک شنبه 23 اسفند 1388, 23:11 عصر
ببخشید استاد به نظر شما کدام روش بهتره و که بتونم سریع اون رو پیاده کنم چون وقت زیادی ندارم شاید 2 یا 3 روز و پرژه من تقریباً کامل هست ولی در این مورد خیلی دارم اذیت میشم (الته نمی خوام از updatePanel استفاده کنم و می خوام کد بنویسم)

روش سوم (http://www.asp.net/ajax/documentation/live/Tutorials/ExposingWebServicesToAJAXTutorial.aspx) از همه ساده تر هستش، سرعتش هم خوبه. چند ساعت وقت بذارید، خوب میتونید یاد بگیرید که چطور می تونید از این روش استفاده کنید. بقیه وقتتون رو هم برای پیاده سازی بذارید. :)

موفق باشید.