הדרך הטובה ביותר להוסיף הרבה שורות ל DataGridView
-
יש לי בעיה כזו:
מצד אחד אני רוצה להוסיף כמה אלפי שורות לDataGridView ומצד שני אני רוצה שהמשתמש יוכל לעצור את התהליך באמצע אם ירצה בכך.
כדי לעצור את התהליך השתמשתי בטריד חדש שימלא את הDataGridView אבל אז נעלם מהDataGridView הפס גלילה!
וגם תהליך ההוספה נעשה איטי מאוד.
ניסיתי גם להוסיף שורות בצורה רגילה ללא טריד חדש וכדי לעשות עצירה הוספתי בתוך לולאת ההוספה Application.DoEvents והשארתי רק את לחצן העצירה זמין, אבל גם אז ההוספה הפכה להיות איטית מאוד מאוד.אז מה עושים?
פורסם במקור בפורום CODE613 ב15/09/2013 20:12 (+03:00)
-
אתה מוסיף ישירות לדטהגריד? תנסה לעבוד עם מקור נתונים (DataSource), ולהגדיר את המאפיין DataGridView.VirtualMode לTrue.
זה אמור לעבוד הרבה יותר טוב בכמויות גדולות של מידע.
הנה עוד טיפים להאצת/ייעול הפקד הזה: http://msdn.microsoft.com/en-us/library/ha5xt0d9.aspxשים לב שאם יש לך את הרשימה ביד, הAddRange הרבה יותר מהיר ויעיל מAdd כפול מס' הפריטים.
אולי תנסה גם להקפיא את הרפרוש ע"י DataGridView.SuspendLayout בתחילת המילוי, וקריאה לDataGridView.ResumeLayout בסוף.פורסם במקור בפורום CODE613 ב16/09/2013 11:54 (+03:00)
-
באמת בהתחלה עבדתי מול הדטה-גריד בעצמו וDataGridView.SuspendLayout לא עזר כלל.
אח''כ הוספתי טבלה ל DataSet וקישרת אותה לדטה-גריד עם BindingSource , וכשמילאתי עבדתי עם DataTable הנ''ל ואז זה נהיה הרבה יותר מהר.
אח''כ עשיתי את זה עוד יותר מהר ע''י DataTable1.BeginLoadData לפני המילוי ואחר המילוי DataTable1.EndLoadData.
אחר כך עשיתי את זה עוד יותר מהר ע''י שאת את העמודות העיקריות מילאתי בדרך הנ''ל ואת העמודות הטפלות יותר ע''י טריד חדש שמילא את הDataTable1 תוך כדי שמשתמש כבר מפעיל את הדטה-גריד.
אחר כך עשיתי את זה עוד יותר מהיר כי חשבתי למה המשתמש צריך לראות בבת אחת בתוך הדטה-גריד 800,000 שורות או יותר, די שיראה כל פעם 1000 שורות למשל, ואז עשיתי כמו בחיפוש של גוגל שיש מתחת לתוצאות מספרים שאתה לוחץ ועובר לדף הבא של התוצאות וכך עשיתי, חילקתי את כל השורות שצריך להציג ב1000 והוספתי לפי הצורך LinkLabel עבור כל 1000 שורות וכך המשתמש עובר על כל הכמות ומוצגות לו כל פעם 1000 שורות חדשות.
אבל מה יש קצת בעיה עם למלא עם טריד את ה DataTable והיא שקופצת לפעמים שגיאה כזו מהדטה-גריד:
BindingSource cannot be its own data source. Do not set the DataSource and DataMember properties to values that refer back to BindingSource.פורסם במקור בפורום CODE613 ב17/09/2013 22:01 (+03:00)
-
הרעיון של התריד בצירוף מקור נתונים הוא רעיון בעייתי כי הגריד לא חשוף לך התהליך שמאחורה.. וכדי שלא יעשה בעיות צריך לשבת הרבה הרבה הר...
למעשה את הבעיות האלה פטרו בWPF.
או שתתקין VS2012 או את התוסף לVS2010 שמטפל באסינכרוני זה אותו דבר כמו טריד רק שיותר קל יהיה לך לעקוב אחרי הפעולות בלי לעבוד עם דו-איבנט וכדו'.וכמובן כמו שכתב לך ד. לב טוב שחובה להשתמש ב-VIRTUALMODE.
פורסם במקור בפורום CODE613 ב25/09/2013 00:49 (+03:00)