private void NowSetRow(DataGridViewRow row, CLUBRecord club, StudRecord stud, string v)
        {
            row.Cells[colSelectClub.Index].Value = "" + club.ClubName;
            row.Cells[colSelectClub.Index].Tag   = club;
            club.NewCount++;

            //新加入多少人
            if (ClubAddDic.ContainsKey(club.UID))
            {
                ClubAddDic[club.UID].Add(stud.id);
            }

            if (v == "1")
            {
                club.NewGrade1Limit++;
            }
            else if (v == "2")
            {
                club.NewGrade2Limit++;
            }
            else if (v == "3")
            {
                club.NewGrade3Limit++;
            }
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            //將指定好的學生
            //建立社團參與記錄
            //並加入該社團內

            btnSave.Enabled = false;

            List <SCJoin> SCJoinList = new List <SCJoin>();

            sb_log = new StringBuilder();
            sb_log.AppendLine(string.Format("「{0}」學年度 第「{1}」學期 未選社團學生分發:", seting_school_year, seting_school_semester));

            foreach (DataGridViewRow row in dataGridViewX1.Rows)
            {
                if (row.Cells[colSelectClub.Index].Tag != null)
                {
                    StudRecord sr = (StudRecord)row.Tag;
                    CLUBRecord cr = (CLUBRecord)row.Cells[colSelectClub.Index].Tag;

                    SCJoin sc = new SCJoin();
                    sc.RefClubID    = cr.UID;
                    sc.RefStudentID = sr.id;
                    SCJoinList.Add(sc);

                    sb_log.AppendLine(string.Format("班級「{0}」學生「{1}」社團指定為「{2}」", sr.class_name, sr.name, cr.ClubName));
                }
            }

            BGWSave.RunWorkerAsync(SCJoinList);
        }
        void btnItem_Click(object sender, EventArgs e)
        {
            if (itmPnlTimeName.SelectedItems.Count == 1)
            {
                List <CLUBRecord> clubList = new List <CLUBRecord>();
                //取得目前所選擇的Button
                ButtonItem Buttonitem = itmPnlTimeName.SelectedItems[0] as ButtonItem;

                //取得課程Record
                CLUBRecord club = (CLUBRecord)Buttonitem.Tag;
                clubList.Add(club);

                //該課程目前有多少選課學生
                int count = 0;
                if (ScjDic.ContainsKey(club.UID))
                {
                    count = ScjDic[club.UID].Count;
                }

                //
                foreach (DataGridViewRow row in dataGridViewX1.SelectedRows)
                {
                    //先清除原本的
                    if (row.Cells[colSelectClub.Index].Tag != null)
                    {
                        CLUBRecord reClub = (CLUBRecord)row.Cells[colSelectClub.Index].Tag;
                        StudRecord stud   = (StudRecord)row.Tag;
                        if (ClubAddDic.ContainsKey(reClub.UID))
                        {
                            ClubAddDic[reClub.UID].Remove(stud.id);
                        }

                        if (!clubList.Contains(reClub))
                        {
                            clubList.Add(reClub);
                        }
                    }

                    //填入學生所選的社團資料
                    row.Cells[colSelectClub.Index].Value = "" + club.ClubName;
                    row.Cells[colSelectClub.Index].Tag   = club;

                    //統計,此按鈕造成新增多少學生(不重複)
                    if (ClubAddDic.ContainsKey(club.UID))
                    {
                        //不包含此學生則加入
                        StudRecord stud = (StudRecord)row.Tag;
                        if (!ClubAddDic[club.UID].Contains(stud.id))
                        {
                            ClubAddDic[club.UID].Add(stud.id);
                        }
                    }
                }

                RefreshButtonItem(clubList);
            }
        }
        private void 加入待處理學生ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            List <string> list = new List <string>();

            foreach (DataGridViewRow row in dataGridViewX1.SelectedRows)
            {
                StudRecord sr = (StudRecord)row.Tag;
                list.Add(sr.id);
            }
            K12.Presentation.NLDPanels.Student.AddToTemp(list);
        }
        private void 清除指定社團ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            List <CLUBRecord> clublist = new List <CLUBRecord>();

            foreach (DataGridViewRow row in dataGridViewX1.SelectedRows)
            {
                //取得課程Record
                CLUBRecord club = (CLUBRecord)row.Cells[colSelectClub.Index].Tag;
                clublist.Add(club);
                //該課程目前有多少選課學生
                int count = 0;
                if (ScjDic.ContainsKey(club.UID))
                {
                    count = ScjDic[club.UID].Count;
                }

                row.Cells[colSelectClub.Index].Value = null;
                row.Cells[colSelectClub.Index].Tag   = null;

                //統計,此按鈕造成新增多少學生(不重複)
                if (ClubAddDic.ContainsKey(club.UID))
                {
                    //包含此學生,則移除學生
                    StudRecord stud = (StudRecord)row.Tag;
                    if (ClubAddDic[club.UID].Contains(stud.id))
                    {
                        ClubAddDic[club.UID].Remove(stud.id);
                    }

                    club.NewCount--;
                    if (stud.grade_year == "1" || stud.grade_year == "7")
                    {
                        club.NewGrade1Limit--;
                    }
                    else if (stud.grade_year == "2" || stud.grade_year == "8")
                    {
                        club.NewGrade2Limit--;
                    }
                    else if (stud.grade_year == "3" || stud.grade_year == "9")
                    {
                        club.NewGrade3Limit--;
                    }
                }
            }

            RefreshButtonItem(clublist);
        }
 private int SortRandom(StudRecord x, StudRecord y)
 {
     return(x.RandomIndex.CompareTo(y.RandomIndex));
 }
 private void NowRunRow(DataGridViewRow row, CLUBRecord club, StudRecord stud)
 {
     //如果沒有設定過,才進行分配
     if (row.Cells[colSelectClub.Index].Value == null)
     {
         //當學生是一年級時
         if (stud.grade_year == "1" || stud.grade_year == "7")
         {
             if (club.Grade1Limit.HasValue)
             {
                 if (club.Grade1Limit.Value > club.NewGrade1Limit)
                 {
                     if (club.GenderRestrict != "")
                     {
                         //性別判斷
                         if (club.GenderRestrict == stud.gender)
                         {
                             NowSetRow(row, club, stud, "1");
                         }
                     }
                     else
                     {
                         NowSetRow(row, club, stud, "1");
                     }
                 }
             }
             else
             {
                 NowSetRow(row, club, stud, "1");
             }
         }
         else if (stud.grade_year == "2" || stud.grade_year == "8")
         {
             if (club.Grade2Limit.HasValue)
             {
                 if (club.Grade2Limit.Value > club.NewGrade2Limit)
                 {
                     if (club.GenderRestrict != "")
                     {
                         //性別判斷
                         if (club.GenderRestrict == stud.gender)
                         {
                             NowSetRow(row, club, stud, "2");
                         }
                     }
                     else
                     {
                         NowSetRow(row, club, stud, "2");
                     }
                 }
             }
             else
             {
                 NowSetRow(row, club, stud, "2");
             }
         }
         else if (stud.grade_year == "3" || stud.grade_year == "9")
         {
             if (club.Grade3Limit.HasValue)
             {
                 //三年級人數上限還沒滿
                 if (club.Grade3Limit.Value > club.NewGrade3Limit)
                 {
                     if (club.GenderRestrict != "")
                     {
                         //性別判斷
                         if (club.GenderRestrict == stud.gender)
                         {
                             NowSetRow(row, club, stud, "3");
                         }
                     }
                     else
                     {
                         NowSetRow(row, club, stud, "3");
                     }
                 }
             }
             else
             {
                 NowSetRow(row, club, stud, "3");
             }
         }
     }
 }
        private void btnStartAuto_Click(object sender, EventArgs e)
        {
            DialogResult dr = MsgBox.Show("自動分配將會把本畫面中\n未手動指定社團的學生\n進行[依選社條件]亂數分配\n確認開始指定?", MessageBoxButtons.YesNo, MessageBoxDefaultButton.Button2);

            if (dr == DialogResult.No)
            {
                MsgBox.Show("已取消");
                return;
            }

            //開始自動分配
            //1.取得系統內的各社團的條件
            //a.人數上限(目前社團人數)
            //b.科別限制
            //c.男女限制
            //d.年級限制
            List <CLUBRecord> InsertClubLimit = new List <CLUBRecord>();

            foreach (CLUBRecord club in CLUBRecordList)
            {
                //取得目前社團修課人數
                int count = 0;
                if (ScjDic.ContainsKey(club.UID))
                {
                    count += ScjDic[club.UID].Count;
                }

                if (ClubAddDic.ContainsKey(club.UID))
                {
                    count += ClubAddDic[club.UID].Count;
                }

                //目前人數
                club.NewCount = count;

                //本社團,是否有"人數上限"限制
                if (club.Limit.HasValue)
                {
                    //目前社團人數,是否已超過人數上限
                    if (count < club.Limit.Value)
                    {
                        InsertClubLimit.Add(club);
                    }
                }
                else
                {
                    InsertClubLimit.Add(club);
                }

                //如果社團已經有修課學生
                if (ScjDic.ContainsKey(club.UID))
                {
                    //判斷與分類目前社團修課人數
                    foreach (SCJoin scj in ScjDic[club.UID])
                    {
                        //取得學生資料
                        if (IsStudentDic.ContainsKey(scj.RefStudentID))
                        {
                            StudRecord stud = IsStudentDic[scj.RefStudentID];

                            if (stud.grade_year == "1" || stud.grade_year == "7")
                            {
                                club.NewGrade1Limit++;
                            }
                            else if (stud.grade_year == "2" || stud.grade_year == "8")
                            {
                                club.NewGrade2Limit++;
                            }
                            else if (stud.grade_year == "3" || stud.grade_year == "9")
                            {
                                club.NewGrade3Limit++;
                            }
                        }
                    }
                }
            }

            //這一段主要是要將學生進行亂數排序
            List <StudRecord> StudList = new List <StudRecord>();
            Random            xy01     = new Random();

            foreach (DataGridViewRow row in dataGridViewX1.Rows)
            {
                //如果沒有設定過,才進行分配
                if (row.Cells[colSelectClub.Index].Value == null)
                {
                    //學生基本資料
                    StudRecord stud = (StudRecord)row.Tag;
                    stud.row         = row;
                    stud.RandomIndex = xy01.Next(1, 99999);
                    StudList.Add(stud);
                }
            }
            StudList.Sort(SortRandom);

            //開始分配作業
            foreach (StudRecord stud in StudList)
            {
                DataGridViewRow row = stud.row;
                //可以分配的社團
                foreach (CLUBRecord club in InsertClubLimit)
                {
                    //這個社團,有人數上限
                    if (club.Limit.HasValue)
                    {
                        //人數未滿
                        if (club.Limit.Value > club.NewCount)
                        {
                            //社團有科別限制
                            if (club.GetDeptRestrictList.Count > 0)
                            {
                                if (stud.dept_name_stud != "")
                                {
                                    //學生科別
                                    if (club.GetDeptRestrictList.Contains(stud.dept_name_stud))
                                    {
                                        NowRunRow(row, club, stud);
                                    }
                                    else
                                    {
                                        //科別條件不符合
                                    }
                                }
                                else if (stud.dept_name_class != "")
                                {
                                    //班級科別
                                    if (club.GetDeptRestrictList.Contains(stud.dept_name_class))
                                    {
                                        NowRunRow(row, club, stud);
                                    }
                                    else
                                    {
                                        //科別條件不符合
                                    }
                                }
                                else
                                {
                                    //有科別限制,但學生身上無科別
                                }
                            }
                            else
                            {
                                NowRunRow(row, club, stud);
                            }
                        }
                        else
                        {
                            //這個社團人數上限已滿
                        }
                    }
                    else
                    {
                        //沒有人數上限
                        //如果沒有設定過,才進行分配
                        if (row.Cells[colSelectClub.Index].Value == null)
                        {
                            NowRunRow(row, club, stud);
                        }
                    }
                }
            }

            //重新處理畫面顯示
            RefreshButtonItem(InsertClubLimit);

            dataGridViewX1.Sort(new RowComparer());
        }
        void BGW_DoWork(object sender, DoWorkEventArgs e)
        {
            //取得本學期社團資料
            CLUBRecordList.Clear();

            //舊的  會載入 系統系統學期的社團清單
            //CLUBRecordList = _AccessHelper.Select<CLUBRecord>(string.Format("school_year={0} and semester={1}", School.DefaultSchoolYear, School.DefaultSemester));

            //新的 是載入 人為設定選社學年、學期
            CLUBRecordList = _AccessHelper.Select <CLUBRecord>(string.Format("school_year={0} and semester={1}", seting_school_year, seting_school_semester));

            //取得本學期,所有社團參與記錄
            List <string> ClubRefIDList = new List <string>();

            foreach (CLUBRecord record in CLUBRecordList)
            {
                if (!ClubRefIDList.Contains(record.UID))
                {
                    ClubRefIDList.Add(record.UID);
                    ClubAddDic.Add(record.UID, new List <string>());
                }
            }

            //取得學校所有學生記錄
            //學生記錄來自於社團ID
            StudentScjoinDic = new Dictionary <string, SCJoin>();
            ScjDic           = new Dictionary <string, List <SCJoin> >();

            string        ClubIdString = string.Join("','", ClubRefIDList);
            List <SCJoin> Scjoin       = _AccessHelper.Select <SCJoin>(string.Format("ref_club_id in ('{0}')", ClubIdString));

            foreach (SCJoin join in Scjoin)
            {
                //學生修社紀錄
                if (!StudentScjoinDic.ContainsKey(join.RefStudentID))
                {
                    StudentScjoinDic.Add(join.RefStudentID, join);
                }

                //社團修課人數

                if (!ScjDic.ContainsKey(join.RefClubID))
                {
                    ScjDic.Add(join.RefClubID, new List <SCJoin>());
                }
                ScjDic[join.RefClubID].Add(join);
            }

            //取得學校內所有一般生記錄
            //班級/座號/學號/姓名
            //(沒有班級之學生,不列入記錄
            DataTable studentDT = _QueryHelper.Select(@"select student.id,class.class_name,
student.seat_no,student.student_number,student.name,class.grade_year,
student.gender ,dept_Class.name as dept_name_class,dept_Stud.name as dept_name_stud 
from student join class on student.ref_class_id=class.id 
left join dept dept_Class on dept_Class.id=class.ref_dept_id
left join dept dept_Stud on dept_Stud.id=student.ref_dept_id
where student.status in (1,2) and class.grade_year in (1,2,3,7,8,9) 
ORDER BY class.grade_year,class.class_name,student.seat_no");

            IsStudentList = new List <StudRecord>();
            IsStudentDic  = new Dictionary <string, StudRecord>();
            foreach (DataRow row in studentDT.Rows)
            {
                StudRecord stud = new StudRecord(row);
                //依據社團參與記錄進行資料篩選
                if (!StudentScjoinDic.ContainsKey(stud.id))
                {
                    IsStudentList.Add(stud);
                }

                //所有學生,都加入清單
                if (!IsStudentDic.ContainsKey(stud.id))
                {
                    IsStudentDic.Add(stud.id, stud);
                }
            }
        }