PDA

View Full Version : مشكلي در نمايش اطلاعات زياد در گريد



l7i7l7
دوشنبه 03 خرداد 1389, 11:44 صبح
به كد زير يه نگاهي بندازين



dataGridView1.DataSource = dataset1.Tables[0]



البته اطلاتي كه توي گريد نمايش داده ميشن خيلي زياده مثلا حدود 10 هزار ركورد كه هر ركورد حدود 40 فيلد داره

مشكل من اينه كه وقتي داره اطلاعات توي گريد نمايش داده ميشه سيستم كامل ميره تو كما تا چند دقيقه

براي حل اين مشكل من چيكار كنم ؟؟؟؟|؟؟؟؟؟

l7i7l7
دوشنبه 03 خرداد 1389, 11:51 صبح
البته خواستم از backgroundWorker هم استفاده كنم اما چون DataGridView توسط يك نخ ديگه ساخته شده

نتونستم از backgroundWorker استفاده كنم

لطفا راهنمايي كنين
متشكرم

behzadk
دوشنبه 03 خرداد 1389, 13:52 عصر
می تونی فقط در ناحیه ای که نمایش میده رو اول پرکنی و بقیه رو در اسکرول کردن یا می تونی با یه for چند با select کنی و در حلقه یه بار از doevent استفاده کنی

l7i7l7
دوشنبه 03 خرداد 1389, 13:56 عصر
می تونی فقط در ناحیه ای که نمایش میده رو اول پرکنی و بقیه رو در اسکرول کردن یا می تونی با یه for چند با select کنی و در حلقه یه بار از doevent استفاده کنی

ميشه واضحتر توضيح بدين من متوجه نشدم ...

مهدی رحیم زاده
دوشنبه 03 خرداد 1389, 15:52 عصر
شما که نیاز نداری هر 40000 رکورد رو یکباره انتخاب کنی این رو چندین بار Select کن و سعی کن که برای DataGridView خود یک چیزی شبیه Paging ایجاد کنی. یعنی اطلاعات رو دسته بندی کن و بعد کاربر روی هرکدوم که کلیک کرد اون تعداد مورد نظر رو بهش نمایش بده مثلا :

Select Top 1000 * From TableName
موفق باشید

l7i7l7
سه شنبه 04 خرداد 1389, 08:31 صبح
شما که نیاز نداری هر 40000 رکورد رو یکباره انتخاب کنی این رو چندین بار Select کن و سعی کن که برای DataGridView خود یک چیزی شبیه Paging ایجاد کنی. یعنی اطلاعات رو دسته بندی کن و بعد کاربر روی هرکدوم که کلیک کرد اون تعداد مورد نظر رو بهش نمایش بده مثلا :

Select Top 1000 * From TableName
موفق باشید

اتفاقا بايد همه اطلاعات توي گريد نمايش داده بشن چون يكسري كارا روش انجام ميدم
روش ديگه اي رو ميشه استفاده كرد ؟؟؟

l7i7l7
سه شنبه 04 خرداد 1389, 08:37 صبح
نميشه فقط واسه اين قسمت dataGridView1.DataSource = dataset1.Tables[0] ; d از

backgroundWorker يا InvokeRequired استفاده كرد ؟؟؟؟ اما چطوري

Amir Oveisi
سه شنبه 04 خرداد 1389, 11:49 صبح
اصولا نباید این همه رکورد در یک لحظه لود شوند اما با فرض اینکه همه باید با هم لود شوند:
شما گفتید که Datagridview تون با یک thread دیگه ساخته میشه. میشه بیشتر در این مورد توضیح بدید؟ چرا و چطور؟
اینجوری بهتر میشه راهنمایی کرد.
(البته هنوز هم میگم که لود این همه data در یک لحظه کار درستی نیست و حتما یک راه حل دیگه میشه بجای این کار پیدا کرد)

mehdi.mousavi
سه شنبه 04 خرداد 1389, 23:05 عصر
نميشه فقط واسه اين قسمت dataGridView1.DataSource = dataset1.Tables[0] ; d از

backgroundWorker يا InvokeRequired استفاده كرد ؟؟؟؟ اما چطوري

سلام.
اگر منظورتون اینه که نمی دونید چطوری باید از کلاس BackgroundWorker استفاده کنید، من قبلا در مورد این کلاس در این پست (http://barnamenevis.org/forum/showthread.php?p=877799#post880050) توضیح داده ام. اونو بخونید، اگر سوالی بود مطرح کنید تا پاسخ بدم.

موفق باشید.

hdv212
چهارشنبه 05 خرداد 1389, 23:56 عصر
اجازه بدید اول صورت مسئله رو دقیقا مشخص کنیم. شما زمان Query گرفتنت طول میکشه یا زمان بایند شدن دیتاگرید به دیتاسورس ؟
اگر مورد اول هست (که معمولا هم باید چنین باشه) شما در آبجکت BackgroundWorker نیاز دارید دو event رو handle کنید، یکی DoWork که کد اصلی شما در لود کردن اطلاعات و کوئری گرفتنه، بدون وجود هیچ اثری از کنترل های فرمتون در این بخش، دیگری رویداد RunWorkerCompleted که در Thread اصلی اجرا می شه نه یک Thread دیگه و معنی اش اینه که میتونید در این رویداد کد بایند شدن دیتاگرید به دیتاسورس رو بنویسید.
ولی همانطور که سایر دوستان گفتند، نمایش 40 هزار رکورد به صورت یکجا کار درستی نیست و برای حل این مشکل میتونید از تکنیک Paging استفاده کنید. در این مورد در زمینه ی Row Numbering در Sql Server جستجو کنید.
موفق باشید

l7i7l7
پنج شنبه 06 خرداد 1389, 20:25 عصر
اصولا نباید این همه رکورد در یک لحظه لود شوند اما با فرض اینکه همه باید با هم لود شوند:
شما گفتید که Datagridview تون با یک thread دیگه ساخته میشه. میشه بیشتر در این مورد توضیح بدید؟ چرا و چطور؟
اینجوری بهتر میشه راهنمایی کرد.
(البته هنوز هم میگم که لود این همه data در یک لحظه کار درستی نیست و حتما یک راه حل دیگه میشه بجای این کار پیدا کرد)

دوست عزيز با تشكر ازشما

Datagridview رو توي فرم در زمان طراحي فرم ايجاد كردم پس بطبع با يك thread ديگه نميتونم بهش دسترسي داشته باشم .... درسته تا اينجاش ؟

البته براي حل اين قسمت هم از InvokeRequired استفاده كردم ولي من نتونستم جواب بگيرم

احتمالا من نتونستم

لطفا راهنمايي كنين چون بد جوري درگيرشم

l7i7l7
پنج شنبه 06 خرداد 1389, 20:30 عصر
سلام.
اگر منظورتون اینه که نمی دونید چطوری باید از کلاس BackgroundWorker استفاده کنید، من قبلا در مورد این کلاس در این پست (http://barnamenevis.org/forum/showthread.php?p=877799#post880050) توضیح داده ام. اونو بخونید، اگر سوالی بود مطرح کنید تا پاسخ بدم.

موفق باشید.

منظورم اينه كه ميخوام فقط واسه قسمت زير اين كارو بكنم

dataGridView1.DataSource = dataset1.Tables[0] ; d

يعني فقط واسه مدت زماني كه طول ميكشه تا گريد بايند بشه اين كارو بكنم