تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] DataGridView بطيء جدا ساعدوني لاجد حل
#1
السلام عليكم

قمت سابقا بكتابة موضوع لنفس المشكله
http://vb4arb.com/vb/thread-17613.html

وقمت بالبحث في اكثر من مكان

هنا احد الحلول
http://rdatagridview.blogspot.ae/

بس ما قدرة احصل على ملف
SpeedUpDGV.DLL

علما باني قمت بمراسلة المبرمج
وبحثت في قوقل
DataGridView very slow VB.NET

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

فكرة في التغيير الى database access 
ان يقراء من XML

بس احد المبرمجين قال لي بان في حالت تعاملي معdatabase access  يصعب على بعض المستخدمين لفتح المشروع في اجهزتهم

اخر فكرة فكرة بان في حالت عمل 
Import  للملف 

اقصم الداتا  الى ملفات مثلا

مثلا الملف اللي ينزل الداتا الي في كذا


PHP كود :
<CALL:6>IT9AUG <qso_date:8>20111119 <time_on:4>1147 <bands:3>20M <modes:3>SSB 
 
<CALL:4>LY7M <qso_date:8>20121215 <time_on:4>1809 <bands:4>160M <modes:2>CW 
 
<CALL:5>A41ZZ <qso_date:8>20111119 <time_on:4>1149 <bands:3>20M <modes:3>SSB 
 
<CALL:5>A41ZZ <qso_date:8>20141119 <time_on:4>1149 <bands:3>20M <modes:3>SSB 
 
<CALL:5>A41ZZ <qso_date:8>20161119 <time_on:4>1149 <bands:3>20M <modes:3>SSB 
 
<CALL:5>A41ZZ <qso_date:8>20161119 <time_on:4>1149 <bands:3>20M <modes:3>SSB 
 
<CALL:5>A41ZZ <qso_date:8>20141119 <time_on:4>1149 <bands:3>20M <modes:3>SSB 
 
<CALL:5>A41ZZ <qso_date:8>20141119 <time_on:4>1149 <bands:3>20M <modes:3>SSB 


التاريخ هنا
<qso_date:8>20111119

اذا كان التاريخ 2016
يعمل لي ملف
2016.XML

وينزل لي جميع الداتا اللي لها تاريخ 2016


و2015  كذالك نفس الشي
2015.XML
2014.XML
موضوع ال Import هنا
http://vb4arb.com/vb/thread-16602.html

وفي العرض اقوم بعرض  سنه واحده بهذا اعتقد بيكون الفتح اسرع ل DataGridView


اتمنى اجد منكم الحل ورايكم يهمني خصوصا باني مبرمج مبتدء 

وشكرا
الرد
تم الشكر بواسطة:
#2
غالباً يا صديقي المشكلة لا تخص الكائن 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 ObjectAs EventArgsHandles 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 


الملفات المرفقة
.rar   with2.rar (الحجم : 2.65 م ب / التحميلات : 68)
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة: جميل علي , جميل علي , dubai.eig , myalsailamy , Amir_Alzubidy , Adrees
#3
(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 ObjectAs EventArgsHandles 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 

جزاك الله الجنه 

فعلا هذا اللي اريده   بارك الله فيك ما اعرف يف اشكرك بس فعلا ريحتني كثير بارك الله فيك وجزاك الله  خير وخير وخير ويزيد علمك
الرد
تم الشكر بواسطة: Amir_Alzubidy , ابو ليلى
#4
اخي ابو ليلى

عندي سؤال بارك الله فيك

في مجال اعرض فقط عدد معين من الاسطر يعني ما نحتاج لتعدد الصفحات

يعني نقول للكود اسحب من ملف ال xml فقط 50 اسطر


حاليا يعرض 15 في كل صفحة بس مع الاسف لازال البطيء في الفتح لان هو ساحب جميع ابيانات من الملف ولو في مجال نسحب فقط 50 سطر بيكون افضل بكثير

طمعان بخيرك بارك الله فيك

وشكرا من جديد

إقتباس :اما من ناحية البرمجة و الكود فالافضل ان تنتقي المكتبات الاكثر سرعة في التعامل مع البيانات من جلب و استعراض


ما هيه المكتبات الاخرى ؟
الرد
تم الشكر بواسطة:
#5
هناك مكتبة XQuery و هي تتعامل مع ملفات XML وهي تستخدم التعليمات القياسية TSql للتعامل مع البيانات داخل ملفات XML
ابحث عنها و تعرف على طريقة استخدامها داخل مشروعك
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مساعدة بخصوص حفظ عدد داخل datagridview chankar 18 363 18-09-20, 02:46 AM
آخر رد: chankar
  مساعدة بخصوص حفظ عدد داخل datagridview chankar 0 62 16-09-20, 09:19 PM
آخر رد: chankar
  طباعة datagridview محمود صالح 10 3,130 15-09-20, 03:04 AM
آخر رد: lira.dox
  تصدير محتويات datagridview الى pdf كرم ابوهشام 7 1,864 15-09-20, 12:34 AM
آخر رد: حريف برمجة
  سؤال بخصوص CellBackcolor Selection in Datagridview .net yazanahmed 2 83 13-09-20, 12:07 AM
آخر رد: T 1
  [سؤال] [تم الحل]استعراض بيانات في Datagridview واضافة جميع البيانات لجدول محدد محمد العامر 6 572 22-08-20, 08:15 AM
آخر رد: محمد العامر
  [سؤال] خطأ في التنفيذ الكود بعد فلترة dataGridView محمد العامر 2 213 20-08-20, 01:38 PM
آخر رد: محمد العامر
  تحديد نقطة واحدة dot في حقل ال datagridview Mohammed Nafa 9 403 05-08-20, 02:03 PM
آخر رد: Mohammed Nafa
  هل يمكن تحميل اسم قاعدة البيانات في جدول DataGridView أو لست بوكس المهنا 2 290 26-07-20, 11:46 PM
آخر رد: المهنا
  ياشباب محتاج كود صغير يقوم بالبحث عن حقل معين فلتر بال Datagridview moh61 13 3,864 21-07-20, 11:48 PM
آخر رد: alessam4pro

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم