PDA

View Full Version : گفتگو: نمایشه صفحه به صفحه در دیتاگرید ویو Paging in DataGridView



reza_edu
دوشنبه 02 اسفند 1389, 22:15 عصر
با سلام به مهندسان گرامی

بااستفاده از کدی که تو سایت کد پروجکت بود تونستم یاد بگیرم که به چه صورت اطلاعات رو تو دیتاگرید بصورت صفحه به صفحه نمایش بدم (البته کد اصلی به زبان سی شارپ بود) تو نمایش هیچ مشکلی(با داده های کم) وجود نداره اما مشکل اصلی زمانی هست که تعداد رکورد ها به بیش از یک ملیون میرسه سرعت نمایش پائین میاد و وقتی به بالای 20 ملیون میرسه که دیگه ..... حالا خواستم تا کد رو تو سایت بزارم تا افراد دیگه ایکه خواستن استفاده کنن با دیدن این نمونه یاد بگیرن {اگه ارزش داشته باشه برای یاد گیری مونده به نظر دوستان}و دوستانی که اطلاعات بیشتری دارن و روش های بهتر رو اطلاع دارن بگن تا ماهم مطلع شیم با تشکر .

کد بسیار ساده هست اما بازم اگه دوستان خواستن تا توضیح بدم اعلام کنن در خدمت هستم.

nice_boy_a
دوشنبه 02 اسفند 1389, 23:07 عصر
سلام.
اگه میشه کدهارو توضیح بدین.ممنون.

reza_edu
سه شنبه 03 اسفند 1389, 23:59 عصر
فایل ضمیمه شده دارای تغیرات نهائی انجام شده میباشد.
----------------------------------------------------------------------------------------------------

سلام به دوستان و مهندسان گرامي
فايل قبلي كه قرار داده بودم داراي ايراداتي بود كه رفع كردم و فايل جديد را جاي گزين كردم البته هنوز مشكل سرعت نمايش پا برجا است كه اميد وارم تا اين مشكل را نيز برطرف كنم انشا الله . حالا ميخواهم با توجه به درخواست دوستمون كه توضيحاتي را خواسته بود اين توضيحات رو در ارتباط با برنامه قرار بدم اميد وارم كه مورد قبول باشه .
هدف از انجام اين عمل چيست ؟ در برنامه هاي كه از ديتابيس استفاده ميشود(يا فايل) ممكن است در هنگام نمايش ركورد ها در ديتا گريد ويو تعداد ركورد هاي نمايش داده شده به بيش از چند ده هزار برسد نمايش اين تعداد ركورد و لود آن در ديتا گريد ممكن است تاخيري در نمايش اطلاعات در ديتا گريد ويو ايجاد كند كه اين امر ممكن است براي كاربر نهائي اين مسئله را ايجد كند كه اين مشكل از طرف برنامه نويس بوده حال انكه اين عامل كندي ممكن است از سيستم عامل يا عوامل ديگر باشد ، تا انجا كه اين بنده ناچيز ميدانم اين وظيفه ماست تا رفاه كاربر نهائي را در هنگام استفاده از برنامه تامين كنيم پس چه بهتر هست كه با بكار گري روش هاي سعي بر ان داشته باشيم كه اين مسائل را حل كنيم بهترين روش براي رفع اين مشكل اين است اين اطلاعات رو بصورت دسته بندي شده در اختيار كاربر قرار بديم مزاياي استفاده از اين روش اين است كه 1. سرعت نمايش بيشتر شده 2. كاربر باديدن يك ديتا گريد شامل 1000000 ركورد چشاش در نمياد3. موقع گشتن دنبال داده خواص راحت تر ميتونه اطلاعات رو ببينه (اين موارد نظر شخصي من هست و ممكنه غلط باشه) با توجه به توضيحات داده شده فكر كنم واضح باشه كه اين برنامه بكار شما مياد يا نه . (نگاه كنيد بد نيست ممكنه تو آينده بدرد بخوره)
اين برنامه از دو قسمت تشكيل شده قسمت اول اصلا ربطي به اصل قضيه نداره و قسمت دوم نكته كليدي هست كه حالا هر كدوم رو توضيح ميدم .
قسمت اول : چرا اين قسمت به برنامه اضافه شده ؟ خوب من خواستم تا اين حالت (نمايش داده ها) رو شبيه سازي كنم خوب ديدم كه من كه ديتا بيسي با اين تعداد ركورد ندارم تا اون رو تو ديتا تيبل بريزم و بعد نمايش بدم پس ديدم كه خودم با يد اين جدول رو شبيه سازي كنم اما از اونجاكه ميخواستم تا اين اموزش رو تو سايت هم بزارم تا دوستان ديگر نيز اين كد رو تماشا كنن (و شايد ازش چيزي ياد بگيرن) نميتونن دو ساعت وايسن تا برنامه تيبل رو ايجاد كنه بعد امتحان كنن من هم براي اينكه همراه با اجراي برنامه جدول ساخته بشه از ترد استفاده كردم (توضيه اون تو همين سايت توسط دوستان گرامي گذاشته شده) تا همگام با نمايش جدول هم ساخته بشه براي ساخت جدول از كد زير استفاده كردم


Sub CreateTable()

Dim column(7) As DataColumn

'//////////////////////////////////
column(0) = New DataColumnستون ها ساخته ميشن
column(0).ColumnName = "ID_Customer"نام ستون تعين ميشه
column(0).DataType = System.Type.GetType("System.Int32")نوع داده ستون
FullDataTable.Columns.Add(column(0))ستون اضافه ميشه
'//////////////////////////////////
column(1) = New DataColumn
column(1).ColumnName = "FirstName"
column(1).DataType = System.Type.GetType("System.String")
FullDataTable.Columns.Add(column(1))
'//////////////////////////////////
column(2) = New DataColumn
column(2).ColumnName = "LastName"
column(2).DataType = System.Type.GetType("System.String")
FullDataTable.Columns.Add(column(2))
For num As Integer = 3 To 7
column(num) = New DataColumn
column(num).ColumnName = "Num " & num
column(num).DataType = System.Type.GetType("System.String")
FullDataTable.Columns.Add(column(num))
Next
For counter As Integer = 0 To 1000000تو اين حلقه ركورد ها ساخته ميشن
Dim dr As DataRow
dr = FullDataTable.NewRow
dr("ID_Customer") = (counter + 1)
dr("FirstName") = "FirstName"
dr("LastName") = "LastName"
FullDataTable.Rows.Add(dr)ركورد ها به جدول اصلي اضافه ميشن
Next

End Sub


اين كد درون يك درون يك ساب روتين قرار داده شده تا توسط ترد ها مورد استفاده باشه زماني كه بين صفحه ها حركت ميكنيد ابتدا چك ميشه كه كار ساخت جدول تموم شده يانه اگه تموم نشده بود كه اطلاعات ديتا تيبل به ديتا بايند اضافه ميشه و اگه تموم شده بود كه ديگه اضافه نميشه كد زير


PageNumber += 1نمايش دهنده تعداد صفحه ها
If DataGridView1.Rows(0).Cells(0).Value < FullDataTable.Rows.Count Thenشرط چك كردن مكان نمايش داده شده
If MyThread.ThreadState = ThreadState.Running Then اگر ترد وجود داشت
MyThread.Suspend()ترد به حالت معلق دربياد
LowerBoundary += 50نمايش دهنده ركورد هاي قابل نمايش حد پائين
UpperBoundary += 50حد بالاي ركورد ها
bind.DataSource = FullDataTable قرار دادن اطلاعات جدول اصلي
bind.Filter = "ID_Customer>=" & LowerBoundary & " and ID_Customer<=" & (UpperBoundary - 1)شرط اصلي و مهم كه اين فيلتر هست
DataGridView1.DataSource = bindقرار دادن اطلاعات فيلتر شده در گريد ويو
Label2.Text = PageNumber نمايش دهنده صفحه جاري
Label4.Text = NumberOfPage()نمايش دهنده كل صفحه ها
MyThread.Resume()به اجرا در اوردن ترد از حالت معلق
Else
LowerBoundary += 50
UpperBoundary += 50
bind.Filter = "ID_Customer>=" & LowerBoundary & " and ID_Customer<=" & (UpperBoundary - 1)
DataGridView1.DataSource = bind
Label2.Text = PageNumber
Label4.Text = NumberOfPage()
End If
End If


حالا قسمت دوم كه اصل قضيه هست:
زماني كه شما از ديتابيس استفاده ميكنيد كارتون خيلي راحت ميشه ديگه اين كا رايكه من تو قسمت اول كردم به درد شما نميخوره چون شما راحت با يه كوري ساده (يا كوري شرطي) تمام اطلاعات رو از ديتابيس يك جا ميگيريد و يكدفه ميريزيد تو ديتا تيبل (يا ديتا ست كه به اشتباه به نظرمن همجا ميگن از اون استفاده كنن براي يه جدول!)بعد تنها كاري كه شما بايد انجام بديد يه متغير گلوبال (عمومي) تعريف ميكنيد مثل زير


Dim bind As New BindingSource

حالا راحت با يكد ساده اطلاعات رو از ديتا تيبل يا ديتاست ميريزيد تو ديتا سورس بايندينگ سورس مثل كد زير




bind.DataSource = FullDataTable


حالا كه داده ها رو ريختيد اينكار رو فقط يكبار نيازه تا انجام بدين هر بار كه اطلاعات ديتا تيبل تغير كرد تنها كار موندا اينه كه كد زير رو بنويسيد


DataGridView1.DataSource = bind

و با شرطي كه براي فيلتر تعين ميكنيد(همانند شرط هائي كه براي ديتابيس تعين ميكنيد) ميتونيد داده ها ي نمايش داده شده تو ديتا گريد رو تغير بديد بااين روش ميشه سرعت نمايش رو بالابرد و به كاربر اين حالت رو القا كرد كه داره اطلاعات رو صفحه به صفحه ميخونه(ميبينه).

bind.Filter = "ID_Customer>=" & LowerBoundary & " and ID_Customer<=" & (UpperBoundary - 1)
اميد وارم كه اين توضيحات تونسته باشه كمكي براي دوستان باشه در اخر خواشمندم تا تمامي دوستاني رو كه در اين مجموعه سعي دارند تا با راه هاي گوناگون به دوست داران علم كمكي كرده باشند رو از دعاي خيرتون بينصيب نكنيد باتشكر.