الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس قصير في الأعمدة الديناميكة للــ DataGridView

بدأه حسام الشامي في 22 يناير 2012 · 3 رد · 1,637 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم...

  1. هذا الدرس القصير موجه للمبتدئين , يوضح كيفية التعامل مع الأعمدة الديناميكية للــ DataGridView , أي إنشاء أعمدة DataGridView من أسطر جدول في قاعدة البيانات ..
  2. قد توجد طرق أسهل من هذه الطريقة , لكن هدفنا هو الــ Practice .. أي التجريب و التطبيق ..
  3. post-94677-028590600 1327262852_thumb.pn
  4. المثال المدروس : بسيط .. جدول للطلاب و جدول للكورسات .. و جدول الربط بينهما StudentCourse.. الذي فيه رقم الطالب و رقم الكورس و الدرجة ..
  5. كثيرا ما تصادفنا حالات ان الموديل في قاعدة البيانات Data Model , يختلف عن شكل واجهة المستخدم , و خصوصا في نوع العلاقات many-to-many ..فليس معقولا في مثالنا أن نضع على الواجهة combobox فيها الطلاب و أخرى فيها الكورسات و TextBox تظهر فيه الدرجة الموافقة للطالب المحدد و الكورس المحدد , فهذا يسمى (bad Design) تصميم سئ لانه ليس user Friendly , أي غير مؤلوف بالنسبة للمستخدم ..
  6. سنستخدم الــ Linq to SQL , لجلب البيانات من قاعدة البيانات , بدلا من استخدام الــ SQL مباشرة , علما أن Linq تولد في النهاية SQL ..و إلى طريقة العمل .
  7. إحضار الطلاب من قاعدة البيانات :
    DbDataContext dbDataContext = new DbDataContext();
    
            	var students = (from student in dbDataContext.Students
                            	select student).ToList<Student>();

  8. إحضار الكورسات من قاعدة البيانات :
    courses = (from course in dbDataContext.Courses
                   		select course).ToList<Course>();

  9. بناء الــ Datatable الذي سيكون مصدر بيانات الــ DataGridView كمايلي :
    dt = new DataTable();

    ثم نقوم بملئ هذا الــ DataTable من قاعدة البيانات .

  10. إنشاء العمود الأول و الثاني لرقم الطالب و اسمه على الترتيب و جعلهما للقرائة فقط :
     dt.Columns.Add("StudentID", typeof(int)).ReadOnly = true;
            	dt.Columns.Add("StudentName", typeof(string)).ReadOnly = true;

  11. من أجل كل كورس في لائحة الكورسات يتم إنشاء عمود له :
    foreach (Course course in courses)
            	{
                	DataColumn column = new DataColumn(course.CourseName, typeof(double));
                	dt.Columns.Add(column);
    
            	}

  12. من أجل كل طالب في لائحة الطلاب , يتم إنشاء سطر له و وضع رقم الطالب في العمود الأول و اسمه في العمود الثاني , ثم من أجل كل كورس في لائحة الكورسات , نجلب درجة هذا الطالب في هذا الكورس و نضعها في العمود الموافق للكورس علما ان أول كورس يبدأ في العمود الثالث , لذلك تم استخدم 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);
            	}

  13. نضع الــ DataTable هو مصدر بيانات الــ DataGridView , و نمنع المستخدم من حذف الأسطر و نمنعه من إضافة اسطر جديدة , و كذلك من ترتيب الأعمدة :
    dgvStudentCourse.DataSource = dt;
            	//dgvStudentCourse.Columns[0].Visible = false;
            	dgvStudentCourse.AllowUserToDeleteRows = false;
            	dgvStudentCourse.AllowUserToOrderColumns = false;
            	dgvStudentCourse.AllowUserToAddRows = false;

  14. يقوم المستخدم بإدخال درجات الطلاب في الكورسات , أي عمليا يتم ملئ الــ DataTable , الآن يجب نقل البيانات من الــ DataTable إلى قاعدة البيانات بالشكل الصحيح ..
  15. من أجل كل سطر في الــ DataTable , نأخذ رقم الطالب من خلية رقم الطالب :
    foreach (DataRow row in dt.Rows)
            	{
                	int studentID = int.Parse(row["StudentID"].ToString());

  16. من أجل كل كورس في لائحة الكورسات , نأخذ قيمة الدرجة التي أدخلها المستخدم في خلية الكورس , و نجلب السجل من الجدول 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();

  17. إذا كان هناك سجل موافق في الــ StudentCourse لدينا حالتان :
    1. الخلية الموافقة في الــ DataGridView فارغة : و بالتالي يجب حذف هذا الــ StudentCourse .
    2. الخلية غير فارغة : و بالتالي يجب تعديل الــ StudentCourse إلى القيمة الموجودة في الــ DataGridView .
    3. الكود :

      {
      if (string.IsNullOrEmpty(degree))
      {
      dbDataContext.StudentCourses.DeleteOnSubmit(myStudentCourse);
      dbDataContext.SubmitChanges();
      }
      else
      {
      myStudentCourse.Degree = double.Parse(degree);
      dbDataContext.SubmitChanges();

      }
      }
      if (myStudentCourse != null)
    4. إذا لم يكن هناك سجل موافق للكورس و الطالب في قاعدة البيانات و كانت الخلية الموافقة في الــ 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
    5. المثال في المرفقات ..

      ArabTeamDynamicColumnsDG.rar
المرفقات
StudentCourse.png
1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#2

لماذا للمبتدئين فقط مينفش قليل العلم مثلي اخي houssam11350_11350

اكرمك الله عمل جميل جدا

ولكن يوجد ال pivot table in sql server

and

Crosstab in access

لقد استفت اكرمك الله

تم تعديل هذه المشاركة بواسطة KARIMSOFT في 23 يناير 2012 في 00:49

1
#3

السلام عليكم ورحمه الله وبركاته

شكر لك اخي على المجهود الرائع .. تمنياتي لك بالتوفيق ..

.:: Wish to become better and better ::.

#4

السلام عليكم و رحمة الله ..

مشكورين الإخوة على الردود الطيبة ...

الأخ KARIMSOFT , بارك الله بك , تماما .. هذا هو الــ Pivot أو الــ Cross tab .. لكن هنا يقوم به المبرمج بشكل يدوي بالــ C# ...

الأخ VB Helper .. بارك الله بك ..

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

مواضيع مشابهة