PDA

View Full Version : مشکل با هنگ کردن فرم به علت لود دیتاگرید ، سی شارپ



mrhunter
شنبه 04 خرداد 1398, 00:00 صبح
سلام دوستان من یک تیبل دارم با 1 میلیون رکورد اینو متصل کردم به دیتاسورس دیتاگرید ویو. چون حدودا چند ثانیه ای میبره تا دیتا ها واکشی بشن فرم توی این مدت کلا هنگ و نمیشه اصلا دست زد
از روی این پست( لینک پست (http://barnamenevis.org/showthread.php?471795-%D9%85%D8%B4%DA%A9%D9%84-%D8%A8%D8%A7-%D9%87%D9%86%DA%AF-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE&p=2115200&viewfull=1#post2115200)) خواستم مشکل رو حل کنم اما نشد یعنی وقتی روی دکمه جهت پرکردن دیتاگرید میزنم همچنان فرم چند ثانیه هنگ . ممنون میشم دوستان یک روش ساده اگر میشه کد بدید
معرفی کنن و کد های خوبی باشه که رکورد اگر شد 100 میلیون بازم هنگ نکنه. و روی اکثر سیستم ها این متد قابل اجرا باشه مرسی.

public partial class Form5 : Form
{
public Form5()
{
InitializeComponent();
}
public delegate void _fillGrid();
private void fillGrid()
{
if (this.InvokeRequired)
{
this.Invoke(new _fillGrid(fillGrid));
return;
}
//کدهای متد خودتو اینجا بنویس
dataGridView1.DataSource = ClassDB_SQL.returnDataTable("select * from table_user");//واکشی اطلاعات
}

private void button1_Click(object sender, EventArgs e)
{
Thread Th = new Thread(fillGrid);
Th.Start();
}

private void Form5_Load(object sender, EventArgs e)
{

}
}

mr.sirwan
شنبه 04 خرداد 1398, 00:35 صبح
لود کردن یک میلیون رکورد اون هم بصورت یکجا و یکباره واقعا لازمه؟ کاربر بخت برگشته قراره چطوری توی دیتاگریدی که یک میلیون رکورد داخلش هست اسکرول انجام بده؟؟؟ پیشنهاد بنده صفحه بندی دیتاگرید هست که خیلی خیلی در لود کردن کمک میکنه

asiatec
شنبه 04 خرداد 1398, 06:55 صبح
یک میلیون رکورد با select * به صورت یکجا کاملا اشتباهه

hamidrezax1
شنبه 04 خرداد 1398, 08:36 صبح
سلام دوست عزیز .ببینید هیچ کاربری نیاز نداره که 1 میلیون رکورد رو مشاهده کنه.با دستور top شما تعداد خاصی رکورد رو به کاربر نمایش میدین

select TOP 1000 * from table_user

mrhunter
شنبه 04 خرداد 1398, 09:59 صبح
با تشکر از همه دوستان عزیز... بنده از دستور top و صحفه بندی اگاهی دارم اما

سوال اول : اینو کلا مثل یک تمرین خواستم یاد بگیرم... که چطوری میشه مدیریت لود دیتا توسط دیتاگرید رو با کمک ترید ها انجام داد که از کرش کردن جلوگیری کنه؟؟

سوال دوم : من برای شماره گذاری ردیف در دیتاگرید از آیدی استفاده نمیکنم چون با حذف رکورد اون ترتیب شماره ها به هم میریزه به خاطر همین از روش های شماره گذاری استفاده میکنم که روی
rowheadercell در واقع رخ میده و در کناره جدول شماره گذاری میشه (عکس ضمیمه رو مشاهده کنید لطفا) حالا برای 1 میلیون رکورد با این روش شماره گذاری تایم لود از 8 ثانیه به 50 ثانیه میرسه.

وقتی هم خواستم از روش های صفحه بندی استفاده کنم . ی مشکلی که هست مثلا تعداد نمایش رکورد در هرصفحه 10 تا باشه وقتی next میشه بجای شروع شماره ردیف از 11 ، دوباره میشه 1-10 امکان هندل این مشکل هست؟

من احساس میکنم یا باید شماره گذاری ردیف باشه یا صفحه بندی گویا حد وسط نیست.:لبخند: شایدم بنده اشتباه میکنم. اگرم کلا نمیشه تا صفحه بندی کنم و شماره ردیف هم بیخیال بشم. (البته کاربر نیاز داشته باشه توی حالت پرینت شماره ردیف توسط استیمول سافت ایجاد میشه و فک نکنم زیاد ضروری باشه شماره ردیف در حین کار با برنامه ..:متفکر:

بهرحال منتظر نظر دوستان هستم

اینم کد تابع که شماره ردیف رو تولید میکنه

private void radif()
{
long rownumber = 1;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.IsNewRow)
continue;
row.HeaderCell.Value = rownumber.ToString();
rownumber = rownumber + 1;
}
}

mr.sirwan
شنبه 04 خرداد 1398, 13:21 عصر
برای ردیف گذاری، یک ستون توی دیتاگرید با اسم Row ایجاد کنید و بعد توی ایونت CellFormatting دیتاگرید این کد رو بنویسید:
dataGridView.Rows[e.RowIndex].Cells["Row"].Value = e.RowIndex + 1;



برای اینکه شماره ردیف ها هم در هر صفحه ادامه صفحه قبل از خودش باشه باید از متغیرهای مربوط به صفحه بندیتون استفاده کنید، مثلا متغیر PageIndex که معرف شماره صفحه هست رو ضربدر تعداد رکورد در هر صفحه کنید (PageSize) و نتیجه رو بعلاوه (e.RowIndex + 1) کنید

mrhunter
شنبه 04 خرداد 1398, 14:09 عصر
برای ردیف گذاری، یک ستون توی دیتاگرید با اسم Row ایجاد کنید و بعد توی ایونت CellFormatting دیتاگرید این کد رو بنویسید:
dataGridView.Rows[e.RowIndex].Cells["Row"].Value = e.RowIndex + 1;



برای اینکه شماره ردیف ها هم در هر صفحه ادامه صفحه قبل از خودش باشه باید از متغیرهای مربوط به صفحه بندیتون استفاده کنید، مثلا متغیر PageIndex که معرف شماره صفحه هست رو ضربدر تعداد رکورد در هر صفحه کنید (PageSize) و نتیجه رو بعلاوه (e.RowIndex + 1) کنید




سلام خیلی ممنون از پاسخ شما ... امتحان میکنم حتما نتیجه رو میگم ، نظر شما در مورد نمایش شماره ردیف چیه ؟ آیا در هنگام کار با برنامه اگر نباشه مشکلی هست از نظر ارتباط راحتی برنامه با کاربر ؟

بعد اینکه درمورد لود دیتا در دیتاگریدویو و کنترل آن با ترید نظری نداشتین؟

دوستان دیگه هم نظری دارید لطفا اعلام کنید. چون میخوام حالت های مختلف رو بسنجم ممنون

masterking
شنبه 04 خرداد 1398, 14:44 عصر
سرچ سرچ سرچ

mrhunter
شنبه 04 خرداد 1398, 15:13 عصر
سرچ سرچ سرچ

دوست عزیز من 2 روز دارم سرچ میکنم ولی به اون چیزی که مد نظرم بود نرسیدم یعنی پاسخ سوالاتی که پرسیدم...اکثر بحث های بک گراند ورکر روی progress bar هست و چیز جالبی در مورد دیتاگرید پیدا نکردم.... به خاطر همین خواستم از تجربه دیگران استفاده کنم ، و در پاسخ شما چیزی به عنوان جواب نمیبینم شاید به جای این کلمات بهتر بود یک نظر مفید میدادی

hamidtmu
شنبه 04 خرداد 1398, 18:12 عصر
دوست عزیز من 2 روز دارم سرچ میکنم ولی به اون چیزی که مد نظرم بود نرسیدم یعنی پاسخ سوالاتی که پرسیدم...اکثر بحث های بک گراند ورکر روی progress bar هست و چیز جالبی در مورد دیتاگرید پیدا نکردم.... به خاطر همین خواستم از تجربه دیگران استفاده کنم ، و در پاسخ شما چیزی به عنوان جواب نمیبینم شاید به جای این کلمات بهتر بود یک نظر مفید میدادی

حق با دوستمونه اگه کسی می تونه کمک کنه. منم این مشکلو دارم. اگه به نتیجه رسیدی اشتراک بزار منم استفاده کنم. هر کسی یه راهکاری داده
--------
بعد دوست عزیز اگه صفحه بندی کردید سرعت لودتون بالاتر رفته یا خیر. یه جا خوندم نوشته بود (https://www.daneshjooyar.com/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B5%D9%81%D8%AD%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-datagridview-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE/) که سرعت را دوبرابر کمتر می کنه که استاد شروین با این قضیه مخالفه ؛ احتمالا توی کد نویسیش مشکل داشتند.
ممنون میشم راهنمایی در مورد صفحه بندی اصولی دیتا گرید هم قرار بدید

mrhunter
شنبه 04 خرداد 1398, 21:42 عصر
برای ردیف گذاری، یک ستون توی دیتاگرید با اسم Row ایجاد کنید و بعد توی ایونت CellFormatting دیتاگرید این کد رو بنویسید:
dataGridView.Rows[e.RowIndex].Cells["Row"].Value = e.RowIndex + 1;



برای اینکه شماره ردیف ها هم در هر صفحه ادامه صفحه قبل از خودش باشه باید از متغیرهای مربوط به صفحه بندیتون استفاده کنید، مثلا متغیر PageIndex که معرف شماره صفحه هست رو ضربدر تعداد رکورد در هر صفحه کنید (PageSize) و نتیجه رو بعلاوه (e.RowIndex + 1) کنید




اینو تست کردم ولی جلو تر نشان میده.. یعنی مثلا اگر pagesize رو میدیم 10 رکورد در هر صفحه این شمارشش رو از 11 شروع میکنه اگر میشه لطفا خودتان ی نمونه کد تکمیل تر بذارید ممنون میشم. بعد اینکه وقتی صفحه بندی زدم و روی
cellformatting بریک پوینت زدم تا شماره اخرین رکورد مرتب داره مثل ی حلقه لوپ هی کار میکنه (ترمز میبره انگاری):قهقهه: چطوری میشه کنترلش کرد 10 تا رو که شماره زد استاپ کنه

روش دیگه برای شماره گذاری نیست؟

mrhunter
شنبه 04 خرداد 1398, 21:47 عصر
حق با دوستمونه اگه کسی می تونه کمک کنه. منم این مشکلو دارم. اگه به نتیجه رسیدی اشتراک بزار منم استفاده کنم. هر کسی یه راهکاری داده
--------
بعد دوست عزیز اگه صفحه بندی کردید سرعت لودتون بالاتر رفته یا خیر. یه جا خوندم نوشته بود (https://www.daneshjooyar.com/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B5%D9%81%D8%AD%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-datagridview-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE/) که سرعت را دوبرابر کمتر می کنه که استاد شروین با این قضیه مخالفه ؛ احتمالا توی کد نویسیش مشکل داشتند.
ممنون میشم راهنمایی در مورد صفحه بندی اصولی دیتا گرید هم قرار بدید

صفحه بندی رو تست کردم دوست عزیز هم این لینک که شما دادی و همقبلا این لینک (https://www.youtube.com/watch?v=L1wpQ_fKjVw) ولی تاثیر توی سرعت لود نداشت شاید در حد 1 یا 2 ثانیه کم شد بیشتر کاربردش توی نمایش بهتر و خوانا تر رکورد هاس روی سرعت تاثیر نمیذاره طبق تست بنده برای 1 میلیون رکورد

mr.sirwan
یک شنبه 05 خرداد 1398, 01:01 صبح
صفحه بندی رو تست کردم دوست عزیز هم این لینک که شما دادی و همقبلا این لینک (https://www.youtube.com/watch?v=L1wpQ_fKjVw) ولی تاثیر توی سرعت لود نداشت شاید در حد 1 یا 2 ثانیه کم شد بیشتر کاربردش توی نمایش بهتر و خوانا تر رکورد هاس روی سرعت تاثیر نمیذاره طبق تست بنده برای 1 میلیون رکورد

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


بعد اینکه وقتی صفحه بندی زدم و روی
cellformatting بریک پوینت زدم تا شماره اخرین رکورد مرتب داره مثل ی حلقه لوپ هی کار میکنه (ترمز میبره انگاری)http://barnamenevis.org/images/smilies/yahoo/124.gif چطوری میشه کنترلش کرد 10 تا رو که شماره زد استاپ کنه
روش دیگه برای شماره گذاری نیست؟
دوست عزیز من این روشی که گفتم برای حالتی بود که بخواید صفحه بندی انجام بدین نه اینکه برای یک میلیون رکورد اجراش کنید، شما اول صفحه بندیتون رو انجام بدین بعد برای واکشی هر صفحه این خودش اتوماتیک شماره ردیف رو میزنه، مشکلی که گفتین از 11 شروع میکنه چیز سختی نیست میتونستین یکم روش فکر کنید خودتون به نتیجه میرسیدین فقط کافیه PageIndex رو منهای یک کنید بعد ضربدر PageSize و مابقی ماجرا

asiatec
یک شنبه 05 خرداد 1398, 08:15 صبح
این اموزش که شما رفتی دیدی با کار که شما انجام میدادی هیچ فرقی نداره او هم داره در اول کار کل رکورد ها رو واکشی میکنه،

mrhunter
دوشنبه 06 خرداد 1398, 00:35 صبح
با صفحه بندی دقیقا چقد طول میکشه؟ اگر مقدوره این دیتابیستون رو اینجا بذارید تا تست کنیم


دوست عزیز من این روشی که گفتم برای حالتی بود که بخواید صفحه بندی انجام بدین نه اینکه برای یک میلیون رکورد اجراش کنید، شما اول صفحه بندیتون رو انجام بدین بعد برای واکشی هر صفحه این خودش اتوماتیک شماره ردیف رو میزنه، مشکلی که گفتین از 11 شروع میکنه چیز سختی نیست میتونستین یکم روش فکر کنید خودتون به نتیجه میرسیدین فقط کافیه PageIndex رو منهای یک کنید بعد ضربدر PageSize و مابقی ماجرا

چشم حتما الان یکم کدهاش بهم ریخته هست یکم ترو تمیز کنم هم سورس کد هم دیتابیس رو میذارم که به هر روشی دوستان خواستن تست کنن و نتیجه رو اینجا بگن

بعله اون من یکم عجله کردم با کمی دستکاری به نتیجه درست رسیدم

mrhunter
دوشنبه 06 خرداد 1398, 02:10 صبح
این اموزش که شما رفتی دیدی با کار که شما انجام میدادی هیچ فرقی نداره او هم داره در اول کار کل رکورد ها رو واکشی میکنه،

کاملا صحیح این اموزش ها اشتباهی که دارن واکشی تمام اطلاعات از دیتابیس در یک دیتاست برای rows.count کردن و... درصورتی که با دستور count خود sql خیلی سریع به نتیجه میرسیم

بهرحال بنده با ازمون و خطا ضمن صفحه بندی و استفاده از بک گراند ورکر برای جلوگیری از کرش کردن فرم موفق شدم 1 میلیون رکورد رو از حدودا 8 ثانیه به کسری از ثانیه برسانم که در عکس ضمیمه شده همه چیز واضح و شفاف مشخص هست
timeload هم بصورت سیستمی مشخص و ثبت شده.

hamidtmu
دوشنبه 06 خرداد 1398, 14:48 عصر
چشم حتما الان یکم کدهاش بهم ریخته هست یکم ترو تمیز کنم هم سورس کد هم دیتابیس رو میذارم که به هر روشی دوستان خواستن تست کنن و نتیجه رو اینجا بگن

بعله اون من یکم عجله کردم با کمی دستکاری به نتیجه درست رسیدم
جسارتا اگر به نتیجه رسیدید و مشکلی نداشتید به اشتراک بزارید

mrhunter
دوشنبه 06 خرداد 1398, 15:21 عصر
جسارتا اگر به نتیجه رسیدید و مشکلی نداشتید به اشتراک بزارید

چشم حتما دارم روی بهبودش کارمیکنم فقط چیزی که هست دنبال ی کامپونت خوشگل میگردم واسه این لودینگ هرکاری کردم بک گراند این Transparent نشد هم از ابزار Circular ProgressBar توی دات نت بار استفاده کردم هم از nuget اینو گرفتم
https://github.com/falahati/CircularProgressBar

ولی هردو این مشکل بک گراند رو دارن اگر از دوستان کسی میشناسه ی لودینگ قشنگ تر معرفی کنه مرسی

mrhunter
سه شنبه 07 خرداد 1398, 18:46 عصر
سلام دوستان بنده سورس کد برنامه رو قرار دادم که در این سورس کد لوددیتا در دیتاگرید ویو توسط بک گراند ورکر کنترل میشه. دارای صفحه بندی و لودینگ هم هست

اما متاسفانه چون یک میلیون رکورد حجم زیادی برای فایل دیتابیس ایجاد کرده بود نتونستم اونم قرار بدم به خاطر همین فایل اسکریپتش که ساختار جدول رو میسازه قرار دادم دیگه خودتون میتونید با نرم افزار SQL Data Generator 4

هر مقدار خواستید دیتا تزریق کنید :لبخند:

اگر دوستان در روند بهبود و سریع تر کردن کد ها پیشنهادی دارن خیلی خیلی خوشحال میشم ارائه کنید یا در گیت هاب ثبت کنید.

همچنین اگر کامپونتی برای لودینگ دارید بهتر از این معرفی کنید مرسی

دوستان میتوانید این سورس کد را در گیت هاب دریافت کنید

مشاهده در گیت هاب (https://github.com/sharlobin2/fill-datagridview-with-backgroundWorker)

mrhunter
چهارشنبه 08 خرداد 1398, 20:03 عصر
دوستان برای بخش dowork بک گراند ورکر این مدلی کد زدم

Invoke(new MethodInvoker(
delegate
{
//set the DataGridView control's data source
dataGridView1.DataSource = ds.Tables[0];
}));

حالا خواستم بدونم MethodInvoker با new Action(() چه فرقی داره کدام بهتر هست و امکان ایجاد خطارو کمتر میکنه
مثلا یجا بعد از fill کردن دیتاگرید خواستم ی لیبل مقدار بدم اینجوری زدم

label1.Invoke(new Action(() => label1.Text = @"TimeLoad: " + sw.Elapsed.ToString()));




The delegate can be an instance of EventHandler, in which case the sender parameter will contain this control, and the event parameter will contain EventArgs.Empty. The delegate can also be an instance of MethodInvoker, or any other delegate that takes a void parameter list. A call to an EventHandler or MethodInvoker delegate will be faster than a call to another type of delegate.

MethodInvoker provides a simple delegate that is used to invoke a method with a void parameter list. This delegate can be used when making calls to a control's Invoke method, or when you need a simple delegate but do not want to define one yourself.

an Action on the other hand can take up to 4 parameters.

But I don't think there is any difference between MethodInvoker and Action as they both simply encapsulate a delegate that doesn't take a paremter and returns void


این رو از نت گرفتم ولی خب زیاد متوجه نشدم دقیقا درکش نکردم ممنون میشم دوستان راهنمایی کنید

Mahmoud.Afrad
چهارشنبه 08 خرداد 1398, 21:25 عصر
فرم frm_DataGridView_Pagination مربوط به صفحه بندی هست؟ مشکلش اینه که برای محاسبه تعداد کل رکوردها، همه رو لود میکنی.

mrhunter
پنج شنبه 09 خرداد 1398, 17:15 عصر
فرم frm_DataGridView_Pagination مربوط به صفحه بندی هست؟ مشکلش اینه که برای محاسبه تعداد کل رکوردها، همه رو لود میکنی.


اره برای اون من برای هر حالت جدا زدم فرم هارو که تفاوت ها مشخص باشه .. بعله درست میگید اونجا همه رکورد هارو لود کردم

farzad_1354
دوشنبه 20 اردیبهشت 1400, 11:03 صبح
سلام دوستان من یک تیبل دارم با 1 میلیون رکورد اینو متصل کردم به دیتاسورس دیتاگرید ویو. چون حدودا چند ثانیه ای میبره تا دیتا ها واکشی بشن فرم توی این مدت کلا هنگ و نمیشه اصلا دست زد
از روی این پست( لینک پست (https://barnamenevis.org/showthread.php?471795-%D9%85%D8%B4%DA%A9%D9%84-%D8%A8%D8%A7-%D9%87%D9%86%DA%AF-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE&p=2115200&viewfull=1#post2115200)) خواستم مشکل رو حل کنم اما نشد یعنی وقتی روی دکمه جهت پرکردن دیتاگرید میزنم همچنان فرم چند ثانیه هنگ . ممنون میشم دوستان یک روش ساده اگر میشه کد بدید
معرفی کنن و کد های خوبی باشه که رکورد اگر شد 100 میلیون بازم هنگ نکنه. و روی اکثر سیستم ها این متد قابل اجرا باشه مرسی.

public partial class Form5 : Form
{
public Form5()
{
InitializeComponent();
}
public delegate void _fillGrid();
private void fillGrid()
{
if (this.InvokeRequired)
{
this.Invoke(new _fillGrid(fillGrid));
return;
}
//کدهای متد خودتو اینجا بنویس
dataGridView1.DataSource = ClassDB_SQL.returnDataTable("select * from table_user");//واکشی اطلاعات
}

private void button1_Click(object sender, EventArgs e)
{
Thread Th = new Thread(fillGrid);
Th.Start();
}

private void Form5_Load(object sender, EventArgs e)
{

}
}


سلام
این مشکل زمانی پیش میاد که خواص AutosizeRowMode بر روی AllCell ست شده باشه ، که باعث کند شدن بیش از حد Gridview میشه ، این خاصیت و روی None بزار فرم در کسری از ثانیه لود میشه