GridView والحدث السحري

ماذا لو اردت التحكم في شكل اداة GridView اثناء التنفيذ وبناء على معطيات قاعدة البيانات ؟
توفر اداة GridView حدثا مهما يتيح التحكم في محتوياتها قبل عرضها وتحديدا اثناء ربطها بالبيانات ويوفر هذا الحدث امكانية الوصول الى اي صف او خليه والتحكم فيها

هذا الحدث هو RowDataBound وساوضح هنا مثالا بسيطا ولكنه سيوضح الفكرة مباشرة ويمكن التوسع بعد ذلك حسب خيال المبرمج

لنفرض مثلا انك تريد ان تميز الخلايا التي تحتوي على كلمة “مهم” باللون الاحمر للتنبيه

عندما يتم ربط GridView بقاعدة البيانات فان حدثا مهما ينطلق مع كل صف يتم تعبئته بالبيانات وهو الحدث RowDataBound ولنبدأ بالمثال مباشرة ثم نشرحه بالتفصيل

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;
            }
         }

والان لنشرح المثال البسيط ونرى كيف يمكن تطوير الفكرة للاستفاده اكثر
يتم اطلاق هذا الحدث مع كل عملية ربط للبيانات لكل صف بشكل متسلسل ابتداء من Header مرورا بصفوف البيانات وانتهاء بـ Footer ولاننا نريد فقط صفوف البيانات فنقوم بعمل اختبار نوعية الصف في البداية

 if (e.Row.RowType == DataControlRowType.DataRow)

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

والان اذا كانت نتيجة الشرط صحيحه فهذا يعني اننا اصبحنا في احد صفوف البيانات ونحتاج لمعرفة رقم الخلية التي سنغير لونها وقد افترضت انها الخليه رقم 7 وتم وضعها في متغير iRow
من المهم جدا معرفة رقم الخلية التي ستتعامل معها ويمكن معرفتها من خلال عد اعمدة الـ GridView ابتداء من الصفر مع ملاحظة ان حتى الاعمدة المخفيه يجب ان تدخل في العد

والان نأتي الى الاهم وهو الحصول على الخلية نفسها … ولحسن الحظ فان كل خليه هي عبارة عن كائن من نوع TableCell وهذا من فوائد البرمجة الكائنية OOP فبمجرد الحصول على مرجع لأي كائن يمكن التحكم فيه بكل سهوله …. وهذا ما يتم من السطر :

TableCell tc = e.Row.Cells[iRow];

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

 if (tc.Text == "مهم") tc.BackColor = System.Drawing.Color.Red;

هذا كل شئ ولم يبقى الان سوى ابداعات المبرمج في الاستفاده من هذا الحدث فمثلا يمكن جمع محتويات عمود معين ووضع النتيجه في Footer بشكل احترافي ,
يمكن ايضا الوصول الى الادوات Controls داخل اي خليه والتحكم بها فمثلا يمكن ان تجعل اداة من نوع HyperLink تشير الى عنوان معين حسب اختيارك ,
يمكن ايضا اضافة بعض الجافا سكربت للادوات لعرض رسائل او القيام بوظيفه معينه
لاحدود للاستفاده من هذا الحدث ولكن تبقى فقط ان اوضح طريقة الحصول على Control داخل الخليه للاستفاده منه ويتم ذلك بسطر واحد كالتالي :

HyperLink hl = (HyperLink)e.Row.FindControl("hlEmpList");

المثال السابق يفترض ان لديك اداة HyperLink في الصف ولكن لاتعرف تحديدا في اي خليه فسيبحث عنها ويعيد مرجع لها Refrence بحيث تستطيع التحكم بها … لاحظ اهمية عمل Cast لتحويل الكائن الى النوع الذي تريده

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

Latest Comments
  1. كريم

    أخي سعيد .. مدونتك رائعة .. سأعتبر نفسي من متابعينك دائما إن شاء الله ..
    وفقك الله دائما .. ورزقك خير العمل ..

  2. القرش

    أخي الكريم : كريم
    أشكرك على الاطراء ويشرفني جدا أن تكون من متابعي مدونتي المتواضعه

  3. hady

    very good article
    if another one to inser,update ,delete events for gridview ,its very good
    thanks

  4. fedail

    يعطيك العافيه عزيزي لكن لي طلب بسيط هل بامكانك وضع كود vb دائماً

  5. القرش

    شكرا لمرورك الكريم … وبالنسبة للأكواد فهناك لحسن الحظ الكثير من المواقع التي يمكنها التحويل ما بين VB وال C#

  6. المتمرد

    ياخوى كيف اغير فى لون الgridview بعد اخروج منها

أضف تعليق

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

يمكنك استخدام أكواد HTML والخصائص التالية: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>