الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ربط ال Gridview و ال Detailview

مغلق
بدأه جوليا في 14 أكتوبر 2006 · 18 رد · 2,502 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته ،

بعد قرائتي لكتاب المبرمج : أحمد عصام ، تعرفت على مكونين هامين هما : الـ girdview و الـ detailview المتوافران ضمن برنامج Microsoft Visual studio.net 2005

و التي يتم برمجتهما بلغة الـ ASP.Net المتخصصة ببرمجة تطبيقات الويب.

المكون Grideview يختص بعرض البيانات المخزنة في قاعدة البيانات على شكل جدول ، لكن اتضح لي بعد القراءة في MSDN المتوفر ضمن البرنامج،

أن هذا المكون لا يسمح بإجراء جميع عمليات على البيانات بشكل مباشر، فهو يسمح فقط بإجراء عملية الحذف ، و التعديل، و لكن لا يسمح بإجراء عملية الإضافة إلا بمساهمة مكونات أخرى ، كالـ Detailview و الـ Formview.

لذا أنشئت قمت بعرض البيانات عن طريق الـ Grideview ، و عند الضغط على الأمر Select الخاص بأي سجل ، يقوم بعرض البيانات للسجل المحدد و كما يسمح بعملية الحذف و التعديل و الإضافة عن طريق مكون الـ Detailview.

و الذي يتضح في الصورة التالية :

get-1160864134.jpg

لكن المشكلة انني ارغب في يتم عرض ا لـ girdview في صفحة و عند عملية التحديد يقوم بنقلي لصفحة آخرى تحتوي على المكون detailview المرتبط بالـgridveiw في الصفحة الأولى ، و عند الإنتهاء من عملية إجراء حذف أو اضافة أو تعديل ، يعود بي إلى الصفحة الأولى .

سؤالي: ما هي التقنية التي يمكنني استخدامها لعمل ذلك ، أو الأمر البرمجي الذي يمكن استخدامه، و ما هي الطريقة لذلك ؟

، و لكم الشكر.

تم تعديل هذه المشاركة بواسطة جوليا في 15 أكتوبر 2006 في 01:16

#2

انتظرني وسازودك بالكود ان شاء الله

#3

السلام عليكم.....

بداية اخي العزيز عليك وضع خاصية مهم ل gridview وهي : datakeynames.... حيث يتم في هذه الخاصية وضع الحقول التي سيتم ارجاعها من gridview وعادة ما يتم اختيار ال primarykey>>>> يعني مثلا لنفرض عندك جدول فيه معلومات عن الطالب.... وتريد عرض ما يلي في ال gridview :

studentid

studentname

studentlocation

ثم في detailsview تريد عرض باقي المعلومات عن الطالب في صفحة أخرى....... عندها يتم وضع ال gridview وعمل datasource حسب المطلوب.. ثم يتم وضع datakeynames property=studentid...........

بعد ذلك هناك حدث خاص ب gridview اسمه selectedindexchanged... نكتب فيه الكود التالي

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)

{

string x = this.GridView1.SelectedDataKey.Value.ToString();

int y = int.Parse(x);

Response.Redirect("الصفحة المراد اظهار التفاصيل عليها?value="+y+"");

}

هكذا نكون قد ارسلنا المتغير الراجع عند عمل select على شكل querystring

الان في الصفحة المراد اظهار التفاصيل عليها....... ضع ال detailsview ثم في ال datasource وبعد تجهيز جملة select نضغط على زر where

ونختار ان studentid مصدره querystring ونضع قيمته =value"اسم المتغير الذي تم ارساله مع querystring.......

هذه حسب معلوماتي الموتواضعة.............. انا جربتها وزبطت معي اتمنى تكون الصورة وضحت.....

اقبل تحياتي... سلام عليكم

#4

السلام عليكم و رحمة الله و بركاته ،

لقد قرأت الكود ، و لكني أحتاج الآن أن أدرس عن:

1/ الأمر البرمجي Response.Redirect.

2/ كيفية استخدام queryString .

لكي أستطيع أن انفذ الطريقة التي أقترحتها ،

شكرا لاهتمامك ،

، أعود لاحقا بعد إلمامي بالنقاط المذكورة .

#5

بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته ،

الأخ الكريم / T.D.A

في الواقع جربت الطريقة التي ذكرتها لي ، حيث انني أعمل بلغة الـ VB.Net.

و أضفت الكود التالي:

 Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
		Dim x As String = GridView1.SelectedDataKey.Value.ToString()
		Dim y As Integer = Integer.Parse(x)
		Response.Redirect("newpage.apx?Value=" + y + " ")

	End Sub

الا أن ذلك سبب لي حدوث استثناء في جملة Response.Redirect ، حيث أنه يخبرني بأنه لا يمكن تحويل من String إلى Double.

و بما أنني معرفتي ضعيفه ببيئة الدوت نت ، و الـ ASP.Net بشكل خاص ، ارتأيت أن أدرس عن هذا الطريقة ، لكنني للأسف المصادر التي بحث بها ، غير واضحه بالنسبة لي .

، لا أعلم اذا كان هنالك طريقة أخرى يمكنني تنفذيها ، فقد قرأت عن مفهوم الكوكيز و السيشن ، و لكن غير ملمة بمفهومها بشكل دقيق أو بالأحرى كيفية استخدامها ضمن الكود.

، فإذا توفرت لديك معرفة بالمشكلة التي واجهتني و حلا لها ، أرجو أن تفيدني بها.

، و إذا توفر هنالك تقنية ما يمكنني تطبقيها ، أو حتى القراءة عنها و الوصول لها ، أرجو أن لا تبخلوا عليها بإخباري عنها .

، و لكم تحيه.

#6

السلام عليكم.....

صراحة انا مبتدئ تقريبا مثلك تمام.. ولكني قرات بعض المصادر وألممت ببعض المعلومات.....

انا جربت الطريقة التي اخبرتك وكانت اول مرة اجربها لاني كما قلت لك مبتدئ ولكن زبطت معي..........

بامكانك عدم استخدام querystring واللجوء الى كوكيز او سيشن واستعمالهما سهل وبسيط........

على كل حال جرب التغيير التالي.....

response.redirect("pagename?value='"+y+'")

لا اعرف ما المشكلة عند استخدام vb صراحة..... لكن جرب وحاول اكيد حتزبط.........

اليك هذا الينك وفيه 14 درس فيديو ممتازات وفيه معظم المواضيع المطلوب معرفتها في asp.net ......دروس فيديو

كنت اتمنى الافادة اكثر لكن هذا ما اقدر عليه... تحياتي

تم تعديل هذه المشاركة بواسطة T.A.D في 16 أكتوبر 2006 في 15:44

#7

السلام عليكم و رحمة الله و بركاته ،

الأخ الكريم / T.A.D

لقد جربت التغيير الذي ذكرته لكن ذلك لم يجدي نفعا معي ، ،

اشكرك كثيرا على الدروس التي وضعتها لي ، و سوف أبدا بدراستها من الآن،

و إن شاء الله حالما أوفق بإيجاد الحل المطلوب ، سوف أضعه ضمن هذا الموضوع ،

حتى ذلك الوقت أنتظر مشاركة أعضاء المنتدى،

و شكرا لك مرة أخرى.

، لك أطيب تحية.

#8

المشكلة ان اخوننا المحترفين كانهم مقاطعين المشاركات والرد على الاسئلة والا لكما تجرأ واحد مثلي أن يرد على موضوع..... ننتظر المشاركة...

#9

السلام عليكم و رحمة الله وبركاته ،

في الواقع لقد فكرت بالطريقة التي ذكرتها ،، اعتقد انها ستحدث خلل ما ،

افترض انني جعلت خاصية الـ sorting أو الـ paging مفعلة !!

فعند الضغط عليها معناها اني احدث تغيير في الـ Gridview !!

و كما اشرت في الـ Handler الخاص بحدوث اي تغيير في الـ girdview ، فإنه سينقلني للصفحة الأخرى ،،

و بذلك لن أستطيع تنفيذ أي أوامر أخرى مضافة للـ Gridview !!!

ما هو رايك في هذه المشكلة ؟؟؟

، تحياتي.

#10

يقوم هذا الكود بعرض سجل في قاعدة بيانات , وهذا السجل يتم البحث عنه عن طريق رقم المعرف الخاص بجدول الموظفين وهو emp_id

نقوم بإنشاء Function وهنا قمت بتسميته getPageIndex , والقيمة الممرة له ,هي عبارة رقم السجل المطلوب , اي الرقم المعرف

مثلا الموظف أسامة له الرقم 5 , وبالتالي نمرر ال 5 إلى الاجراء لكي نسطيع الوصول إلى هذا السجل بالتحديد

بفرض أن fvtblEmp هي عبارة عن ال FormViwe ,

استدعاء الاجراء ضمن الحدث On_Load للصفحة

fvtblEmp.PageIndex = getPageIndex("5");

طبعا نستطيع التعويض عن الرقم 5 بأي قيمة ,مثلا من Session أو Request , هذه الطريقة مجربة وموجودة في القوالب التي عملتها عن طؤيق MyGeneration ويمكن تجرتبها في الموقع التالي

http://www.tasks.somee.com/tblEmp/ShowtblEmpTable.aspx

والله ولي التوفيق

الأكواد

انشاء الاجراء

protected int getPageIndex(string value)
	{
		int ind = 0;
		if (fvtblEmp.DataItem != null)
		{
			DataView dv = ((DataRowView)fvtblEmp.DataItem).DataView;
			for (int i = 0; i < dv.Count; i++)
			{
				if (dv["emp_id"].ToString() == value)
				{
					ind = i;
					break;
				}
			}
		}
	   return ind;
	}

مجموعة الدوت نت في السعودية , اشترك معنا لتحصل على كل مفيد في عالم الدوت نت

dotnetinsaudi-subscribe@yahoogroups.com

#11
جوليا كتب:
السلام عليكم و رحمة الله وبركاته ،

في الواقع لقد فكرت بالطريقة التي ذكرتها ،، اعتقد انها ستحدث خلل ما ،

افترض انني جعلت خاصية الـ sorting أو الـ paging مفعلة !!

فعند الضغط عليها معناها اني احدث تغيير في الـ Gridview !!

و كما اشرت في الـ Handler الخاص بحدوث اي تغيير في الـ girdview ، فإنه سينقلني للصفحة الأخرى ،،

و بذلك لن أستطيع تنفيذ أي أوامر أخرى مضافة للـ Gridview !!!

ما هو رايك في هذه المشكلة ؟؟؟

، تحياتي.

الاخت جوليا... سلام عليكم....

يبدو انك فهمتي ما قصدته بصدور الحدث event .... في الكود الي كتبته انا وضعت handler فقط ل event عين وهو onselectedindexchange وهذا لا يصدر الا عند تغيير الاختيار وليس عند عمل sorting or paging فهذه لها احداث خاصة بها....

تحياتي

#12
T.A.D كتب:
الاخت جوليا... سلام عليكم....

يبدو انك فهمتي ما قصدته بصدور الحدث event .... في الكود الي كتبته انا وضعت handler فقط ل event عين وهو onselectedindexchange وهذا لا يصدر الا عند تغيير الاختيار وليس عند عمل sorting or paging فهذه لها احداث خاصة بها....

تحياتي

:unsure: نعم، بالفعل كلامك صحيح ، و لكن اشتبهت علي الأمور ، اشكرك للتوضيح.

_________

العضو الكريم / oneforall2012

اشكرك كثيرا على المحاولة لافادتي ، و لكني لم افهم الطريقة جيدا بسبب عدم المامي بموضوع الـ session .

_________

ختاما :

لقد وجدت الحل لهذه المشكله و شرح مفصل يشرح الطريقة لعمل ذلك بأقل جهد ممكن .

اضغط هنا لقراءة المثال التوضيحي للحل

أرجو أن يكون الحل واضحا بالنسبة لكم .

، تقبلوا خالص تحياتي و شكري.

#13

لنفترض أنكي قمتي بتصميم صفحتين الأولي تحتوي علي الجريد .. والثانية تحتوي علي الديتالز ... في الصفحة الأولي أكتبي الكود التالي :

Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

Dim x As String = GridView1.SelectedDataKey.Value.ToString()

Response.Redirect("DetailsView.aspx?Value=" & x)

End Sub

وفي الصفحة الثانية قم بضبط مصدر البيانات الخاص بالاداة ديتالز فيو بحيث يعمل من خلال query string وذلك بالتوجه للجملة where عند إعداد مصدر البيانات ... ولاتنسي أن تضع كلمة value داخل الحقل query string field عند إعداد مصدر البينات ....

هكذا إن شاء الله يعمل الكود

في حالة وجود أي مشاكل أرجو ان تسألوا

#14

هناك طريقة اخري أفضل من هذه الطريقة .. حيث أن عيب الطريقة السابقة أنه يمكن للمستخدم ان يكتب أي رقم في الـ address bar بعد المخزن value ومن ثم يعرض بقية بيانات الطلاب .. ونحن لانريد ان تظهر هذه البيانات في الـ address Bar .. لذا يمكننا إستخدام البروفيل .. وذلك من خلال التالي :

1- قم بالتوجه لملف الـ web.config وافتحه وقبل نهاية الكود الخاص بملف الـ web.comfig تحديدا قبل الوسمين التاليين :

</system.web>

</configuration>

سنضيف الكود التالي :

<anonymousIdentification enabled="true"/>

<profile enabled="true">

<properties>

<add name="MyNewProperty" allowAnonymous="true" />

</properties>

</profile>

2- وهكذا نكون قد أنشانا مخزن بإسم MyNewProperty وسنقوم بتخزين رقم الطالب بداخله في الصفحة الاولي ثم نرسلهالي الصفحة الثانية .... ولكي نقوم بذلك تابع التالي .... قم بفتح الصفحة الاولي ثم قم بكتابة الكود التالي :

Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

Dim x As String = GridView1.SelectedDataKey.Value.ToString()

Profile.MyNewProperty = Val(x)

Response.Redirect("DetailsView.aspx"

End Sub

3- الأن توجه إلي الصفحة الثانية .. وقم بعمل Configure Data Source للأداة Details View وعند الـ Where Close قم بإختيارالعمود الذي تريد أن تعمل من خلاله ثم في خانة source إختار Profile بدلاً من query String ثم في الخانة Property Name إكتب MyNewProperty ....

جربوا وإن شاء الله خير

تم تعديل هذه المشاركة بواسطة hotkito في 18 نوفمبر 2006 في 03:19

#15

الطريقة الثالثة وهي من خلال الـ session .. ولكي نستخدم الـ session يجب علينا أولاً عمل مجموعة من الخطوات :

1- قم بعمل add new item وإختار Global Application Class وعند إضافة هذا الملف ستجد أن هناك ملف جديد قد تم إضافته إلي نافذة متصفح المشروع .. المهم انك ستجد كود أمامك يحتوي علي أكثر من حدث فرعي .. الحدث الفرعي الذي سنتعامل معه هو session_start .. توجههي إليه وبداخله أكتبي الكود التالي :

Session.Add("NewValue", "")

الكود السابق كان لإنشاء مخزن بإسم newvalue سنخزن فيه الـ id الخاص بالطالب مثلاً ...

2- الأن نتوجه لصفحة الأولي التي يوجد بها أداة الـ GridView ونكتب الكود التالي :

Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

Dim x As String = GridView1.SelectedDataKey.Value.ToString()

Session.Add("NewValue", Val(x))

Response.Redirect("DetailsView.aspx")

End Sub

3- الأن توجههي إلي الصفحة الثانية وقم بعمل Configure للأداة Details View وفي الـ Where Close غختاري العمود الذي تريدين التعامل من خلاله ثم إختاري Session من الخانة Source وفي الخانة Session Field قم بكتابة NewValue ...

جربي وإن شاء الله خير

أرجو أن أكون أجبت علي أسئلتك وألا أكون قد فهمت مشكلتك خطأ

#16

السلام عليكم و رحمة الله و بركاته ،

مدهش!! بل أكثر من رائع !

لقد جربت الطرق التي ذكرتها، و هي :

- الطريقة الأولى باستخدام الـ query string .

- الطريقة الثانية باستخدام الـ Profile .

- الطريقة الثالثة باستخدام الـ Session.

و جميعها قد تمت معي بنجاح.

كم هو جميلٌ أن أتعلم جميع هذه الطرق و من مصدر واحد فقط.

أشكرك hotkito لتعاونك و اهتمامك بإيجاد الحل بأسلوب بارع و بسيط .

، لكم شكري و تقديري .

#17

إن طريقة الأخ hotkito تعتمد على Where وبالتالي في لا يمكن أن يكون هناك تصفح DataDetials

اي أنه لايمكنني تصفح السجل السابق ولا اللاحق ولا حتى السجلات الأخرى , لذلك فهذه الطريقة تستخدم فقط في عملية أنني اريد التفاصيل لسجل واحد ومن اجل السجل الذي يليه يجب أن ارجع إلى الصفحة السابقة

بالنسبة للطريقة التي كتبتها سابقا والحقيقة أنني لم أجد أي تعليق عليها , فتخدم هذه النقطة أي ان يكون هناك تصفح للسجلات وفق ال Detials

على كل شكرا للاخوة على الحلول

والله الموفق

مجموعة الدوت نت في السعودية , اشترك معنا لتحصل على كل مفيد في عالم الدوت نت

dotnetinsaudi-subscribe@yahoogroups.com

#18

السلام عليكم و رحمة الله و بركاته ،

الأخ الكريم / oneforall2012

يمكنك مراجعة الردود لتجد أني قد علقت على ا لطريقة التي ذكرتها ، و هي كالتالي:

اقتباس
العضو الكريم / oneforall2012

اشكرك كثيرا على المحاولة لافادتي ، و لكني لم افهم الطريقة جيدا بسبب عدم المامي بموضوع الـ session .

الطريقة التي ذكرتها لم تكن واضحة لي ، لذلك اشرت لك بذلك لعلك تعطيني تفاصيل بشكل أدق،

و من ناحية أخرى أنا أعمل في بيئة الفيجوال بيسك و الكود الذي كتبته بلغة السي ، مما يسبب لي بعض التشويش في تحويل الكود لـ لغة الفيجوال بيسك نت .

أعذرني و لكني مجرد مبرمجة مبتدئه في الـ Asp.net 2 Edition و التلميح لا يكفيني حتى ادرك الكيفية التي يمكنني بها انجاز العمل المطلوب.

، تقبل اعتذاري و فائق احترامي و لكم جزيل الشكر.

تم تعديل هذه المشاركة بواسطة جوليا في 3 ديسمبر 2006 في 11:59

#19

الحقيقة لم أقرأ تعليقك على الموضوع!!!واعتذر عن سوء التفاهم

والطريقة التي ذكرتها معقدة قليلا ,وان شاء الله سأحاول أن اشرحها لاحقا مع بعض الميزات الجميلة لل GridView and FormView

والله الموفق

مجموعة الدوت نت في السعودية , اشترك معنا لتحصل على كل مفيد في عالم الدوت نت

dotnetinsaudi-subscribe@yahoogroups.com

هذا الموضوع مغلق.

مواضيع مشابهة