20-11-16, 08:38 AM
(20-11-16, 04:39 AM)ابو ليلى كتب : غالباً يا صديقي المشكلة لا تخص الكائن DataGridView في مثل هذه الحالة
فالعمل يجري وفق سيناريو مختلف
انت تريد ان تحمل كم كبير من البيانات الى الذاكرة و تحديداً الى العنصر DataSet القابع في الذاكرة
هنا تحصل المشكلة , المشكلة التالية التي انت بصددها هي عملية التحرك ضمن هذا الكم الهائل في عنصر DataGridView
فلو اردت عمل فرز او فلترة سترى البطئ في عنصر DataGridview
المهم في الموضوع اذا اردت الحفاظ على ملف XML و ان تتعامل معه وفق نفس الالية الخاصة بقواعد البيانات بحيث تحافظ على سلاسة
الحركة في كائن DataGridView فيتوجب عليك تخفيض كمية البيانات المعروضة فيه
و لتخفف الضغط و البطئ في عملية تحميل الملف الى الذاكرة
فيتوجب ان تتوفر على جهاز بذواكر عالية وسرعة Bus عالية ايضاً للذواكر لان حجم البيانات المحملة كبير (هذا من جهة HardWare)
اما من ناحية البرمجة و الكود فالافضل ان تنتقي المكتبات الاكثر سرعة في التعامل مع البيانات من جلب و استعراض...الخ
و كذلك ان تغير من السيناريو المتبع في طريقة الربط مع عنصر القريد (امور كثيرة يجب توفيرها لا اريد ان ادخل في تفاصيلها...)
بكل الاحوال انا عملت لك تعديل على المثال يقوم بجلب البيانات في غضون 14-20 ثانية و يحملها في الذاكرة بعد ان كان الكود لديك يستغرق اكثر من دقيقة.
ثم قمت بعملية تقسيم للبيانات الى صفحات لتسهيل عملية عرضها في الكائن DataGridView
قمت بعرض 15 عنصر في كل صفحة (طبعاً يمكن التغير من الكود لعدد السجلات المعروضة)
وقمت بتوفير الازرار المناسبة لعمليات التنقل لباقي الصفحات كما ترى في هذه الصور
![]()
![]()
سارفق الكود و المثال (ربما لا يعمل المثال لديك , المثال معمول على VS2015)
الكود
PHP كود :
ImportsSystem.IO
Public Class WORK
Const PAGE_SIZE As Integer = 15
Private _nPage As Integer = 0
Private _maxPages As Integer
Private Sub Frmmain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim myXMLfile As String = My.Application.Info.DirectoryPath & "\" & "data.xml"
If File.Exists(myXMLfile) Then
Dim fsReadXml As New FileStream(myXMLfile, FileMode.Open)
DS.ReadXml(fsReadXml)
_maxPages = Convert.ToInt32(Math.Ceiling(CDbl(DS.Tables(0).Rows.Count) / PAGE_SIZE))
BindPageToGrid()
LbNumber.Text = _nPage
Else
DS.WriteXml(My.Application.Info.DirectoryPath & "\" & "data.xml")
End If
End Sub
Private Sub BindPageToGrid()
Dim dsPage = DS.Tables(0).AsEnumerable().Skip(_nPage * PAGE_SIZE).Take(PAGE_SIZE).[Select](Function(x) x)
dgvData.DataSource = dsPage.CopyToDataTable
End Sub
Private Sub BtnNext_Click(sender As Object, e As EventArgs) Handles BtnNext.Click
_nPage = (_nPage + 1) Mod _maxPages
BindPageToGrid()
Enables_Btns()
LbNumber.Text = _nPage
End Sub
Private Sub BtnPrev_Click(sender As Object, e As EventArgs) Handles BtnPrev.Click
_nPage = (_nPage - 1) Mod _maxPages
BindPageToGrid()
Enables_Btns()
LbNumber.Text = _nPage
End Sub
Private Sub Enables_Btns()
Select Case _nPage
Case = 0
BtnPrev.Enabled = False
BtnFirst.Enabled = False
BtnNext.Enabled = True
BtnLast.Enabled = True
Case < (_maxPages - 1)
BtnPrev.Enabled = True
BtnNext.Enabled = True
BtnFirst.Enabled = True
BtnLast.Enabled = True
Case = _maxPages - 1
BtnPrev.Enabled = True
BtnFirst.Enabled = True
BtnNext.Enabled = False
BtnLast.Enabled = False
End Select
End Sub
Private Sub BtnLast_Click(sender As Object, e As EventArgs) Handles BtnLast.Click
_nPage = _maxPages - 1
BindPageToGrid()
Enables_Btns()
LbNumber.Text = _nPage
End Sub
Private Sub BtnFirst_Click(sender As Object, e As EventArgs) Handles BtnFirst.Click
_nPage = 0
BindPageToGrid()
Enables_Btns()
LbNumber.Text = _nPage
End Sub
End Class
جزاك الله الجنه
فعلا هذا اللي اريده بارك الله فيك ما اعرف يف اشكرك بس فعلا ريحتني كثير بارك الله فيك وجزاك الله خير وخير وخير ويزيد علمك

