
GridView والحدث السحري
ماذا لو اردت التحكم في شكل اداة GridView اثناء التنفيذ وبناء على معطيات قاعدة البيانات ؟
توفر اداة GridView حدثا مهما يتيح التحكم في محتوياتها قبل عرضها وتحديدا اثناء ربطها بالبيانات ويوفر هذا الحدث امكانية الوصول الى اي صف او خليه والتحكم فيها
هذا الحدث هو RowDataBound وساوضح هنا مثالا بسيطا ولكنه سيوضح الفكرة مباشرة ويمكن التوسع بعد ذلك حسب خيال المبرمج
لنفرض مثلا انك تريد ان تميز الخلايا التي تحتوي على كلمة “مهم” باللون الاحمر للتنبيه
عندما يتم ربط GridView بقاعدة البيانات فان حدثا مهما ينطلق مع كل صف يتم تعبئته بالبيانات وهو الحدث RowDataBound ولنبدأ بالمثال مباشرة ثم نشرحه بالتفصيل
[csharp]
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
int iRow = 7;
TableCell tc = e.Row.Cells[iRow];
if (tc.Text == "مهم") tc.BackColor = System.Drawing.Color.Red;
}
}
[/csharp]
والان لنشرح المثال البسيط ونرى كيف يمكن تطوير الفكرة للاستفاده اكثر
يتم اطلاق هذا الحدث مع كل عملية ربط للبيانات لكل صف بشكل متسلسل ابتداء من Header مرورا بصفوف البيانات وانتهاء بـ Footer ولاننا نريد فقط صفوف البيانات فنقوم بعمل اختبار نوعية الصف في البداية
[csharp]
if (e.Row.RowType == DataControlRowType.DataRow)
[/csharp]
وهو اختبار مهم جدا يسمح بتخصيص العمل حسب نوعية الصف
والان اذا كانت نتيجة الشرط صحيحه فهذا يعني اننا اصبحنا في احد صفوف البيانات ونحتاج لمعرفة رقم الخلية التي سنغير لونها وقد افترضت انها الخليه رقم 7 وتم وضعها في متغير iRow
من المهم جدا معرفة رقم الخلية التي ستتعامل معها ويمكن معرفتها من خلال عد اعمدة الـ GridView ابتداء من الصفر مع ملاحظة ان حتى الاعمدة المخفيه يجب ان تدخل في العد
والان نأتي الى الاهم وهو الحصول على الخلية نفسها … ولحسن الحظ فان كل خليه هي عبارة عن كائن من نوع TableCell وهذا من فوائد البرمجة الكائنية OOP فبمجرد الحصول على مرجع لأي كائن يمكن التحكم فيه بكل سهوله …. وهذا ما يتم من السطر :
[csharp]
TableCell tc = e.Row.Cells[iRow];
[/csharp]
والان بامكاننا ان نقول ان المهمه انتهت فالحصول على هذا الكائن يعني التحكم الكامل في الخليه ومحتوياتها وخصائصها ولأن المثال المعروض هنا هو لتوضيح الفكرة فقد تم فقط تغيير لون خلفية الخليه حسب الشرط بالسطر التالي :
[csharp]
if (tc.Text == "مهم") tc.BackColor = System.Drawing.Color.Red;
[/csharp]
هذا كل شئ ولم يبقى الان سوى ابداعات المبرمج في الاستفاده من هذا الحدث فمثلا يمكن جمع محتويات عمود معين ووضع النتيجه في Footer بشكل احترافي ,
يمكن ايضا الوصول الى الادوات Controls داخل اي خليه والتحكم بها فمثلا يمكن ان تجعل اداة من نوع HyperLink تشير الى عنوان معين حسب اختيارك ,
يمكن ايضا اضافة بعض الجافا سكربت للادوات لعرض رسائل او القيام بوظيفه معينه
لاحدود للاستفاده من هذا الحدث ولكن تبقى فقط ان اوضح طريقة الحصول على Control داخل الخليه للاستفاده منه ويتم ذلك بسطر واحد كالتالي :
[csharp]
HyperLink hl = (HyperLink)e.Row.FindControl("hlEmpList");
[/csharp]
المثال السابق يفترض ان لديك اداة HyperLink في الصف ولكن لاتعرف تحديدا في اي خليه فسيبحث عنها ويعيد مرجع لها Refrence بحيث تستطيع التحكم بها … لاحظ اهمية عمل Cast لتحويل الكائن الى النوع الذي تريده
طبعا اذا كنت تعرف تحديدا في اي خلية وقد حصلت على مرجع للخليه فيمكن استخدام FindControl على مستوى الخليه
أخي سعيد .. مدونتك رائعة .. سأعتبر نفسي من متابعينك دائما إن شاء الله ..
وفقك الله دائما .. ورزقك خير العمل ..
أخي الكريم : كريم
أشكرك على الاطراء ويشرفني جدا أن تكون من متابعي مدونتي المتواضعه
very good article
if another one to inser,update ,delete events for gridview ,its very good
thanks
يعطيك العافيه عزيزي لكن لي طلب بسيط هل بامكانك وضع كود vb دائماً
شكرا لمرورك الكريم … وبالنسبة للأكواد فهناك لحسن الحظ الكثير من المواقع التي يمكنها التحويل ما بين VB وال C#
ياخوى كيف اغير فى لون الgridview بعد اخروج منها