السلام عليكم...
- هذا الدرس القصير موجه للمبتدئين , يوضح كيفية التعامل مع الأعمدة الديناميكية للــ DataGridView , أي إنشاء أعمدة DataGridView من أسطر جدول في قاعدة البيانات ..
- قد توجد طرق أسهل من هذه الطريقة , لكن هدفنا هو الــ Practice .. أي التجريب و التطبيق ..

- المثال المدروس : بسيط .. جدول للطلاب و جدول للكورسات .. و جدول الربط بينهما StudentCourse.. الذي فيه رقم الطالب و رقم الكورس و الدرجة ..
- كثيرا ما تصادفنا حالات ان الموديل في قاعدة البيانات Data Model , يختلف عن شكل واجهة المستخدم , و خصوصا في نوع العلاقات many-to-many ..فليس معقولا في مثالنا أن نضع على الواجهة combobox فيها الطلاب و أخرى فيها الكورسات و TextBox تظهر فيه الدرجة الموافقة للطالب المحدد و الكورس المحدد , فهذا يسمى (bad Design) تصميم سئ لانه ليس user Friendly , أي غير مؤلوف بالنسبة للمستخدم ..
- سنستخدم الــ Linq to SQL , لجلب البيانات من قاعدة البيانات , بدلا من استخدام الــ SQL مباشرة , علما أن Linq تولد في النهاية SQL ..و إلى طريقة العمل .
- إحضار الطلاب من قاعدة البيانات :
DbDataContext dbDataContext = new DbDataContext(); var students = (from student in dbDataContext.Students select student).ToList<Student>(); - إحضار الكورسات من قاعدة البيانات :
courses = (from course in dbDataContext.Courses select course).ToList<Course>(); - بناء الــ Datatable الذي سيكون مصدر بيانات الــ DataGridView كمايلي :
dt = new DataTable();
ثم نقوم بملئ هذا الــ DataTable من قاعدة البيانات .
- إنشاء العمود الأول و الثاني لرقم الطالب و اسمه على الترتيب و جعلهما للقرائة فقط :
dt.Columns.Add("StudentID", typeof(int)).ReadOnly = true; dt.Columns.Add("StudentName", typeof(string)).ReadOnly = true; - من أجل كل كورس في لائحة الكورسات يتم إنشاء عمود له :
foreach (Course course in courses) { DataColumn column = new DataColumn(course.CourseName, typeof(double)); dt.Columns.Add(column); } - من أجل كل طالب في لائحة الطلاب , يتم إنشاء سطر له و وضع رقم الطالب في العمود الأول و اسمه في العمود الثاني , ثم من أجل كل كورس في لائحة الكورسات , نجلب درجة هذا الطالب في هذا الكورس و نضعها في العمود الموافق للكورس علما ان أول كورس يبدأ في العمود الثالث , لذلك تم استخدم i + 2 و الكود :
foreach (Student student in students) { DataRow row = dt.NewRow(); row["StudentID"] = student.ID; row["StudentName"] = student.StudentName; for (int i = 0; i < courses.Count; i++) { var myStudentCourse = (from studentCourse in dbDataContext.StudentCourses where studentCourse.StudentID == student.ID && studentCourse.CourseID == courses.ID select studentCourse).SingleOrDefault(); if (myStudentCourse != null) row[i + 2] = myStudentCourse.Degree; } dt.Rows.Add(row); } - نضع الــ DataTable هو مصدر بيانات الــ DataGridView , و نمنع المستخدم من حذف الأسطر و نمنعه من إضافة اسطر جديدة , و كذلك من ترتيب الأعمدة :
dgvStudentCourse.DataSource = dt; //dgvStudentCourse.Columns[0].Visible = false; dgvStudentCourse.AllowUserToDeleteRows = false; dgvStudentCourse.AllowUserToOrderColumns = false; dgvStudentCourse.AllowUserToAddRows = false; - يقوم المستخدم بإدخال درجات الطلاب في الكورسات , أي عمليا يتم ملئ الــ DataTable , الآن يجب نقل البيانات من الــ DataTable إلى قاعدة البيانات بالشكل الصحيح ..
- من أجل كل سطر في الــ DataTable , نأخذ رقم الطالب من خلية رقم الطالب :
foreach (DataRow row in dt.Rows) { int studentID = int.Parse(row["StudentID"].ToString()); - من أجل كل كورس في لائحة الكورسات , نأخذ قيمة الدرجة التي أدخلها المستخدم في خلية الكورس , و نجلب السجل من الجدول StudentCourse الموافق لرقم الطالب و رقم الكورس الذي نعمل عليه ضمن حلقات الــ For بالكود :
for (int i = 0; i < courses.Count; i++) { String degree = row[i + 2].ToString(); var myStudentCourse = (from studentCourse in dbDataContext.StudentCourses where studentCourse.StudentID == studentID && studentCourse.CourseID == courses.ID select studentCourse).SingleOrDefault(); - إذا كان هناك سجل موافق في الــ StudentCourse لدينا حالتان :
- الخلية الموافقة في الــ DataGridView فارغة : و بالتالي يجب حذف هذا الــ StudentCourse .
- الخلية غير فارغة : و بالتالي يجب تعديل الــ StudentCourse إلى القيمة الموجودة في الــ DataGridView .
- الكود :
{
if (string.IsNullOrEmpty(degree))
{
dbDataContext.StudentCourses.DeleteOnSubmit(myStudentCourse);
dbDataContext.SubmitChanges();
}
else
{
myStudentCourse.Degree = double.Parse(degree);
dbDataContext.SubmitChanges();
}
}if (myStudentCourse != null)
- إذا لم يكن هناك سجل موافق للكورس و الطالب في قاعدة البيانات و كانت الخلية الموافقة في الــ DataGridView غير فارغة , عندها يجب إضافة سجل في الجدول StdentCourse يحوي رقم الطالب و رقم الكورس و الدرجة المدخلة ..
{
if (!string.IsNullOrEmpty(degree))
{
myStudentCourse = new StudentCourse();
myStudentCourse.StudentID = studentID;
myStudentCourse.CourseID = courses.ID;
myStudentCourse.Degree = double.Parse(degree);
dbDataContext.StudentCourses.InsertOnSubmit(myStudentCourse);
dbDataContext.SubmitChanges();
}
}else
- المثال في المرفقات ..
ArabTeamDynamicColumnsDG.rar