private void btnLogin_Click(object sender, EventArgs e) { #region lay du lieu tu form string tempUsername = tb_UserName.Text, tempPassword = tb_Password.Text; string passEncrypt = MyUtility.Mahoa(tb_Password.Text); string passdefault = DateTime.Now.Minute + "@" + DateTime.Now.Hour + "@" + DateTime.Now.Month + "@" + DateTime.Now.Day; #endregion if (tempUsername == Resources.rootAccount && tempPassword == passdefault) { ThamSo.currUserID = int.Parse(Resources.rootUserID); ThamSo.currUserAccount = Resources.rootAccount; panelDangNhap.Visible = false; PhanQuyenMenu(0); } else { string tmpConnStr = KiemtraDocFileKetnoiDL(Resources.ConnectionStringPath); if (string.IsNullOrEmpty(tmpConnStr)) // đọc file bị lỗi { frm_KetNoiCSDL frmKetNoiCsdl = new frm_KetNoiCSDL(); if (frmKetNoiCsdl.ShowDialog() == DialogResult.Yes) { SqlDataAccessHelper.ConnectionString = frmKetNoiCsdl.fConnectionString; } else { return; } } else { // đọc được file, test kết nối với CSDL SqlConnection connection = new SqlConnection(tmpConnStr); try { connection.Open(); } catch (Exception) { connection.Close(); AutoClosingMessageBox.Show("Mất kết nối đến Máy chủ. Vui lòng thử lại.", "Lỗi", 2000); return; } // ra khỏi try catch nghĩa là mở kết nối thành công, nên đóng lại và gán chuỗi kết nối luôn connection.Close(); SqlDataAccessHelper.ConnectionString = tmpConnStr; try { DataTable dt = SqlDataAccessHelper.ExecuteQueryString(ThamSo.queryLogIn, new[] { "@UserAccount", "@Password" }, new object[] { tb_UserName.Text, passEncrypt }); if (dt.Rows.Count != 0) // tài khoản thường -> { ThamSo.currUserID = (int)dt.Rows[0]["UserID"]; ThamSo.currUserAccount = dt.Rows[0]["UserAccount"].ToString(); panelDangNhap.Visible = false; PhanQuyenMenu(1); ChuanBiDuLieu(); //subMenuChamCongTay_Click(subMenuChamCongTay, null); //[TBD] nhớ bỏ khi release } else if (MessageBox.Show("Tài khoản hoặc mật khẩu chưa đúng. Vui lòng điền lại.", Resources.MessBoxTitle_ThongBao, MessageBoxButtons.OK) == DialogResult.OK) { tb_UserName.Text = tb_Password.Text = string.Empty; } } catch (Exception) { AutoClosingMessageBox.Show("Mất kết nối đến Máy chủ hoặc CSDL không đúng. Vui lòng thử lại.", "Lỗi", 2000); } } } }
private void btnThucHien_Click(object sender, EventArgs e) { // kiểm tra chọn ca làm việc chưa? chưa thì báo cShift ca = cbCa.SelectedItem as cShift; if (ca == null || cbCa.SelectedIndex == 0) { AutoClosingMessageBox.Show("Bạn chưa chọn ca làm việc.", "Thông báo", 1500); return; } //đã chọn ca làm việc DateTime ngay = dtpNgay.Value.Date; DateTime timeBD = dtpBDLam.Value; DateTime timeKT = dtpKTLam.Value; TimeSpan giolam = timeKT - timeBD; // kiểm tra giờ làm < 0 thì báo lỗi if (giolam < ThamSo._0gio) { giolam = ThamSo._0gio; AutoClosingMessageBox.Show("Giờ ra phải lớn hơn giờ vào.", "Lỗi", 1500); return; } string lydo = string.Empty; if (string.IsNullOrWhiteSpace(cbLyDo.Text)) { lydo = cbLyDo.Text; } string ghichu = tbGhiChu.Text; // kiểm tra chọn NV chưa, chưa thì báo DataTable tableCheckNV = dgrdDSNVTrgPhg.DataSource as DataTable; if (tableCheckNV == null) { return; } DataRow[] arrRows = tableCheckNV.Select("check = true", "UserEnrollNumber asc"); if (arrRows.Length == 0) { AutoClosingMessageBox.Show("Bạn chưa chọn nhân viên.", "Thông báo", 1500); return; } // đã chọn NV, lấy ds mã CC đã chọn bool flag = true; foreach (DataRow row in arrRows) { //dsNVcheck.Add((int)row["UserEnrollNumber"]); int iUserEnrollNumber = (int)row["UserEnrollNumber"]; if (ca.ShiftID == int.MinValue) { XL.TaoCaTuDo(ca, timeBD, ThamSo._8gio, ThamSo._05phut, ThamSo._10phut, ThamSo._30phut, 1f); } else if (ca.ShiftID == int.MinValue + 1) { XL.TaoCaTuDo(ca, timeBD, ThamSo._12gio, ThamSo._05phut, ThamSo._10phut, ThamSo._30phut, 1.5f); } string onnduty = ca.OnnDutyTS.ToString(@"hh\:mm"); string offduty = ca.OffDutyTS.ToString(@"hh\:mm"); int lategrace = Convert.ToInt32(ca.LateGraceTS.TotalMinutes); int earlygrace = Convert.ToInt32(ca.EarlyGraceTS.TotalMinutes); int afterot = Convert.ToInt32(ca.AfterOTTS.TotalMinutes); int daycount = ca.DayCount; Single wktime = Convert.ToSingle(ca.WorkingTimeTS.TotalMinutes); Single wkdayy = Convert.ToSingle(ca.Workingday); int sophutOT = (int)numSoPhutOT.Value; bool tinhPC150 = checkTinhPC150.Checked; int n; if (ca.OnnDutyTS == ThamSo._21h45 && ca.Workingday == 2f) // ca 3 và 1 => tách { cShift ca3 = ThamSo.DSCa.Find(o => o.OnnDutyTS == ThamSo._21h45 && o.Workingday == 1f); cShift ca1 = ThamSo.DSCa.Find(o => o.OnnDutyTS == ThamSo._05h45 && o.Workingday == 1f); n = DAL.ThemChamCongTay(iUserEnrollNumber, timeBD, ngay.Add(ca3.OffDutyTS), ca3.ShiftID, ca3.ShiftCode , ca3.OnnDutyTS.ToString(@"hh\:mm"), ca3.OffDutyTS.ToString(@"hh\:mm") , Convert.ToInt32(ca3.LateGraceTS.TotalMinutes), Convert.ToInt32(ca3.EarlyGraceTS.TotalMinutes), Convert.ToInt32(ca3.AfterOTTS.TotalMinutes) , ca3.DayCount, Convert.ToSingle(ca3.WorkingTimeTS.TotalMinutes), ca3.Workingday, 0, tinhPC150, lydo, ghichu); // add thêm 1 ngày ở thời gian bd vì ca 1 của ngày hôm sau n = DAL.ThemChamCongTay(iUserEnrollNumber, ngay.AddDays(1d).Add(ca1.OnnDutyTS).Add(new TimeSpan(0, 0, 1)), timeKT, ca1.ShiftID, ca1.ShiftCode , ca1.OnnDutyTS.ToString(@"hh\:mm"), ca1.OffDutyTS.ToString(@"hh\:mm") , Convert.ToInt32(ca1.LateGraceTS.TotalMinutes), Convert.ToInt32(ca1.EarlyGraceTS.TotalMinutes), Convert.ToInt32(ca1.AfterOTTS.TotalMinutes) , ca1.DayCount, Convert.ToSingle(ca1.WorkingTimeTS.TotalMinutes), ca1.Workingday, sophutOT, tinhPC150, lydo, ghichu); } else { // BUG chú ý thêm 1 giây để tránh tình trạng giờ vào trùng giờ ra n = DAL.ThemChamCongTay(iUserEnrollNumber, timeBD.Add(new TimeSpan(0, 0, 1)), timeKT, ca.ShiftID, ca.ShiftCode , onnduty, offduty, lategrace, earlygrace, afterot, daycount, wktime, wkdayy, sophutOT, tinhPC150, lydo, ghichu); } if (n == 0) { MessageBox.Show("Có lỗi trong quá trình thực hiện."); flag = false; break; } } if (flag) { AutoClosingMessageBox.Show("Thêm giờ chấm tay cho các nhân viên thành công.", "Thông báo", 2000); } }
private void btnXem_Click(object sender, EventArgs e) { //0. xoa dữ liệu cũ //1. lấy dữ liệu từ form dtpBD.Update(); dtpKT.Update(); DateTime startTime = dtpBD.Value; DateTime endTime = dtpKT.Value; dgrdDSNVTrgPhg.EndEdit(); this.BindingContext[this.dgrdDSNVTrgPhg.DataSource].EndCurrentEdit(); //2. lấy danh sách nhân viên check LayDSNVXemCong(dgrdDSNVTrgPhg.DataSource as DataTable, flstDSNVChkXemGioVaoRa, flstDSNVPhong); //3. lấy dữ liệu chấm công của các nhân viên if (flstDSNVChkXemGioVaoRa.Count == 0) { AutoClosingMessageBox.Show("Chưa chọn Nhân viên", "Thông báo", 2000); return; } try { fDataTableChkInOut = SqlDataAccessHelper.ExecuteQueryString(SelStr_GetDSGioVaoRa() , new[] { "@BatDauVao", "@KetThucVao", "@BatDauRa", "@KetThucRa" } , new object[] { startTime, endTime, startTime, endTime }); } catch (Exception) { MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại sau.", "Lỗi"); return; } DataTable dataTableChiTietVao = dgrdCTGioVao.DataSource as DataTable; DataTable dataTableChiTietRa = dgrdCTGioRa.DataSource as DataTable; if (dataTableChiTietVao == null) { dataTableChiTietVao = fDataTableChkInOut.Clone(); dataTableChiTietVao.Columns.Add("check", typeof(bool)); } else { dataTableChiTietVao.Rows.Clear(); } if (dataTableChiTietRa == null) { dataTableChiTietRa = fDataTableChkInOut.Clone(); dataTableChiTietRa.Columns.Add("check", typeof(bool)); } else { dataTableChiTietRa.Rows.Clear(); } //4. xử lý dữ liệu để đưa lên lưới tổng hợp foreach (DataRow row in fDataTableChkInOut.Rows) { if ((int)row["MachineNo"] % 2 == 1) { dataTableChiTietVao.ImportRow(row); } else { dataTableChiTietRa.ImportRow(row); } } dgrdCTGioVao.DataSource = dataTableChiTietVao; dgrdCTGioRa.DataSource = dataTableChiTietRa; checkAllGridCheckIn.CheckedChanged -= checkAll_CheckedChanged; checkAllGridCheckOut.CheckedChanged -= checkAll_CheckedChanged; checkAllGridCheckIn.Checked = false; checkAllGridCheckOut.Checked = false; checkAllGridCheckIn.CheckedChanged += checkAll_CheckedChanged; checkAllGridCheckOut.CheckedChanged += checkAll_CheckedChanged; }
private void btnTim_Click(object sender, EventArgs e) { int tieuchi = cbTieuChi.SelectedIndex; DataTable table; DataView view = dgrdDSNVTrgPhg.DataSource as DataView; if (view != null) { table = view.Table; } else { table = dgrdDSNVTrgPhg.DataSource as DataTable; } if (table == null || table.Rows.Count == 0) { return; } if (tieuchi == 0) // tìm theo mã cc { int UserEnrollNumber = -1; if (int.TryParse(tbSearch.Text, out UserEnrollNumber)) { DataView newview = new DataView(table, "UserEnrollNumber=" + UserEnrollNumber, "UserEnrollNumber asc", DataViewRowState.CurrentRows); if (newview.Count == 0) { AutoClosingMessageBox.Show("Không tìm được nhân viên này.", "Thông báo", 2000); return; } else { dgrdDSNVTrgPhg.DataSource = newview; } } else { AutoClosingMessageBox.Show("Không tìm được nhân viên này.", "Thông báo", 2000); return; } } else // tìm theo tên nv { string tennv = tbSearch.Text; if (string.IsNullOrWhiteSpace(tennv)) { return; } else { DataView newview = new DataView(table, "UserFullName like '%" + tennv + "%'", "UserEnrollNumber asc", DataViewRowState.CurrentRows); if (newview.Count == 0) { AutoClosingMessageBox.Show("Không tìm được nhân viên này.", "Thông báo", 2000); return; } else { dgrdDSNVTrgPhg.DataSource = newview; } } } }
private void btnXoaGio_Click(object sender, EventArgs e) { DataTable table = dgrdTongHop.DataSource as DataTable; if (table == null) { return; } DataRow[] arrRows = table.Select("check = true", "UserEnrollNumber asc"); //1 nếu chưa chọn ai thì thông báo if (arrRows.Length == 0) { AutoClosingMessageBox.Show("Bạn chưa chọn Nhân viên.", "Thông báo", 1000); return; } if (MessageBox.Show("Xoá giờ chấm công của các nhân viên?", "Xác nhận", MessageBoxButtons.OKCancel) == DialogResult.Cancel) { return; } bool flagThongBao = false, flagLoiThaoTacDL = false; foreach (DataRow row in arrRows) { cUserInfo tmpNV = flstDSNVChk.Find(o => o.UserEnrollNumber == (int)row["UserEnrollNumber"]); DateTime t_Vao = (row["TimeStrVao"] != DBNull.Value) ? (DateTime)row["TimeStrVao"] : DateTime.MinValue; DateTime t_Raa = (row["TimeStrRa"] != DBNull.Value) ? (DateTime)row["TimeStrRa"] : DateTime.MinValue; if (rdXoaVao.Checked) { if (t_Vao == DateTime.MinValue) { continue; } cChk tmpCheck = tmpNV.ds_CheckAuto.Find(o => o.TimeStr == t_Vao && o.GetType() == typeof(cChkIn)); if (tmpCheck == null) { flagThongBao = true; // giờ chưa xl thì xóa, giờ xác nhận thì bỏ qua } else { if (XL.XoaGioChoNV(tmpNV, tmpCheck, cbLyDo_Xoa.Text, tbGhiChu_Xoa.Text) == false) { flagLoiThaoTacDL = true; break; } } } else if (rdXoaRa.Checked) { if (t_Raa == DateTime.MinValue) { continue; } cChk tmpCheck = tmpNV.ds_CheckAuto.Find(o => o.TimeStr == t_Raa && o.GetType() == typeof(cChkOut)); if (tmpCheck == null) { flagThongBao = true; } else { if (XL.XoaGioChoNV(tmpNV, tmpCheck, cbLyDo_Xoa.Text, tbGhiChu_Xoa.Text) == false) { flagLoiThaoTacDL = true; break; } } } else { if (t_Vao != DateTime.MinValue && t_Raa != DateTime.MinValue) { cChk tmpCheckIn = tmpNV.ds_CheckAuto.Find(o => o.TimeStr == t_Vao && o.GetType() == typeof(cChkIn)); cChk tmpCheckOut = tmpNV.ds_CheckAuto.Find(o => o.TimeStr == t_Raa && o.GetType() == typeof(cChkOut)); if (tmpCheckIn != null && tmpCheckOut != null) { if (XL.XoaGioChoNV(tmpNV, tmpCheckIn, cbLyDo_Xoa.Text, tbGhiChu_Xoa.Text) == false) { flagLoiThaoTacDL = true; break; } if (XL.XoaGioChoNV(tmpNV, tmpCheckOut, cbLyDo_Xoa.Text, tbGhiChu_Xoa.Text) == false) { flagLoiThaoTacDL = true; break; } } else { flagThongBao = true; } } } } if (flagThongBao) { MessageBox.Show("Không thể sửa giờ đã được xác nhận.", "Thông báo"); } if (flagLoiThaoTacDL) { MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại.", "Lỗi", MessageBoxButtons.OK); } try { XL.XemCong(flstDSNVChk, fNgayBD, fNgayKT); loadTable(); } catch (Exception) { MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại.", "Lỗi", MessageBoxButtons.OK); } GC.Collect(); }
private void btnDaoKieuChamCong_Click(object sender, EventArgs e) { dgrdTongHop.EndEdit(); DataTable table = (dgrdTongHop.DataSource) as DataTable; if (table == null) { return; } DataRow[] arrRecord = table.Select("check = true", "UserEnrollNumber asc"); if (arrRecord.Length == 0) { AutoClosingMessageBox.Show("Chưa chọn dòng dữ liệu thao tác.", "Thông báo", 2000); return; } bool flag = false; foreach (DataRow row in arrRecord) { // kiểm tra trước khi thực hiện if (row["TimeStrVao"] != DBNull.Value && row["TimeStrRa"] != DBNull.Value) { flag = true; continue; } cUserInfo tmpNV = flstDSNVChk.Find(item => item.UserEnrollNumber == (int)row["UserEnrollNumber"]); cNgayCong tmpNgay = tmpNV.DSNgayCong.Find(item => item.NgayCong == (DateTime)row["TimeStrNgay"]); DateTime tmpOldTime; cChk tmpChkOld; bool tmpIsCheckInOld; if (row["TimeStrVao"] != DBNull.Value) { tmpOldTime = (DateTime)row["TimeStrVao"]; tmpChkOld = tmpNV.ds_CheckAuto.Find(item => item.TimeStr == tmpOldTime && item.GetType() == typeof(cChkIn)); tmpIsCheckInOld = true; } else { tmpOldTime = (DateTime)row["TimeStrRa"]; tmpChkOld = tmpNV.ds_CheckAuto.Find(item => item.TimeStr == tmpOldTime && item.GetType() == typeof(cChkOut)); tmpIsCheckInOld = false; } if (tmpChkOld == null) { MessageBox.Show("Không thể sửa giờ đã được xác nhận.", "Thông báo"); continue; } if (XL.SuaGioChoNV(tmpNV.UserEnrollNumber, tmpChkOld, tmpChkOld.TimeStr, !tmpIsCheckInOld, "Chấm nhầm máy", "Thay đổi Số máy check") == false) { MessageBox.Show("Không sửa được giờ cho nhân viên. Vui lòng thử lại.", "Lỗi"); break; } } if (flag) { AutoClosingMessageBox.Show("Không thể đảo ngược giờ có đủ giờ vào và giờ ra", "Thông báo", 2000); } try { XL.XemCong(flstDSNVChk, fNgayBD, fNgayKT); loadTable(); } catch (Exception) { MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại sau.", "Lỗi"); } GC.Collect(); }
private void btnXem_Click(object sender, EventArgs e) { //1. lấy dữ liệu từ form #region lấy ngày BD và kết thúc, và update lại Ngày BD = 1 ngày trước 31/08 12:00 AM, ngày KT là 1 ngày sau ngay 1 23:59:59 dtpNgayBD.Update(); dtpNgayKT.Update(); DateTime ngayBD = dtpNgayBD.Value.Date; ngayBD = ngayBD.AddDays(-1d); DateTime ngayKT = dtpNgayKT.Value.Date; ngayKT = ngayKT.AddDays(2d).Subtract(new TimeSpan(0, 0, 1)); #endregion //-----------BUG [KHÔNG PHẢI BUG] CHỈ TÔ MÀU ĐỂ CHÚ Ý] bắt buộc EndEdit thao tác trên Grid rồi mới thực hiện xử lý tác vụ dgrdDSNVTrgPhg.EndEdit(); dgrdDSNVTrgPhg.Update(); //2. lấy danh sách nhân viên check if (flstDSNVChkXemCong == null) { flstDSNVChkXemCong = new List <cUserInfo>(); } else { flstDSNVChkXemCong.Clear(); } LayDSNVXemCong(dgrdDSNVTrgPhg.DataSource as DataTable, flstDSNVChkXemCong, flstDSNV); //3. lấy dữ liệu chấm công của các nhân viên if (flstDSNVChkXemCong.Count == 0) { AutoClosingMessageBox.Show("Chưa chọn Nhân viên", "Thông báo", 2000); return; } //[CHÚ Ý] ngày bắt đầu và kết thúc đã cộng trừ thêm 1 ngày trước sau ở bở trên try { WaitWindow.Show(this.abc, "Đang xử lý...", new object[] { flstDSNVChkXemCong, ngayBD, ngayKT }); //XL.XemCong(flstDSNVChkXemCong, ngayBD, ngayKT); //4. xử lý dữ liệu để đưa lên lưới tổng hợp DataTable dataTableTongHop = dgrdTongHop.DataSource as DataTable; if (dataTableTongHop == null) { dataTableTongHop = TaoCauTrucDataTableTongHop(); } else { dataTableTongHop.Rows.Clear(); } DataTable dataTableKDQD = dgrdGioKDQD.DataSource as DataTable; if (dataTableKDQD == null) { dataTableKDQD = TaoCauTrucDataTableKDQD(); } else { dataTableKDQD.Rows.Clear(); } const string shiftid = "ShiftID"; int i1 = 1; #region fill vào dataTable foreach (cUserInfo nhanvien in flstDSNVChkXemCong) { for (int i = 1; i < nhanvien.DSNgayCong.Count - 1; i++) //[CHÚ Ý] ở đây chỉ chạy từ 1-> kế cuối //Debug.WriteLine(nhanvien.DSNgayCong[0]); //Debug.WriteLine(nhanvien.DSNgayCong[nhanvien.DSNgayCong.Count - 1]); { cNgayCong ngayCong = nhanvien.DSNgayCong[i]; //Debug.WriteLine(cChkInOut1.ToString()); DataRow rowTH = dataTableTongHop.NewRow(); rowTH["check"] = false; rowTH["UserEnrollNumber"] = nhanvien.UserEnrollNumber; rowTH["UserFullName"] = nhanvien.UserFullName; rowTH["TimeStrNgay"] = rowTH["TimeStrThu"] = ngayCong.NgayCong; rowTH["Cong"] = ngayCong.TongCong; rowTH["PhuCap"] = ngayCong.TongPhuCap; rowTH["TimeStrTre"] = Math.Floor(ngayCong.TongTre.TotalMinutes); rowTH["TimeStrSom"] = Math.Floor(ngayCong.TongSom.TotalMinutes); rowTH["TongGioLam"] = ngayCong.TongGioLam.TotalHours; rowTH["TongGioThuc"] = ngayCong.TongGioThuc.TotalHours; if (ngayCong.HasCheck) { i1 = 1; foreach (cChkInOut cChkInOut1 in ngayCong.DSVaoRa) { if (i1 > 3) { break; } rowTH[ThamSo.nameVao + i1] = cChkInOut1.Vao != null ? (object)cChkInOut1.Vao.TimeStr : DBNull.Value; rowTH[ThamSo.nameRa + i1] = cChkInOut1.Raa != null ? (object)cChkInOut1.Raa.TimeStr : DBNull.Value; rowTH[shiftid + i1] = (cChkInOut1.HaveINOUT > 0) ? (object)cChkInOut1.ThuocCa.ShiftID : DBNull.Value; rowTH["ShiftCode"] += (cChkInOut1.HaveINOUT > 0) ? cChkInOut1.ThuocCa.ShiftCode + "; " : ((cChkInOut1.HaveINOUT == -1) ? "KV; " : "KR; "); i1++; } rowTH["ShiftCode"] += ngayCong.XuatChuoiVang(); } else { if (ngayCong.DSVang != null && ngayCong.DSVang.Count != 0) { rowTH["ShiftCode"] += ngayCong.XuatChuoiVang(); } else { rowTH["ShiftCode"] = "--"; } } dataTableTongHop.Rows.Add(rowTH); } } #endregion dgrdTongHop.DataSource = dataTableTongHop; foreach (DataRow row in dataTableTongHop.Select("(ShiftID1 is NULL and (TimeStrVao1 is not null or TimeStrRa1 is not null)) " + " or (ShiftID2 is NULL and (TimeStrVao2 is not null or TimeStrRa2 is not null))" + " or (ShiftID3 is NULL and (TimeStrVao3 is not null or TimeStrRa3 is not null))" + " OR (ShiftID1 is NOT NULL and ShiftID1 = " + int.MinValue + ")" + " OR (ShiftID2 is NOT NULL and ShiftID2 = " + int.MinValue + ")" + " OR (ShiftID3 is NOT NULL and ShiftID3 = " + int.MinValue + ")", string.Empty, DataViewRowState.CurrentRows).ToList()) { dataTableKDQD.ImportRow(row); } dgrdGioKDQD.DataSource = dataTableKDQD; checkAllGridTH.CheckedChanged -= checkAll_CheckedChanged; checkAllGridKDQD.CheckedChanged -= checkAll_CheckedChanged; checkAllGridTH.Checked = false; checkAllGridKDQD.Checked = false; checkAllGridTH.CheckedChanged += checkAll_CheckedChanged; checkAllGridKDQD.CheckedChanged += checkAll_CheckedChanged; GC.Collect(); } catch { MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại sau.", "Lỗi"); GC.Collect(); return; } }