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

التعامل مع ال DataView

مغلق
بدأه محمد خليل أبو صلاح في 17 نوفمبر 2004 · 7 رد · 5,859 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

سأشرح هنا جزئا عن وظائف ال 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 و أرفقت أمثلة عدة أتمنى أن تنال إعجابكم حال إنطلاق الموقع.

تحياتي للجميع..

أخوكم/محمد خليل أبو صلاح

You can fly while you can touch the sky

#2

سؤال الأخ كان من هنا

/index.php?showtopic=50396

و أيضا المثال السابق كتبته لجماعة ال VB.NET مرة أخرى

<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
 Dim Ds As DataSet
 Dim dv As DataView

 Sub Page_Load() 
  Dim prov As String
  Dim SQL As String
  Dim cn As OleDbConnection

  
  Dim da As OleDbDataAdapter
  prov="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & Server.MapPath("db.mdb")
  SQL="SELECT * FROM Categories"
    cn = new OleDbConnection(prov)
    da = new OleDbDataAdapter(SQL,cn)
  ds = new DataSet
  da.Fill(ds,"Categories")
  da.SelectCommand = new OleDbCommand("Select * From Lessons",cn)
  da.Fill(ds,"Lessons")
  dv=ds.Tables("Lessons").DefaultView
  
  rp.DataSource=ds.Tables("Categories")
  rp.DataBind()
  
End Sub

Function GetLessons(catID As Integer) As DataView
  dv.RowFilter="catID=" & catID
  Return dv
End Function
</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:Repeater id="rp" runat="server">
         <ItemTemplate>
         <h2><%# DataBinder.Eval(Container.DataItem,"category")%></h2>
         <asp:DataGrid id="dg" 
         DataSource='<%# GetLessons(DataBinder.Eval(Container.DataItem,"id"))%>' runat="server"/>
         </ItemTemplate>
        </asp:Repeater>
    </form>
</body>
</html>

حظا موفقا ;)

1

You can fly while you can touch the sky

#3

ممممممم لا يوجد ردود أو مشاركات!!

السؤال هو هل أن الشرح صعب أو غير مفهوم أم ماذا؟

التعليق كي يفيد في كتابة الدروس القادمة فأنا أكتبها لكم وليس لي :)

أنا مستعد لأي اقتراحات أو توجيهات ..

شكرا لكل من مر على المقال

You can fly while you can touch the sky

#4

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

كل الشكر لك أخي محمد خليل أبو صلاح وبارك الله لك في علمك

ننتظر منك المقالات المطولة التي تتحدث عن الموضوع

وألف مبروك على الموقع اخبرنا عندما يكون جاهز

وما من كاتب إلا سيبلى ويبقي الدهر ما كتبت يداه

فلا تكتب بكفك غير شيء يسرك في القيامة أن تراه

#5

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

صراحة انت رهيييييييييييييييييييييييببببببببببببببببببب و فتحت ذهني لحاجات كثيرة وجاوبتني عن اسئلة تحيرت كيف اصيغها للمحترفين امثالك

الله يجزاك الف خير

#6

جربت المثال لكن عطاني الخطا التالي

ImageError.JPG

#7

شكرا لكم أعزائي .. رد مشجع

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

تأكد من اسماء الحقول و ان شاء الله سوف تعمل معك ..

تحياتي لكم

You can fly while you can touch the sky

#8

عدلة اسم الحقل وصار زي الحلاوة

اشكرك من كل قلبي والله يوفقك

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

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