private void buttonItem3_Click(object sender, EventArgs e)
        {
            SelectSemesterForm form = new SelectSemesterForm();

            if (form.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            if (MsgBox.Show("將會以目前的班級年級資訊,開設" + form.SchoolYear + "學年度" + form.Semester + "學期的課程。\n請確認班級目前的年級以及班級名稱資料無誤,以免開課內容錯誤。", "新建課程", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
            {
                BackgroundWorker bkw = new BackgroundWorker();
                bkw.DoWork               += new DoWorkEventHandler(bkw_DoWork);
                bkw.ProgressChanged      += new ProgressChangedEventHandler(bkw_ProgressChanged);
                bkw.RunWorkerCompleted   += new RunWorkerCompletedEventHandler(bkw_RunWorkerCompleted);
                bkw.WorkerReportsProgress = true;
                bkw.RunWorkerAsync(form);
            }
        }
        void bkw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker   bkw  = (BackgroundWorker)sender;
            SelectSemesterForm form = e.Argument as SelectSemesterForm;

            AccessHelper accessHelper = new AccessHelper();

            bkw.ReportProgress(1);
            double totleClass = accessHelper.ClassHelper.GetSelectedClass().Count;

            if (totleClass <= 0)
            {
                totleClass = 0;
            }
            double processedClass = 0;

            foreach (ClassRecord classRec in accessHelper.ClassHelper.GetSelectedClass())
            {
                processedClass += 1;
                #region 班級開課
                int gradeYear = 0;
                if (!int.TryParse(classRec.GradeYear, out gradeYear))
                {
                    continue;
                }
                //班級內每個學生的課程規劃表
                Dictionary <GraduationPlanInfo, List <StudentRecord> > graduations = new Dictionary <GraduationPlanInfo, List <StudentRecord> >();
                #region 整理班級內每個學生的課程規劃表
                foreach (StudentRecord studentRec in classRec.Students)
                {
                    //取得學生的課程規劃表
                    GraduationPlanInfo info = GraduationPlan.GraduationPlan.Instance.GetStudentGraduationPlan(studentRec.StudentID);
                    if (info != null)
                    {
                        if (!graduations.ContainsKey(info))
                        {
                            graduations.Add(info, new List <StudentRecord>());
                        }
                        graduations[info].Add(studentRec);
                    }
                }
                #endregion
                //所有課程規劃表中要開的課程
                Dictionary <string, GraduationPlanSubject> courseList = new Dictionary <string, GraduationPlanSubject>();
                //課程的科目
                Dictionary <string, string> subjectList = new Dictionary <string, string>();
                //課程的級別
                Dictionary <string, string> levelList = new Dictionary <string, string>();
                //有此課程的課程規劃表
                Dictionary <string, List <GraduationPlanInfo> > graduationList = new Dictionary <string, List <GraduationPlanInfo> >();
                #region 整裡所有要開的課程
                foreach (GraduationPlanInfo gplan in graduations.Keys)
                {
                    foreach (GraduationPlanSubject gplanSubject in gplan.SemesterSubjects(gradeYear, form.Semester))
                    {
                        // 如果開選課程沒有勾起,只開必修課程。
                        if (!form.isCreateAll)
                        {
                            if (gplanSubject.Required == "選修")
                            {
                                continue;
                            }
                        }

                        string key = gplanSubject.SubjectName.Trim() + "^_^" + gplanSubject.Level;
                        if (!courseList.ContainsKey(key))
                        {
                            //新增一個要開的課程
                            courseList.Add(key, gplanSubject);
                            subjectList.Add(key, gplanSubject.SubjectName.Trim());
                            levelList.Add(key, gplanSubject.Level);
                            graduationList.Add(key, new List <GraduationPlanInfo>());
                        }
                        graduationList[key].Add(gplan);
                    }
                }
                #endregion
                //本學期已開的課程
                Dictionary <string, CourseRecord> existSubject = new Dictionary <string, CourseRecord>();
                string qry_class_course = "" +
                                          "SELECT DISTINCT " +
                                          "course.id AS course_id " +
                                          " FROM course " +
                                          " WHERE ref_class_id = " + classRec.ClassID +
                                          " AND course.school_year=" + form.SchoolYear +
                                          " AND course.semester= " + form.Semester + ";";

                QueryHelper   qh_class_course = new QueryHelper();
                DataTable     dt_class_course = qh_class_course.Select(qry_class_course);
                List <string> courseIDList    = new List <string>();

                foreach (DataRow dr in dt_class_course.Rows)
                {
                    courseIDList.Add(dr["course_id"].ToString());
                }

                #region 整裡本學期已開的課程
                List <CourseRecord> tmpCourse = accessHelper.CourseHelper.GetCourse(courseIDList);
                foreach (CourseRecord courseRec in tmpCourse)
                {
                    string key = courseRec.Subject + "^_^" + courseRec.SubjectLevel;
                    if (!existSubject.ContainsKey(key))
                    {
                        existSubject.Add(key, courseRec);
                    }
                }

                #endregion
                #region 開課
                List <SmartSchool.Feature.Course.AddCourse.InsertCourse> newCourses = new List <SmartSchool.Feature.Course.AddCourse.InsertCourse>();
                foreach (string key in courseList.Keys)
                {
                    //是原來沒有的課程
                    if (!existSubject.ContainsKey(key))
                    {
                        GraduationPlanSubject cinfo = courseList[key];
                        newCourses.Add(new SmartSchool.Feature.Course.AddCourse.InsertCourse(
                                           classRec.ClassName + " " + cinfo.FullName,
                                           cinfo.SubjectName.Trim(),
                                           cinfo.Level,
                                           classRec.ClassID,
                                           form.SchoolYear.ToString(),
                                           form.Semester.ToString(),
                                           cinfo.Credit,
                                           (cinfo.NotIncludedInCredit) ? "是" : "否",
                                           (cinfo.NotIncludedInCalc) ? "是" : "否",
                                           cinfo.Entry,
                                           cinfo.Required == "必修" ? "必" : "選",
                                           cinfo.RequiredBy
                                           ));
                    }
                }
                if (newCourses.Count > 0)
                {
                    SmartSchool.Feature.Course.AddCourse.Insert(newCourses);
                    SmartSchool.Broadcaster.Events.Items["課程/新增"].Invoke();
                }
                #endregion
                #region 重新整理已開的課程
                existSubject.Clear();


                DataTable dt_class_courseN = qh_class_course.Select(qry_class_course);
                courseIDList.Clear();
                foreach (DataRow dr in dt_class_courseN.Rows)
                {
                    courseIDList.Add(dr["course_id"].ToString());
                }

                List <CourseRecord> tmpCourse2 = accessHelper.CourseHelper.GetCourse(courseIDList);
                foreach (CourseRecord courseRec in tmpCourse2)
                {
                    string key = courseRec.Subject + "^_^" + courseRec.SubjectLevel;
                    if (!existSubject.ContainsKey(key))
                    {
                        existSubject.Add(key, courseRec);
                    }
                }

                //填入修課學生
                accessHelper.CourseHelper.FillStudentAttend(existSubject.Values);


                #endregion
                #region 加入學生修課
                DSXmlHelper insertSCAttendHelper = new DSXmlHelper("InsertSCAttend");
                bool        addAttend            = false;
                foreach (StudentRecord studentRec in classRec.Students)
                {
                    if (GraduationPlan.GraduationPlan.Instance.GetStudentGraduationPlan(studentRec.StudentID) != null)
                    {
                        foreach (GraduationPlanSubject subject in GraduationPlan.GraduationPlan.Instance.GetStudentGraduationPlan(studentRec.StudentID).SemesterSubjects(gradeYear, form.Semester))
                        {
                            string key   = subject.SubjectName.Trim() + "^_^" + subject.Level;
                            bool   found = false;
                            if (existSubject.ContainsKey(key))
                            {
                                foreach (StudentAttendCourseRecord attend in existSubject[key].StudentAttendList)
                                {
                                    if (attend.StudentID == studentRec.StudentID)
                                    {
                                        found = true;
                                    }
                                }


                                if (!found)
                                {
                                    XmlElement attend = insertSCAttendHelper.AddElement("Attend");
                                    DSXmlHelper.AppendChild(attend, "<RefStudentID>" + studentRec.StudentID + "</RefStudentID>");
                                    DSXmlHelper.AppendChild(attend, "<RefCourseID>" + existSubject[key].CourseID + "</RefCourseID>");

                                    //insertSCAttendHelper.AddElement(".", attend);
                                    addAttend = true;
                                }
                            }
                        }
                    }
                }
                if (addAttend)
                {
                    SmartSchool.Feature.Course.AddCourse.AttendCourse(insertSCAttendHelper);
                }
                #endregion
                #endregion
                //回報進度
                bkw.ReportProgress((int)(processedClass * 100d / totleClass));
            }
        }