
السلام عليكم ورحمة الله وبركاته
كيفية إظهار البيانات بطريقة on Typed DataSet Group join في Datagridview
هنا في هذه الحالة يجب أن نقوم بتخزين البيانات في متغير يكون له مفتاح وهو Group وباقي البيانات التي تندرج تحت هذا المفتاح وأفضل وأسهل طريقة لذلك هي استخدام dictionary
ولتوضيح الطريقة نبدأ بالمثال التالي :
نريد أن نقوم بعمل group join بين جدولين Product و Order_Details فهنا يكون المفتاح الرئيسي هو ProductRow والمعلومات الفرعية Order_DetailRows التي يكون فيها ID متساوي.
أولا يجب أن نقوم بتعريف متغير من نوع Dictionary ونعرف Key من نوع ProductsRow و المعلومات التي نرغب بتخزينها تحت هذا المفتاح سنعرفها على أنها خليط IEnumerable من نوع Order_DetailsRow وكما يلي :
كود
Private GroupJoinDictionary As Dictionary(Of NORTHWNDDataSet.ProductsRow, IEnumerable(Of NORTHWNDDataSet.Order_DetailsRow))
بعد ذلك نقوم بتعريف متغيرات للجداول وتعبئة البيانات ومن ثم بناء الاستعلام
كود
Private Sub Button23_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button23.Click
Dim TadProducts As New NORTHWNDDataSetTableAdapters.ProductsTableAdapter
Dim TadOrderDe As New NORTHWNDDataSetTableAdapters.Order_DetailsTableAdapter
Dim Product = TadProducts.GetData
Dim OrderDetail = TadOrderDe.GetData
DataGridView3.DataSource = Product.AsDataView
Dim Query = From Pro In Product _
Group Join Ord In OrderDetail On _
Pro.ID Equals Ord.Product_ID Into GPd = Group _
Where Not Pro.IsQuantity_Per_UnitNull _
Select Pro, GPd
نلاحظ هنا ان Query هو من نوع anonymous types وذلك لاننا قمنا بعمل Select للجدول الرئيسي Pro و ال Grp = Group وبهذه الحالة لا يمكن لنا اظهار البيانات في AsDataView لذلك نقوم بتصدير هذه البيانات Dictionary الذي قمنا بتعريفة في البداية وذلك عن طريق استخدام الامر ToDictionary
كود
GroupJoinDictionary = Query.ToDictionary(Function(i) i.Pro, Function(y) y.GPd)
وهنا قمنا بوضع اسطر Product كمفتاح واسطر OrderDetail المتساوية في Id بينهما تحت هذا المفتاح
ولإظهار البيانات نقوم بعملها عن طريق BindingSource وذلك حتى نظهر البيانات لل Group عند التنقل في اسطر المفتاح الرئيسي
كود
Me.BindingSource1.DataSource = GroupJoinDictionary.Keys
DataGridView1.DataSource = BindingSource1
نقوم هنا باظهار بيانات المفتاح الرئيسي GroupJoinDictionary.Keys وهي جميع حقول ProductRow
كود
DataGridView2.DataSource = BindingSource2
ثم نقوم بإظهار بيانات لل Group
كود
End Sub
وهنا يجب أن نقوم بتعبئة البيانات لل Group في حدث BindingSource1_CurrentChanged وذلك حتى يظهر البيانات المخزنة تحت ذلك المفتاح
كود
Private Sub BindingSource1_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BindingSource1.CurrentChanged
Try
Me.BindingSource2.DataSource = GroupJoinDictionary(CType(BindingSource1.Current, NORTHWNDDataSet.ProductsRow)).CopyToDataTable
Catch ex As Exception
Me.BindingSource2.DataSource = Nothing
End Try
End Sub
وهنا نقوم بتحويل بيانات السطر الذي نقف علية BindingSource1.Current الى نوع ProductsRow وهو المفتاح حتى نظهر البيانات المخزنة تحت ذلك المفتاح وفي حالة انه لا يوجد بيانات تحت ذلك المفتاح لا نظهر أية بيانات.
كيفية إظهار البيانات بطريقة on Typed DataSet Group By في Datagridview
وهي نفس الطريقة السابقة ولكن هنا نستخدم جدول واحد فقط Order_DetailsRow وهنا نحدد المفتاح برقم IDProduct أولا يجب أن نقوم بتعريف متغير من نوع Dictionary ونعرف Key من نوع Integer و المعلومات التي نرغب بتخزينها تحت هذا المفتاح سنعرفها على أنها خليط IEnumerable من نوع Order_DetailsRow وكما يلي :
كود
Private GroupbyDictionary As Dictionary(Of Integer, IEnumerable(Of NORTHWNDDataSet.Order_DetailsRow))
بعد ذلك نقوم بتعريف متغيرات للجداول وتعبئة البيانات ومن ثم بناء الاستعلام
كود
Private Sub Button25_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button25.Click
Dim TadProducts As New NORTHWNDDataSetTableAdapters.ProductsTableAdapter
Dim TadOrderDe As New NORTHWNDDataSetTableAdapters.Order_DetailsTableAdapter
Dim Product = TadProducts.GetData
Dim OrderDetail = TadOrderDe.GetData
DataGridView3.DataSource = Product.AsDataView
Dim Query = From Det In OrderDetail _
Group Det By key = Det.Product_ID Into Group _
Select key, Group
GroupbyDictionary = Query.ToDictionary(Function(i) i.key, Function(y) y.Group)
Me.BindingSource3.DataSource = Product
Me.ComboBox1.DataSource = GroupbyDictionary.Keys.ToList
DataGridView1.DataSource = BindingSource3
DataGridView2.DataSource = BindingSource4
End Sub
نلاحظ هنا ان Query هو من نوع anonymous types وذلك لأننا قمنا بعمل Select للجدول الرئيسي Key و ال Group وبهذه الحالة لا يمكن لنا إظهار البيانات في AsDataView لذلك نقوم بتصدير هذه البيانات Dictionary الذي قمنا بتعريفة في البداية وذلك عن طريق استخدام الأمر ToDictionary
وبعدها أقوم بإظهار بيانات جدول Product في Datagridview عن طريق BindingSource3 وسنقوم بإظهار البيانات التي تحت ال Group بطريقتين لتوضيح كيفية الاستفادة من هذه الطريقة
نقوم بتخزين المفاتيح في Combobox والتي تساوي GroupbyDictionary.Keys.ToList ولاظهار البيانات التي تحت ال group يجب علينا عمل اجرائين للاحداث BindingSource3_CurrentChanged عند التنقل في الجدول الرئيسي و ComboBox1_SelectedValueChanged عند الاختيار من ال Combo
كود
Private Sub BindingSource3_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BindingSource3.CurrentChanged
Try
Dim row As DataRowView = BindingSource3.Current
Dim ky = row.Item("ID")
Me.BindingSource4.DataSource = GroupbyDictionary(ky).CopyToDataTable
Catch ex As Exception
Me.BindingSource4.DataSource = Nothing
End Try
End Sub
هنا نقوم بأخذ رقم المفتاح Id من السطر الذي نقف علية ومن ثم نظهر البيانات GroupbyDictionary(ky).CopyToDataTable لذلك المفتاح
كود
Private Sub ComboBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedValueChanged
Try
Dim k1 = CType(ComboBox1.Text, Integer)
Me.BindingSource4.DataSource = GroupbyDictionary(k1).CopyToDataTable
Catch ex As Exception
Me.BindingSource4.DataSource = Nothing
End Try
End Sub
هنا نقوم بأخذ رقم المفتاح Id من ال Combo ومن ثم نظهر البيانات GroupbyDictionary(k1).CopyToDataTable لذلك المفتاح
كيفية تجميع البيانات حسب فئة وإظهارها في Datagridview
بطريقة on Typed DataSet ToLookup
لو أردنا تجميع البيانات في جدول معين حسب فئة معينة وإظهار هذه الفئات في DataGridview وإظهار باقي البيانات حسب هذه الفئة في DataGridView أخر. مثلا في جدول Product يوجد به حقل التصنيف للمادة وهو Category فلو اردنا عمل استعلام نقوم بتجميل ال ProductRow كل حسب فئته
فهنا نستخدم الأمر ToLookup الذي يقوم بعمل تصنيف للفئات وهي تقريبا مشابهه للطريقة ToDictionary
نقوم بعمل متغير لحفظ الفئات والحقول التابعة لتلك الفئة وهنا نحدد المفتاح به من نوع Object
كود
Private productsLookup As ILookup(Of Object, NORTHWNDDataSet.ProductsRow)
بعد ذلك نقوم بتعريف متغيرات للجداول وتعبئة البيانات ومن ثم بناء الاستعلام
كود
Private Sub Button26_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button26.Click
Dim TadProducts As New NORTHWNDDataSetTableAdapters.ProductsTableAdapter
Dim Product = TadProducts.GetData
productsLookup = Product.ToLookup(Function(p) p("Category"))
Me.BindingSource5.DataSource = productsLookup.ToList()
DataGridView1.DataSource = BindingSource5
End Sub
وهنا نقوم بتحديد الفئة التي نرغب بترتيب الحقول حسبها Product.ToLookup(Function(p) p("Category")) ونقوم بإظهار الفئات في DataGridView1 عن طريق BindingSource5 ولإظهار البيانات تحت تلك الفئة نضعها بالإجراء BindingSource5_CurrentChanged
كود
Private Sub BindingSource5_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BindingSource5.CurrentChanged
Try
Dim row = BindingSource5.Current
Dim confections = productsLookup(row.Key)
DataGridView2.DataSource = confections.CopyToDataTable
Catch ex As Exception
Me.BindingSource4.DataSource = Nothing
MsgBox(ex.Message)
End Try
End Sub
وللحصول على الفئة نقوم بتعريف Row ولا نحدد نوعه لأنه من نوع ILookUp ولأننا عرفنا المفتاح على انه Object ، وللحصول على الحقول المخزنة تحت تلك الفئة نقوم بتعريف متغير وسيكون نوعه خليط من NORTHWNDDataSet.ProductsRow ونقوم بإظهارها في datagridview2
كيفية تجميع البيانات من عدة جداول وإظهارها في Datagridview واحدة
بطريقة Typed DataSet
ماذا لو رغبنا بعمل DataGridView نظهر فيها حقول معينة من عدة جدول ونوضحها بالمثال التالي
أولا يجب تعبئة DataSet لجميع الجداول التي سوف استخدمها وعددها خمسة جداول
كود
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.EmployeesTableAdapter.Fill(Me.NORTHWNDDataSet.Employees)
Me.CustomersTableAdapter.Fill(Me.NORTHWNDDataSet.Customers)
Me.OrdersTableAdapter.Fill(Me.NORTHWNDDataSet.Orders)
Me.Order_DetailsTableAdapter.Fill(Me.NORTHWNDDataSet.Order_Details)
Me.ProductsTableAdapter.Fill(Me.NORTHWNDDataSet.Products)
End Sub
بعد ذلك نعرف متغير ds وهو نسخة من NORTHWNDDataSet وبعدها نقوم ببناء الاستعلام ، وبما انه يوجد علاقة بين الجداول في Dataset فهنا نستطيع استخدام هذه الخاصية حيث انه في Typed DataSet وعندما تكون العلاقة 1 إلى كثير فيكون Rows للجدول الفرعي ضمن حقول الجدول الرئيسي.
فهنا سأقوم بعمل الاستعلام على ثلاثة جداول فقط ولكن سآخذ الحقول من الخمسة جداول وذلك عن طريق وضع شرط معين يربط هذه الجداول مع بعضها حسب قيمة حقل العلاقة بينهم.
ونلاحظ هنا أن Product ليست مربوطة مع Orders أو مع Employees أو مع Customer ولذلك استخدما الجدول orderDetails الذي هو مربوط مع Product ومربوط مع Orders كجدول وسيط للحصول على البيانات التي ارغب بها ولكني أن استخدم حقوله.
كود
Private Sub Button24_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button24.Click
Dim ds As New NORTHWNDDataSet
ds = NORTHWNDDataSet
Dim query = (From orders In ds.Orders _
From orderDetails In ds.Order_Details _
From prods In ds.Products _
Where ( _
(orderDetails.Order_ID = orders.Order_ID) And _
(prods.ID = orderDetails.Product_ID) And _
(orders.Employee_ID = 1) _
 

_
Order By (orders.Ship_City) _
Select CustomerOrderResult = New With { _
.CustomerID = orders.Customer_ID, _
.CustomerContactName = orders.CustomersRow.First_Name, _
.CustomerCountry = orders.CustomersRow.City, _
.OrderDate = orders.Order_Date, _
.EmployeeID = orders.EmployeesRow.ID, _
.EmployeeFirstName = orders.EmployeesRow.First_Name, _
.EmployeeLastName = orders.EmployeesRow.Last_Name, _
.ProductName = prods.Product_Name _
}).ToList
DataGridView1.DataSource = query
End Sub
وهنا سيكون الاستعلام query من نوع List(of anonymous types) والذي نستطيع تحويله إلى جدول عن طريق استخدام الأمر query.CopyToDataTableCustom
وهكذا
وبحمد الله والصلاة والسلام
على سيدنا محمد صلى الله علية وسلام
قد اكتملت هذه الدورة
المراجع :
http://msdn.microsoft.com/en-us/library/bb386977.aspxوهذا رابط لأمثلة LINQ to DataSet Examples
http://msdn.microsoft.com/en-us/library/bb399401.aspxوهذا رابط لأمثله LINQ to DataSet 101 Samples على جميع Standard Query Operators
http://msdn.microsoft.com/en-us/vbasic/bb688086.aspxوالى اللقاء مع الدورة
القادمة في الأوامر الجديدة في
Visual Basic 2008
1- Extension Methods
وهي طريقة إضافة (توسع ، امتداد ، تغيير) وظائف وأوامر إلى أنواع البيانات وال Control المعرفة أصلا في Vb.Net
دون اشتقاق Without Creating A New Derived Type وممكن أن تكون إجراء Sub أو function.
2- Partial Methods
3- DataRepeate
4- Func
5- Local Type Inference
6- If Operator
7- Nullable Value Types
8- PrintForm Component
9- Printer Compatibility Library
تحياتي للجميع.