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

حيرني DefaultView

مغلق
بدأه حسن المنتصر في 9 أغسطس 2005 · 6 رد · 953 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إخوتي انا واحد من الأعضاء الذين بحثو كثيرا في هدا الموقع

وبالذات عن استخدام الخاصية DefaultView ولم أجد جوابا كافيا في هذا الموضوع

حيث انني استعملت 2 من أدوات combobox الأول يحتوي مثلا على الإدارة و الثاني يحتوي على القسم

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

ولا اريد استخدام طريقة sql و adapter.fill لأنها تمرر sql لقاعدة البيانات وقد تكون بطيئة بعض الشي بالمقارنة مع استخدام DefaultView كما في المثال التالي :

Me.ComboBox2.DataSource = Me.Data1.TBpart.DefaultView.ToString
        Data1.TBpart.DefaultView.RowFilter = "Admin=" + Convert.ToString(ComboBox1.SelectedValue)

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

وجزاكم الله عنا كل الخير

#3

لنفرض انه لدي جدولين في قاعدة البيانات

جدول الإدارات Admin

جدول الأقسام Part

يحتوي جدول الإدارات على اسم الادارة ورقم الادارة

ويحتوي جدول الأقسام على رقم الادارة ورقم القسم واسم القسم

وقمت بربط جدول الادارات في combo و الأقسام في combo اخر

وما اريده بالتحديد هو عندما اختار ادارة من combo1 فلا يعرض في combo2 سوى الاقسام التابعة لهذه الادارة لكن بطريقة DefaultView

#4

السلام عليكم

فقط ينقصك في التصفية علامة الفاصلة العلوية ' value to filter'

و إستخدام التصفية يكون كالتالي

 Ds1.Sections.DefaultView.RowFilter = "MainID ='1'"

طبعاً هذا في أبسط حالاته , لان الـ DefaultView مبني على القالب dataView و بالتحديد صفوف هذا القالب

وهذا القالب dataView له أكثر من بناء sub New() .

نستطيع أن نصنع dataView و نستخدم كل من التصفية و الترتيب الأبجدي أو حتى كذلك تحديد حالات الصفوف RowStateFilter

التي نود تصفيتها عن طريق القيم المعدة مسبقاً enumeration وهي DataViewRowState

أو نستخدم ذلك مباشرتاً على الجدول كما هو موضح في الكود في الاعلى .

مثال على ذلك يكون بهذا الشكل

 Dim dve As DataView
Dim dvrs As DataViewRowState

 dvrs = DataViewRowState.OriginalRows 
 dve = New DataView(Me.Ds1.Directories, "MainID='1'", "MainID DESC", dvrs)

or use nothing as last param if u not wish to use rowstate
dve = New DataView(Me.Ds1.Directories, "MainID='1'", "MainID DESC", Nothing)

أو قد يتم تعريفه بهذا الشكل

dve = New DataView(Ds1.Tables("Sections"))
dve.Sort = "MainID"
dve.RowFilter = "MainID='1'"

ثم مثلاً لربطه بالقائمة المنسدلة سيكون بهذا الشكل

 Me.cboxSec.DataSource = dve
 Me.cboxSec.DisplayMember = "SectionName"

أما خاصية الترتيب sort فلا تحتاج إلى الفاصلة العلوية وتكون بهذا الشكل

 Ds1.Sections.DefaultView.Sort = "SectionName"
Ds1.Sections.DefaultView.Sort = "SectionName DESC" ' عكسي

بالنسبة للطريقة التي يتم بها التصفية هو أن نأخذ القيمة من القائمة المنسدلة كمثلاً اسم الإدارة

ثم بشكل برمجي نبحث في جدول الإدارة عن هذه القيمة فإن وجدت قمنا بأخذ الـ Primary Key

على اعتبار أن الجدولين مبنيين على ذلك

المهم سنقوم في عامل التصفية بأن يصفي القيم في القائمة المنسدلة للأقسام وفقاً لهذا الرقم فيها كـ foreign key

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

بالتوفيق إن شاء الله

السلام عليكم

DefaultViewApp.zip

في المثال يتضح المقال

#5

أشكرك جزيل الشكر أخي الغملاسي على هذا التوضيح

ولكن ألا ترى معي بأن الفاصلة العلوية تستخدم للنص وليس الرقم ( الحقل النصي )

لقد جربت هذا السطر لوحده وقد نجح معي

Data1.TBpart.DefaultView.RowFilter = "Admin=" + Convert.ToString(ComboBox1.SelectedValue)

لأنني كنت في السابق اسند قيمة جديدة لــ combo بعد التصفية بالسطر التالي

Me.ComboBox2.DataSource = Me.Data1.TBpart.DefaultView.ToString

مما سبب ارباكا لتظهر الرسالة التالية

complex DataBinding accepts as Data source either an IList  or an IListSource

وهذا لعدم انتباهي :unsure: حيث انني قد قمت باسناد الجدول للقائمة اثناء التصميم :(

ولكنني عندما حذفت هذا السطر تم التنفيذ بدون مشاكل

وعلى حسب معلوماتي فمعاملة البيانات تكون حسب نوع البيانات فمثلا :

عندما يكون رقما
Ds1.Sections.DefaultView.RowFilter = "ID =1" 

عندما يكون نصا 
هذا للإسم كاملا
Ds1.Sections.DefaultView.RowFilter = "Name like 'حسن'"  
هذا للإسم الأول
Ds1.Sections.DefaultView.RowFilter = "Name like 'حسن %'"   
هذا للقب أو الإسم الأخير
Ds1.Sections.DefaultView.RowFilter = "Name like '% حسن '"  

عندما يكون تاريخا
Ds1.Sections.DefaultView.RowFilter = "date = #10/8/2005#"

وفي النهاية اشكرك جزيل الشكر أخي الغملاسي على ماتقدمت به من معلومات قيمة ومفيدة وأرجو ان يستفيد جميع الاخوة الاعضاء من هذا الموضوع وابداء الاراء و المشاركة

#6

السلام عليكم

جزاك الله خير اخي حسن المنتصر كلامك صحيح 100%

و أعذرني لقد سهيت عن هذا المنطق الذي سطرته يداك الكريمتان.

السلام عليكم

في المثال يتضح المقال

#7

وعليك السلام أخي

والبركة فيكم وجل من لايخطئ

و العبرة في الاستفادة مما قد تكرمت بكتابته في هذا الموضوع فأنتم اساتذتنا وخبرائنا وانتم قدوتنا

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

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

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