לאחר שתהליך הרישום מסתיים, כל מורה יכול לקבל דו”ח המפרט אילו מקבוצות הלימוד שלו רשומות לאילו קורסים. הדו”ח צריך להיראות כך:

כלומר, הכותרת מכילה את שם הקבוצה, שם ביה”ס ושם הקורס, ואילו בטבלה ישנן שתי עמודות: שם התלמיד, ושם המשתמש.
אך שליפת הנתונים מבסיס הנתונים לא נראתה כך. את הנתונים קיבלתי בצורת טבלה בת 4 עמודות:

האתגר שעמד לפני היה להוציא את הנתונים הרצויים בצורה יעילה – כלומר, מבלי להצטרך לעבור בלולאה על הטבלה שקיבלתי מה-DB, וגם להציג אותם בצורה יעילה – כשצריך לקחת בחשבון שמספר הקורסים וקבוצות הלימוד משתנה משאילתה לשאילתה, כך שאינני יכולה להגדיר מספר קבוע של GridiView-ים ולקבוע להם מראש את ה-datasource.
בעבר, כשהייתי מתכנתת פחות מנוסה, לא הקפדתי על יעילות. העיקר היה שאני מצליחה איכשהו להעביר את הנתונים ממצבם הגולמי למצבם הרצוי. לכן הייתי יוצרת לולאה שעוברת על ה-datatable שיצרתי מהטבלה שקיבלתי מה-DB, ובכל שורה הייתי מוציאה את הנתונים שאני צריכה, כולל בדיקות אילו נתונים עלי להוציא). לשם הצגת הנתונים – מאחר שמספר הטבלאות הוא דינמי -הייתי יוצרת מתודות שבונות טבלת HTML ב-code behind, וקוראת למתודה הזו לפי מספר הטבלאות שהיה עלי ליצור.
הפעם רציתי להשתמש ב-select של ה-datatable, ובסופו של דבר להכניס את הנתונים לתוך Gridview, ולא לכתוב שום דבר ידני.
השלב הראשון היה לשלוף את העמודות היוצרות את הכותרת. לשם כך רציתי לעשות select distinct של עמודות אלה מתוך ה-datatable. דא עקא, שהמתודה select אינה מאפשרת לשים בפרמטר הפילטר את המילה distinct. מה עושים? הולכים למנוע-חיפוש-הקוד האהוב עלי, searchdotnet.com. חיפוש שם העלה את הפוסט הזה שבו המחבר ביקש לעשות בדיוק אותו דבר. מתברר שאי אפשר לעשות select distinct על datatable, ולכן המחבר כתב מספר מתודות המיישמות למעשה אפשרות ליצור select distinct ב-datatable. המשכתי לקרוא עד סוף הפוסט, ואז נחו עיני על הערת עדכון של המחבר: אחד המגיבים האיר את עיניו כי ל-DataView יש מתודה בשם ToTable, שמאפשרת לבנות datatable על סמך ה-datatable הקיים, ומאפשרת לבחור מאילו עמודות ליצור את ה-datatable החדש, וגם ישנו פרמטר המציין אם לעשות distinct. וואלה!! רצתי ועשיתי את זה, ותוך 3 שורות קוד [אחת להגדיר את ה-dataview, אחת להגדיר את העמודות הרצויות, ואחת להרצת מתודת ה-ToTable] היתה לי טבלה של כותרות.
מצוין. השלב הבא היה לחלק את ה-datatable המקורי לתתי datatable-ים, אחד לכל שילוב של קורס וקבוצת לימוד. המטרה שלי היתה שיהיו לי datatable-ים שיהוו את ה-datasource ל-GridView-ים.
לשם כך כתבתי 6 שורות קוד נוספות:
string[] columns = { dt.column3.ColumnName,dt.column4.ColumnName};
for (int i = 0; i < titlesTable.Rows.Count; i++)
{
DataRow r = titlesTable.Rows[i];
string tableName = r[dt.column2.ColumnName] + “_” + r[dt.column1.ColumnName];
dv.RowFilter= dt.column2.ColumnName + “='” + r[dt.column2.ColumnName] + “‘ AND ” + dt.column1.ColumnName + “='” + r[dt.column1.ColumnName]+”‘”;
ds.Tables.Add(dv.ToTable(tableName, false, columns));
}
הלולאה הנ”ל עוברת על טבלת הכותרות שיצרתי, ועבור כל שורה בטבלת הכותרות, יוצרת datatable ששמה מורכב מעמודת שם הקורס ושם קבוצת הלימוד, קובעת את הפילטר לפיו לשלוף את השורות, ומשתמשת שוב במתודת ה-ToTable של ה-dataView. הערת ביניים: לכאורה נראה כי השימוש ב-dataview פה הוא מיותר. מאחר שאינני זקוקה ל-distinct, מדוע לא יכולתי פשוט להשתמש ב-select של ה-datatable? אומר לכם מדוע. ה-select מחזיר אוסף (array) של datarow, ואילו אני רציתי שהאובייקט שיוחזר לי יהיה datatable. כדי ליצור dataTable אני מוכרחה להשתמש במתודה ToTable. הסיבה שרציתי שיוחזרו לי דווקא dataTable-ים היתה – כפי שניתן לראות – כדי להכניס אותם ל-dataset.
ועכשיו מה נעשה עם ה-datatset? אני רוצה להכניס באופן דינמי את כל ה-datatable-ים ל-gridview-ים. איך אפשר לעשות את זה? פשוט מאד – הגדרתי array של grivdview-ים:
private GridView[] grdArr = null; // Array of dinamicaly created gridviews, for showing the tables of learningGroup members
אחרי שאני קוראת למתודה המחזירה לי את ה-dataset, אני מתאחלת את אוסף ה-gridview-ים שלי לפי מספר הטבלאות שיש ב-dataset:
DataSet ds = bl.FillDataSet();
// Initialize the array of gridviews to be as big as the number of tables in the dataset
grdArr = new GridView[ds.Tables.Count];
אח”כ עוברת בלולאה על ה-datatset, ולכל gridview אני משימה datatable:
for (int i = 0; i< ds.Tables.Count; i++)
{
grdArr[i] = new GridView();
grdArr[i].DataSource = ds.Tables[i];
grdArr[i].DataBind();
}
ושלום עליך נפשי!
נ.ב
יש לי באמצע טיפול בהפיכת קוד ביה”ס לשם ביה”ס, וכן ביצירת הכותרת הצהובה (מאחר שהיא נמצאת מעל שמות העמודות, יש צורך בטיפול מיוחד), אבל אלה כבר שייכים לסיפור אחר…