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

تعلم تقنية Data Binding بشكل معمق مع مثال عملي

مغلق
بدأه Arwany في 7 يونيو 2007 · 12 رد · 4,382 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

بعد بسم الله الرحمن الرحيم حابب اعرض عليكم هيك صفحة صغيرة عملتها أنا وطبقت فيها مفهوم كتير كتير مهم بال ASP.NET ألا وهو Data binding

شو مفهوم هالكلمة ؟

هو عملية طلب بيانات من مصدر بيانات معين وتنسيقها ضمن عنصر عرض بيانات يدعم Databind

وين ممكن نطبق هاذا المفهوم ؟ هون السؤال

أرجو تحميل الملف المرفق وفك ضغطه والمتابعة لأنو الموضوع بجد بيستاهل (برأيي الشخصي).

الملفات منشورة على مجلدي الخاص على الانترنت :

http://aspspider.biz/arwany/Binding.aspx

أرجو زيارة الرابط وتجريب الصفحة

رح نستعرض مع بعض هالصفحة اللي كتير تعتبر فعالة وتعطي خلفية عن هالمفهوم بالعمق

بالبداية رح اشرح شو بدنا نساوي بهالصفحة (غرض الصفحة)

غرض الصفحة انشاء ويب فورم لادخال بيانات بشكل مؤقت (ودققلي على هالكلمة شوي) للأعضاء وبعد الانتهاء من ادخال البيانات ارسالها إلى قاعدة بيانات أو أي مكان لحفظ البيانات فيه

طيب ...

بس أول شي رح أعملو رح انشئ صنف وسميه BoundClass وهالكلاس رح يكون عبارة عن سجل لكل عضو من هالأعضاء ( الكلام رح يتوضح شوي شوي)

هلأ كل عضو الو مجموعة من الخصائص التالية:

معرف (ID)

اسم

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

موقع انترنت

ملاحظات عامة

الحالة (ذو حساب مفعل أو معطل)

ورح تكون سمة هذا الكلاس هي أنه Serializable (لمزيد من المعلومات حول خصائص الأصناف يرجى البحث قليلا لأن هذا الموضوع ليس موضوع نقاشنا)

طيب هلأ بعد ما أنشأنا الكلاس متل ما موضح هون شو الخطوة التالية ؟؟؟

[Serializable]
public class BoundClass
{
	private string PID;
	private string PName;
	private string PEmail;
	private string PWebsite;
	private string PRemarks;
	private int PActive;

	public string ID
	{
		get { return PID; }
		set { PID = value; }
	}
	public string Name
	{
		get { return PName; }
		set { PName = value; }
	}
	public string Email
	{
		get { return PEmail; }
		set { PEmail = value; }
	}
	public string Website
	{
		get { return PWebsite; }
		set { PWebsite = value; }
	}
	public string Remarks
	{
		get { return PRemarks; }
		set { PRemarks = value; }
	}
	public int Active
	{
		get { return PActive; }
		set { PActive = value; }
	}

}

أنا مفترض انو انتو بتعرفو طريقة انشاء الكلاسات وما معنى الخصائص الخاصة بها (لمزيد من العلومات يرجى القراءة قليلا عن الموضوع لأنه ليس موضوع نقاشنا هنا)

هلأ منلاحظ انو هادا الكلاس فقط وفقط لحفظ البيانات بشكل منسق وطبعا هنالك الكثير من الحلول لحفظ البيانات بشكل منسق أفضل من هذا ولكن هنالك قصد من وراء انشائه ستدركونه بعد قليل ...

هلأ الخطوة التالية وهي وضع عنصر عرض بيانات على الويب فورم وهذا الأمر يعود لكم بشكل تام حيث أنني فضلت وضع GridView المحبب الى قلبي كثيرا (كل مبرمج له نكهة خاصة به) .

هلأ هذا العنصر من العناصر الهامة جدا حيث يدعم خاصية ال Databind الملبية لغرض مثالنا الحالي

حسنا سنقوم سوية بانشاء قسم لادخال البيانات وليكن Panel تحتوي على جدول وهو بدوره يحتوي على مجموعة من عناصر الادخال (TextBox) بالاضافة لعنصر أخير وهو عنصر اختيار مجبر (واحد من كل) (RadioGroup)

طيب

لنفترض انو كل طالب له سجل خاص فيه ... طيب

سنقوم (عند الضغط على زر ادخال البيانات ) بانشاء كائن في الذاكرة من هذا الكلاس (BoundClass) وسنقوم بتعبئة قيم خصائه تبعا للقيمة المدخلة من قبل المستخدم (يرجى مراجعة الملفات المرفقة للفهم المعمق معي)

هلأ البيانات جاهزة بالكائن ... شو الخطوة التالية ؟؟؟

هلأ رح نقوم بحفظها ضمن لائحة (ArrayList) التي تدعم حفظ لوائح العناصر من أنواع مختلفة (تماما كالمصفوفات) ولكنها الجيل الجديد منها المدعوم بشكل كبير في ASP.NET

هلأ هذا الغرض المكون من لائحة تضم غرض واحد سيتم حفظها في ذاكرة المتصفح الخاص بالمستخدم (Browser)وهنا نلاحظ أهمية خاصية Serializable للكلاس المسبق ذكره (BoundClass)

طيب في المرة التالية من ادخال البيانات سيتم استخراج الغرض (ArrayList) من ذاكرة المستعرض وتحويلها إلى غرض لائحة عناصر ومن ثم اضافة بيانات العضو التالي وحفظها مرة أخرى ضمن ذاكرة المستعرض

طيب ممكن واحد يقلي .. ليش في ذاكرة المستعرض ؟؟؟

طيب الجواب عن هذا السؤال سهل وهو أن هذه البيانات ليست بيانات ذات سرية تتضمن حفظها على ذاكرة السيرفر كما أن هذه البيانات من الممكن أن تضم كمية كبيرة من البيانات (ممكن يجي على بالك تخزن سيرة ذاتية ضمن الذاكرة) وبالتالي ستنقص فعالية السيرفر الخاص بك (فقط في حالة الطلب الكثيف على موقعك ولكن بالحالة العادية لا بأس)

على كل حال أنت حر في مكان تخزين هذه القية أين ما أردت ولكنني أنصح بشدة في تخزينها هنا لأن هذه الذاكرة لا تفنى (تنتهي مدة صلاحيتها) فهي في ذاكرة المستعرض وباقية ما بقي المستعرض مفتوحا

حسنا هلأ بتجي الخطوة المهمة وهي عرض البيانات في عنصر عرض بيانات

ببساطة قم بتعيين خاصية عنصر البيانات Datasource لتؤشر على الغرض (لائحة الأعضاء) ونعرض الآن ما هي لائحة الأعضاء حيث هي لائحة من الأغرض من نوع BoundClass ..

ثم قم بعمل Databind() أي استدعي هذا الاجراء لعنصر عرض البيانات حيث سيأتي بالبيانات ويعرضها عليك في عنصر عرض البيانات بشمكل رائع

طيب لتحيسن العرض وتعميق مستوى الفهم لل Databind سنقوم بالغاء خاصية انشاء أعمدة تلقائية لنعصر GridView بوضع القيمة False للخاصية AutoGenerateColumns كالتالي

AutoGenerateColumns="False"

هلأ كل شي الحمد لله جاهز للبدئ ...

سنقوم (في زمن التصميم) بوضع سمة مسبقة التصميم (تأتي من القائمة الذكية للعنصر .. Autoformat ونختار تصميم جميل مثلا ال Classic مع تعديل بسيط في لون الرأس ليصبح بشكل جميل (التصميم الجميل مطلوب في أي مكان)

حسنا سنقوم (من القائمة الذكية أو من كود Markup بانشاء أعمدة Template تعتمد على عناصر داخلها وسنقوم بتطبيق مفهوم Databind لاحضار البيانات على تلك العناصر كالتالي:

<asp:TemplateField HeaderText="ID">
<ItemTemplate>
	  <asp:Label ID="ID" runat="server" 
Enabled='<%# GetActive((int)(Eval("Active"))) %>' 
Text='<%# Eval("ID") %>' >
</asp:Label>
						</ItemTemplate>
<ItemStyle HorizontalAlign="Left" />
<HeaderStyle HorizontalAlign="Left" />
</asp:TemplateField>

حيث نلاحظ من المثال السابق تطبيق مفهوم ال Databind بواسطة التابع Eval(“Column Name”) للحصول على البيانانت المطلوبة وفي مثالنا هنا لعرض ID الخاص بالمستخدم

بينما استخدمنا قيمة هذا البيانات الآتية من التابع الآنف الذكر واستخدمنا هنا تابعا معرفا ضمن كودنا على أن لا ننسى أن نقوم بعملية cast لقيمة ذلك التابع لأنها قيمة معروفة دائما بأنها String فقط (لأنه سيستخدمها ليعرضها في المتصفح فقط)

وأخذنا هذه القية وأتينا بقيمة (Enable ( وحصلنا على ما نريد من خلال ذلك.

<asp:TemplateField HeaderText="Email">
<ItemTemplate>
	  <asp:HyperLink ID="Email" runat="server" 
Enabled='<%# GetActive((int)(Eval("Active"))) %>' 
Text='<%# Eval("Email") %>' 
NavigateUrl='<%# "mailto:"+Eval("Email") %>'>
</asp:HyperLink>
</ItemTemplate>
<ItemStyle HorizontalAlign="Left" />
<HeaderStyle HorizontalAlign="Left" />
</asp:TemplateField>

وهنا نلاحظ كيفية تطبيق خاصية جمع السلاسل للحصول على المراد من خلال خاصية NavigationUrl للعنصر HyperLink هنا أيضا لعرض البريد الالكتروني وعند النقر عليه للذهاب إلى برنامج آوتلوك وارسال رسالة مباشرة للعنوان المدخل

حسنا ...

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

اخواني هذا ملخص والتفصيل ان شاء الله عندما أجد وقتا آخر حيث (والله يشهد) لا أجد وقتا لأكتب في المنتدى مع أنني أحاول الرد على بعض الأسئلة من حين لآخر

ولكن الشغل ما بيخلي وقت للانسان

هذا ما أعلم والله أعلم ....

طابت أوقاتكم وأرجو التعليق على هذا المثال البسيط

Databind.zip

#2

والله شرح رائع جداً و سلس ...

بارك الله فيك اخي ..

:rolleyes:

Success Is A Journey Not A Destination

#3

ملاحظة:

لمعرفة مكان تخزين البيانات يرجى اتباع ما يلي:

انظر إلى html للصفحة وانظر الى العنصر المخفي Viewstate

سترى قيمته لا تتجاوز 50 محرف

أدخل 3 أعضاء ثم انظر إليها مرة أخرى

ستراها لا تقل عن 300 محرف

هنا مكان تخزين البيانات ....

#4

ملاحظة :

البيانات المدخلة في ViewState لا تذهب بمجرد انقطاع الاتصال بالسيرفر فهي مخزنة داخل متصفح الزبون

بمعنى أصح أن هذا المكان لتخزين البيانات مكان رائع لتخزين البيانات بشكل مؤقت (يذهب باغلاق المتصفح) أو الانتقال لصفحة أخرى

ولا يكلف المبرمج وقتا وعناء انشاء كوكيز ومشاكلها مع المستخدم حيث أن بعض المستخدمين يعطلون الكوكيز في كثير من متصفحات الانترنت

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

هذا والله أعلم

بانتظار ردودكم

#5

أنا اريد ان يكون هنك button بدل hyperlink button ولما اعمل active او deactive يكون على مستوى ال button فقط وليس على مستوى الصف

فهمت علي

#6

طيب ببساطة استبدل كود HyperLink بكود Button كالتالي:

<asp:LinkButton

استبدله ب

<asp:Button

إلا اذا كان عندك شيء آخر بدك تساويه

مع انو للعنصرين نفس العمل (تقريبا) وين ما كان

على فكرة أنا ما فهمت شو يعني على مستوى الزر وليس على مستوى الصف ؟

هل تقصد انو يكون الزر خارجي مثلا خارج الجريد كلو ...؟

تم تعديل هذه المشاركة بواسطة Arwany في 14 يونيو 2007 في 15:28

#7

اخي الكريم قصدي لما تعمل deactive يصير ال button فقط deactive وليس كل السطر

وال button يكون داخل ال datagrid

معلش تحملني

#8

مشكوووووور جدا على هالشرح الاكثر من رائع

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

مع فائق الاحترام والتقدير

شكرا .::. AzzD

E-mail:VIPMail.1@Gmail.com

11.jpg

#9

شكرا الك وان شاء الله تكون استفدت

ان شاء الله بحاول نزل قدر المستطاع من الدروس العملية بس يصير في وقت ان شاء الله

#10

شكرا اخي ارجو المزيد من الدروس بنفس الكيفية

#11

مشكور اخي Arwany

لو تكرمت عندي استفسار

هل بإمكاني بعد الانتهاء من إضافة السجلات إلى الـGridView أن أضيف تلك السجلات مرة وحدة لقاعدة البيانات ؟

460.gif

#12

طبعا أخي الكريم

الفكرة كانت من البداية هي أن تقوم بارسال البيانات دفعة واحدة لقاعدة البيانات بعد الانتهاء من تعديلها بالشكل المطلوب

العملية بسيطة

قم بأخذ اللائحة كالتالي:

			ArrayList Members = (ArrayList)ViewState["Members"];

قم بالوصول لكل عنصر من عناصر المتحول Members بحلقة foreach وقم ببناء تعليمة SQL وادخال سجل في قاعدة البيانات كالتالي:

foreach (BoundClass b in Members)
{
string SQL="";
SQL = "INSERT INTO MembersTable (........) Values(......)";
//Process this SQL to excute it by ADO.NET objects

}

مجرد عملية بناء SQL في runtime

#13

جزاك الله خيرا وربنا يكرمك يارب

ويجعله في ميزان حسناتك

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

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