PDA

View Full Version : سوال: سرعت پایین datagrid در تعداد بالای داده



سیدسبحان
یک شنبه 20 دی 1394, 06:10 صبح
سلام. وقت بخیر
همه میدونیم که میشه itemssource دیتاگرید رو به دیتا بیس وصل کرد و تمام.
یعنی یه بار اطلاعات بانک رو بخونیم و به دیتا گرید متصلش کنیم.

ولی زمانی که اطلاعات زیاد باشه ، دیگه این کار منطقی نیست. چرا که برای load شدن دیتاگرید، باید زمان زیادی رو صبر کنیم.
خب حالا اگه برای یک فروشگاه که شاید 500 هزارتا کالا داشته باشه چی؟ خیلی زیاد میشه.

باید چکار کرد؟

محمد رضا فاتحی
یک شنبه 20 دی 1394, 07:06 صبح
سلام دوست عزیز....
هیچ موقع نیاز نیست همه اطلاعات بخصوص وقتی 500 هزار رکورد وجود داره به کاربر نمایش داده بشه
می تونی صفحه بندی کنی دیتاگریدت رو یا بنا به پارامترهای انتخابی کاربر دیتاهات رو تو گرید به کاربر نشون بدی

سیدسبحان
یک شنبه 20 دی 1394, 09:05 صبح
سلام دوست عزیز....
هیچ موقع نیاز نیست همه اطلاعات بخصوص وقتی 500 هزار رکورد وجود داره به کاربر نمایش داده بشه
می تونی صفحه بندی کنی دیتاگریدت رو یا بنا به پارامترهای انتخابی کاربر دیتاهات رو تو گرید به کاربر نشون بدی

چطوری باید صفحه بندی کنم؟

محمد رضا فاتحی
یک شنبه 20 دی 1394, 13:01 عصر
دوست عزیز...روش های متفاوتی جهت اتصال به پایگاه داده وجود داره و بالطبع صفحه بندی هم متفاوت..
من از ADO استفاده می کنم...
روش من برای صفحه بندی اینه...
این متغیرها رو تعریف می کنیم...

int curentRecord = 1;//نگهداری رکورد جاری
int pagesize = 10;//تعداد رکورد ها در صفحه
int previndex;//اندیس صفحه قبل
int totalpage;//کل صفحات


یه تابع تعریف می کنیم جهت محاسبه تعداد کل صفحات با توجه به طول صفحه مورد نظر

private int calculatePagesize(DataTable dt)
{
try
{
int t = dt.Rows.Count/pagesize;
if (dt.Rows.Count%pagesize > 0) t++;
return t;
}
catch
{
return 0;
}


}

یه تابع هم برای برگرداندن اطلاعات مورد نظر با ورودی های نام viewe ، صفحه جاری و شرط

private DataTable getcurentRecord(string view, int page, string condition)
{
string command = "";
string cond = "";
if (condition != "")
{
condition = " where " + condition;
cond = condition + " and ";
}
else
{
cond = " Where ";
}


if (page == 1)
{
command = string.Format("select top({0}) * from {1}{2}", pagesize, view, condition);
return data.Select(command);
}
else
{
//previusepagelimit = (page - 1)*pagesize;
previndex = (page - 1)*pagesize;
//select top (pagesize) from view condition and Not( id in (select top(pagesize) id from view order by id) order by id;
command =
string.Format(
"select top ({0}) * from {1} {2} Not( id in (select top({3}) id from {4} order by id)) order by id",
pagesize, view, cond, previndex, view);
return data.Select(command);
}
}


این کلیاتش بود...
می مونه 4 تا دکمه صفحه اول و آخر و بعد و قبل

صفحه اول:
dataGridViewX1.DataSource = getcurentRecord("vw_showbook", curentRecord, "");

صفحه آخر:


if (dataGridViewX1.Rows.Count == 0) return;
curentRecord = totalpage;
lblpage.Text = curentRecord + "از" + totalpage;
dataGridViewX1.DataSource = getcurentRecord("vw_showbook", curentRecord, "");


صفحه بعد:

if (dataGridViewX1.Rows.Count == 0) return;
if (curentRecord < totalpage)
curentRecord++;
lblpage.Text = curentRecord + "از" + totalpage;
dataGridViewX1.DataSource = getcurentRecord("vw_showbook", curentRecord, "");


صفحه قبل:

if (dataGridViewX1.Rows.Count == 0) return;
if (curentRecord > 1)
curentRecord--;
lblpage.Text = curentRecord + "از" + totalpage;
dataGridViewX1.DataSource = getcurentRecord("vw_showbook", curentRecord, "");


امیدوارم متوجه شده باشین...
البته یه کم نقص امنیتی ممکنه براش پیش بیاد:افسرده: که با پارامتر قابل حله...خودتون اصلاحش کنید:لبخند:

سیدسبحان
یک شنبه 20 دی 1394, 16:09 عصر
ممنون برادر
من یه راه میخاستم پیدا کنم که بدون گذاشتن دکمه بشه این کارو کرد
یعنی خودکار با استفاده از اسکرول بار خود دیتا گرید بشه تنظیمش کرد .
یعنی بفهمیم الان داره چی نشون میده، وقتی که اسکرول بارو حرکت داد، چی نشون بده.

اینطوری میشه ؟
یا اینکه فقط گذاشتن این دکمه ها و صفحه بندی اینطوری تنها راهه؟

و یه سوال دیگه اینکه با EF هم همین الگوریتم رو باید پیاده کرد یا اینکه کلا روش متفاوتی رو باید پیش گرفت؟

محمد رضا فاتحی
یک شنبه 20 دی 1394, 16:54 عصر
با اسکرول هم میشه...یادمه یکی از بچه ها تو همین سایت بود فکر کنم پیاده سازیش کرده بود...
شرمنده من با EF کار نمی کنم...اطلاع چندانی ندارم

ژیار رحیمی
یک شنبه 20 دی 1394, 21:05 عصر
سلام دوست گرامی به نظر من لود تمام 500هزار رکورد منطقی به نظر نمیرسه شما باید دیدگاه پیاده سازی این قسمت رو تغییر بدی.قاعدتا رکورد ها دارای تاریخ یا شماره خاصی هستند (مثلا اگر 500هزار رکورد برای چندین سال ثبت شده شما براساس سال فقط یک سال رو در DataGrid لود کن) با یه کامبوباکس بر اساس سال یا ماه یا تاریخ میتونی به کاربر حق انتخاب بدی به مراتب آسانتر و راحتتره برای کاربر.اسکرول کردن 500هزار رکورد برای کاربر واقعا خسته کننده س.حتما برای لود کردن از Thread استفاده کن
کدهایی که جناب فاتحی گذاشتن و اگر بخوای با Linq to Sql یا EntityFramework بنویسی ماهیت همان است فقط روش کد نویسی کم تر و به مرتب قابل فهم تره.نمونه کد Paging دیتاگرد هم با Linq to Sql هم با Entity هست بگردی پیدا میکنی