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();
        }