private void dgrdGioCoLamThem_SelectionChanged(object sender, EventArgs e) { if (dgrdGioCoLamThem.SelectedRows.Count == 0) { #region reset layout cbChonCa.DataSource = null; tbGioLam.Text = "0"; tbTreSom.Text = "0"; tbOLaiThem.Text = "0"; checkXacNhanLamThem.Checked = false; checkXacNhanLamThem.Enabled = false; numPhutTinhLamThem.Value = 0; numPhutTinhLamThem.Enabled = false; #endregion // ngoài reset layout thì disable nút xác nhận để tránh ấn nhầm gây lỗi btnXacNhan.Enabled = false; return; } // vì disable nếu e.rowindex = -1 nên bật lại nếu >= 0 btnXacNhan.Enabled = true; DataGridView tmpDataGrid = (DataGridView)sender; //1. lấy dòng đang chọn và dữ liệu được chọn. gán currView để có thể lấy được dữ liệu DataRowView dataRowView = tmpDataGrid.SelectedRows[0].DataBoundItem as DataRowView; currView = dataRowView; if (currView == null) { return; } //2. tìm user đang chọn để load lại ds ca mở rộng int tmpUserEnrollNumber = (int)dataRowView["UserEnrollNumber"]; currNV = m_DSNV.Find(item => item.UserEnrollNumber == tmpUserEnrollNumber); //3. xác định ngày đang chọn //3. tìm tmpCurrChkINOUT đang chọn tmpCurrChkINOUT = dataRowView["obj"] as cChkInOut; if (tmpCurrChkINOUT == null) { return; } DateTime tmpTimeStrVao = tmpCurrChkINOUT.Vao.TimeStr; DateTime tmpTimeStrRa = tmpCurrChkINOUT.Raa.TimeStr; DateTime ngaydangchon = tmpCurrChkINOUT.ThuocNgayCong; // tạo bản copy để tính công chứ ko tính công trực tiếp trên tmpCurrChkINOUT vì sẽ làm thay đổi giá trị bên trong của nó //tmpCurrChkINOUTCopy = MyUtility.DeepClone(tmpCurrChkINOUT); // 4. nếu đã thuộc ca thì giữ nguyên ca, ko load những cái khác cShift tmpCa = MyUtility.DeepClone(tmpCurrChkINOUT.ThuocCa); List <cShift> tmpDSCa; if (tmpCa.ShiftID != int.MinValue) // không cần kiểm tra tmpCa null vì DS đã lọc chỉ còn giữ HaveINOUT=true { tmpDSCa = new List <cShift>() { tmpCa }; } else // tmpCa.ShiftID == int.MinValue ==> ca KĐQĐ =>load ds ca mở rộng { tmpDSCa = new List <cShift>(currNV.DSCaMoRong); cShift caKDQD = tmpCa; // ca KDQD đã có sẵn shiftid = Minvalue XL.TaoCaTuDo(tmpCa, tmpTimeStrVao, ThamSo._8gio, ThamSo._05phut, ThamSo._10phut, ThamSo._30phut, 1f); cShift CaDaiA = new cShift() { ShiftID = int.MinValue + 1, ShiftCode = "Ca Dài 12 tiếng", LoaiCa = 1 }; XL.TaoCaTuDo(CaDaiA, tmpTimeStrVao, ThamSo._12gio, ThamSo._05phut, ThamSo._10phut, ThamSo._30phut, 1.5f); tmpDSCa.Insert(0, caKDQD); tmpDSCa.Insert(1, CaDaiA); // loại bỏ những ca chắc chắn ko xảy ra: ra ca < check vào 30ph. check ra < vào ca 30ph tmpDSCa.RemoveAll(item => item.LoaiCa == 0 && (tmpTimeStrRa <ngaydangchon.Add(item.OnnDutyTS).Add(ThamSo._30phut) || tmpTimeStrVao> ngaydangchon.Add(item.OffDutyTS).Subtract(ThamSo._30phut))); } // fill dữ liệu 2 dòng giờ vào -giờ ra, fill comboBox danh sách ca, set mặc định item chọn là 0 //, các giá trị còn lại thì do combo index changed fill tbGioVao.Text = tmpTimeStrVao.ToString("H:mm:ss d/M/yyyy"); tbGioRaa.Text = tmpTimeStrRa.ToString("H:mm:ss d/M/yyyy"); cbChonCa.ValueMember = "ShiftID"; cbChonCa.DisplayMember = "ShiftCode"; cbChonCa.DataSource = tmpDSCa; checkTinhPC150.Checked = currNV.MacDinhTinhPC150; // mặc định check tính pc 50% theo nhân viên phòng nào cbChonCa.Update(); }