بسم الله الرحمن الرحيم..
سأشرح هنا جزئا عن وظائف ال DataView و كيفية الإستفادة منها حيث أن هناك أخ قد سأل في موضوع عن طريقة لشرط البيانات و قام الأخ الأستاذ مدني بالرد عليه عن طريق استخدام ال DataView و للأسف أرى الكثير يتجاهلها لذا وجب توضيحها هنا.
ما هي ال DataView؟
هي ناتج لتعليمة معينة توجه نحو ال DataTable الموجود داخل قطعة الذاكرة ال DataSet و لها عدة فوائم مثل ترتيب البيانات المخزنة داخل ال DataTable أو فلترتها "فكرة شرط البيانات" أو البحث عن بيانات معينة و لعل فائدة ال DataView تكمن في أنها تستخرج البيانات من ال DataSet مباشرة بعد إجراء عملية معينة عليها مما ذكرنا و بالتالي لا تشكل ضغطا على السيرفر و توفر سرعة في عرض البيانات و بالتالي تؤثر على عمل التطبيق.
كيف يتم إنشاء ال DataView؟
يتم إنشاؤها عن طريق تمرير إسم ال DataTable إلى ال Constructor الخاص بال DataView كالتالي :
dv=new DataView("myDataTable");
// أو هكذا
dv=new DataView();
dv=ds.Tables["myDataTable"].DefaultView;طبعا من أجل التعامل مع ال DataView يجب تضمين فضاء الأسماء System.Data و هو نفسه الذي يحتوي على ال DataSet.
مثال برمجي :
لنفرض أننا نريد أن نعرض الدروس التابعة للقسم ذو الرقم CatID = 5 فماذا نفعل؟
سوف يقول أحدهم بكل بساطة و بدون ال DataView سوف نستخدم جملة إستعلام SQL مشروطة و انتهى الأمر .. نعم كلام صحيح و منطقي و لكن ماذا لو كان هناك تسلسل في عرض البيانات في نفس الصفحة ؟ هل ستعمل أكثر من جملة إستعلام؟؟
دعوني أكتب المثال أولا ثم نتناقش :
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.OleDb"%>
<script runat="server">
private void Page_Load(){
string prov="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("db.mdb");
string SQL="SELECT * FROM Lessons";
OleDbConnection cn = new OleDbConnection(prov);
OleDbDataAdapter da = new OleDbDataAdapter(SQL,cn);
DataSet ds = new DataSet();
DataView dv = new DataView();
da.Fill(ds,"Lessons");
dv=ds.Tables["Lessons"].DefaultView;
dv.RowFilter="CatID=5";
dg.DataSource=dv;
dg.DataBind();
}
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:DataGrid id="dg" runat="server"/>
</form>
</body>
</html>استخدمت DataGrid تقوم بعرض الأسئلة.
استخدمنا قاعدة بيانات من نوع أكسيس و أنشأنا إتصال مع قاعدة البيانات ثم أنشأنا DataSet و وضعنا بها جدول الدروس و من ثم إستخدمنا ال DataView و أقصد هنا أحد خصائصها و هي فلترة البيانات حيث جعلناها تستخرج فقط الدروس التي تنتمي للتصنيف العام رقم 5 هكذا :
dv=ds.Tables["Lessons"].DefaultView; dv.RowFilter="CatID=5";
ثم جعلنا مصدر البيانات في ال DataGrid هو ال DataView التي أنشأناها و هي dv ثم قمنا بإستخدام الطريقة Bind من أجل ربط البيانات.
هل يوجد مثال أو فكرة على نقطة إذا كان هناك عدد من ال DataGrid و كل واحدة تستخرج دروسا معينة؟؟
طبعا يوجد و سأعطيكم الفكرة..
مثلا لنفرض أنه عندنا خمس أقسام للبرمجة ولكل واحد عدد من الدروس و نود أن نظهر القسم و تحته الدروس داخل DataGrid فكيف نفعل ذلك؟
بداية نحتاج لدالة تقوم بإسترجاع البيانات على شكل Data View كالتالي :
private DataView bindDg(object catID)
{
dv.RowFilter="catRef="+ catID;
return dv;
}و لنفرض أننا استخدمنا Repeater لعرض الأسماء الخاصة بالأقسام و بداخله DataGrid ستعرض الدروس فماذا نفعل ؟
سنكتب التالي :
<asp:Repeater id="rp" runat="server" EnableViewState="False"> <ItemTemplate> :: <%# DataBinder.Eval(Container.DataItem,"category")%> :: <br> <asp:DataGrid id="dg" runat="server" AutoGenerateColumns="False" DataSource='<%# bindDg(DataBinder.Eval(Container.DataItem,"catID"))%>'> <columns> ........... </columns> </asp:DataGrid> </itemTemplate> </asp:Repeater>
نرى أنه في منطقة ال DataGrid حددنا ال DataSource و هي عبارة بيانات مسترجعة من دالة bindDg و التي يمرر لها رقم القسم الخاص بها و الدالة تقوم بإستقبال الرقم و عمل فلترة لل DataTable الخاص بالدروس و الموجود داخل ال DataSet .
هذا جزء بسيط من موضوع ال DataView الشيق لذا أنصحكم بقراءة المزيد عنها و التمعن فيها و معرفة كيفية إستغلالها لما لها من دور كبير في سرعة عرض البيانات و استخدامها مع ال Master/Details Forms و غير ذلك الكثير و لعل نظرة منا على أحد المواقع المليئة بالبيانات مثل www.kooora.com لتجعلنا مستغربين أمام السرعة الكبيرة في عرض الموقع مع أنه يحوي في صفحته عدد هائل من البيانات استخدم فيها بالطبع ال DataView.
انا قمت في موقعي بعمل درسين مطولين جدا في هذا الموضوع تكلمت فيها عن استخدامات ال DataView و أرفقت أمثلة عدة أتمنى أن تنال إعجابكم حال إنطلاق الموقع.
تحياتي للجميع..
أخوكم/محمد خليل أبو صلاح