using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Cosmos.UserFrame; using Cosmos.BaseFrame; using Cosmos.CommonManager; using Cosmos.ServiceProvider; using Cosmos.Common; //************************************************************************************************ // 변경 이력 : 간이영수증 발행 시 제품 추가 후 삭제 기능 추가 //------------------------------------------------------------------------------------------------ // - 작 업 자 : 서광원B // - 작업일자 : 2017.11.06 // - 작업분류 : 2017-10-20 CS팀 판매 간이영수증 // - 요청사항 : 간이영수증 발행 시 제품 추가 후 삭제 기능 추가 // -[X]버튼 추가 // - 작업내용 : 기존의 그리드(UI.CsmGrid)는 셀 단위 클릭 이벤트를 발생시키지 않으므로 // [X]버튼 추가 작업은 그리드 컨트롤을 변경해야 함. // 그래서, 쉽게 개발할 수 있는 삭제 버튼을 추가하여 동일 기능을 구현함. //************************************************************************************************ namespace Cosmos.Win { public partial class frmEtcReceipt : Form { #region 변수 선언 private SManager sManager = new SManager(); // 이 객체를 통해 업무 Service 호출 private StateServer StateObject = (StateServer)StateServer.GetInstance(); // StateObject : StateServer Object (객체) private PosStatus m_cPosStatus = new PosStatus(); // 기본정보 참조 private IDataServiceUs m_cEtcReceipt = null; // 거래완료처리 private DataTable m_dtItemInit; // 조회 데이터 리스트 private int nNO = 0; #region (2017.11.06) 간이영수증 삭제 기능 추가을 위한 변수 선언 private int intSelectRow = -1; // 사용자가 선택한 그리드 행번호(초기값: -1) #endregion #endregion 변수 선언 #region 생성자 & 소멸자 public frmEtcReceipt() { InitializeComponent(); base.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw, true); //this.UpdateStyles(); m_cPosStatus = (PosStatus)StateObject.POS; // POS 기본정보 m_cEtcReceipt = (IDataServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_ADMIN.DLL, ServiceLists.BSV_ADMIN.ETC_RECEIPT); } private void frmEtcReceipt_Load(object sender, EventArgs e) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ""); // 컨트롤 초기화 처리 InitControl(); } private void frmEtcReceipt_FormClosing(object sender, FormClosingEventArgs e) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", lblTitle.Text); } #endregion 생성자 & 소멸자 #region 폼 컨트롤 초기화 /// /// 폼 컨트롤 초기화 /// private void InitControl() { FormManager.SetFormAllControlFont(this, m_cPosStatus.Base.FONT); FormManager.SetTextBoxGlobalInfo(this, m_cPosStatus.Global.m_stCultureMaster.nGroupingDigits, m_cPosStatus.Global.m_stCultureMaster.strGroupingSymbol , m_cPosStatus.Global.m_stCultureMaster.nDecimalDigits, m_cPosStatus.Global.m_stCultureMaster.strDecimalSymbol); picBack.Image = ImageManager.GetImage(BaseCom.NxImgPath, ImageManager.POP_SIZE_S); //테마색상 적용! //btnPrint.BackColor = CmUtil.GetColorToString(m_cPosStatus.ScnMst.ThemeColor); padInPut.ThemeColor = m_cPosStatus.ScnMst.ThemeColor; padInPut.ClearBtnText = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0817); padInPut.SearchBtnText = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1018); btnExit.Image = ImageManager.GetImage(BaseCom.NxImgPath, ImageManager.BTN_CLOSE); if (btnExit.Image != null) btnExit.Text = ""; btnDate.Image = ImageManager.GetImage(BaseCom.NxImgPath, ImageManager.ICON_DATE_BASIC); if (btnDate.Image != null) btnDate.Text = ""; btnUp.Image = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.NAVIBTN_14X9_UP1_BASIC); btnDw.Image = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.NAVIBTN_14X9_DOWN1_BASIC); if (btnUp.Image != null) btnUp.Text = ""; if (btnDw.Image != null) btnDw.Text = ""; // 라벨 이름 설정 lblTitle.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0344); lblSaleDate.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0242); lblPluName.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0015); lblAmount.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0019); // 버튼 이름 설정 btnPluChoice.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0224); btnPrint.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0257); //======================================================================= // (2017.11.06) 간이영수증 삭제 기능 추가을 위한 삭제 버튼 추가 //----------------------------------------------------------------------- // - 삭제 기능을 위해 삭제 버튼을 추가하였고, // 사용자들은 삭제 가능한 경우에만 버튼을 클릭할 수 있도록 비표시하였음 //======================================================================= #region (2017.11.06) 간이영수증 삭제 기능 추가을 위한 삭제 버튼 추가 btnDelete.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0021); SubDeleteButtonSetting("비표시"); // 삭제버튼 비표시(초기값) #endregion txtDate.InputTypeFormat = m_cPosStatus.Global.m_stCultureMaster.strDatePattern; txtDate.Text = m_cPosStatus.Global.DateToCulture(m_cPosStatus.Base.SaleDate); if (btnDelete.Text.Length == 0) btnDelete.Visible = false; if (btnMenu4.Text.Length == 0) btnMenu4.Visible = false; nNO = 0; txtAmount.Text = "0"; txtPluName.Text = ""; SetListColumn(); // 간이영수증 화면 TOPMOST 처리 삭제(2017.07.18) //this.TopMost = true; txtAmount.Select(); txtPluName.Select(); } /// /// 간이영수증 품목 추가 정보에 대한 DataGridView 초기화 /// private void SetListColumn() { try { // 간이영수증 정보 dgvData.CsmGridColumnHeadersVisible = true; //DataGridView 자체의 컬럼 헤더 Visible 여부 dgvData.CsmGridColumnHeadersHeight = 37; //DataGridView 자체의 컬럼 헤더 높이 dgvData.CsmGridColumnHeadersFont = new Font(m_cPosStatus.Base.FONT, 12, FontStyle.Bold); //DataGridView 자체의 컬럼 헤더 폰트 dgvData.CsmGridRowsHeight = 35; dgvData.CsmGridColumnCount = 3; //그리드의 컬럼수 dgvData.CsmGridShowPageRowsCount = 4; //그리드의 한 화면에 보이는 로우수 dgvData.CsmGridSetHeaderBackColor(236, 238, 239); //그리드 헤더 배경색 dgvData.CsmGridDefaultRowBackColor = Color.FromArgb(255, 255, 255); //그리드 홀수(Default)행의 배경색 지정 dgvData.CsmGridAlternateRowBackColor = Color.FromArgb(251, 253, 255); //그리드 짝수(Alternate)행의 배경색 지정 dgvData.CsmGridBackGroundColor = Color.FromArgb(251, 253, 255); //기본 백그라운드 컬러 dgvData.CsmGridHighlightColor = Color.FromArgb(255, 251, 211); //그리드 선택 백 컬러 dgvData.CsmGridHighlightTextColor = Color.Black; //그리드 선택 글자 컬러 dgvData.CsmGridSetColumnWidth(new int[] { 30, 210, 140 }); //컬럼넓이 지정(380) dgvData.CsmGridAlignment(new int[] { 1, 0, 2 }); //컬럼 정렬 0:왼쪽, 1:가운데, 2:오른쪽 //각 컬럼별 이름 지정 dgvData.CsmGridColumnName(0, MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0014)); dgvData.CsmGridColumnName(1, MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0015)); dgvData.CsmGridColumnName(2, MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0019)); //그리드 초기화 테이블 m_dtItemInit = new DataTable("INIT"); m_dtItemInit.Columns.Add(new DataColumn("No", typeof(string))); m_dtItemInit.Columns.Add(new DataColumn("Plu", typeof(string))); m_dtItemInit.Columns.Add(new DataColumn("Amount", typeof(string))); m_dtItemInit.Clear(); } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); } } #endregion 폼 컨트롤 초기화 #region Control Event #region 텍스트박스 키 입력 이벤트 처리 /// /// 텍스트박스 키 입력 이벤트 처리 /// /// /// private void txtEditBox_EditBoxKeyDownEvent(object sender, string sFuncValue) { try { string sTxtBoxName = ((Cosmos.UI.CsmPosEditBox)sender).Name; if (sFuncValue == PosKey.MENU_KEY.ENTER) { if (sTxtBoxName == "txtPluName") { txtAmount.Focus(); } } else if (sFuncValue == PosKey.MENU_KEY.CLEAR) { // CLEAR 눌렀을 경우 뭘 해줘야 할까... } else if (sFuncValue == PosKey.MENU_KEY.ESC_PREVIOUS) { this.DialogResult = DialogResult.Cancel; this.Close(); } } catch (Exception ex) { WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message); } } /// /// 텍스트박스 활성화 처리 /// /// /// private void txtEditBox_EnterEvent(object sender, EventArgs e) { try { padInPut.SetActiveControl = (Control)sender; } catch (Exception ex) { WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message); } } #endregion 텍스트박스 키 입력 이벤트 처리 #region 업/다운 클릭 이벤트 /// /// 조회 그리드 업/다운 클릭 이벤트 /// /// /// private void btnSelProc_Click(object sender, EventArgs e) { if ((UI.CsmButton)sender == btnUp) { dgvData.CsmGridScroll("UP"); #region (2017.11.06) 간이영수증 삭제 기능 추가을 위한 업(UP) 처리 intSelectRow -= 1; // 행값(intSelectRow) 증가 if (intSelectRow < 0) { intSelectRow = 0; } if (intSelectRow > -1) { // 그리드 클릭 이벤트 호출 ----- dgvData_GridClickEvent(sender, intSelectRow.ToString()); } #endregion } else if ((UI.CsmButton)sender == btnDw) { dgvData.CsmGridScroll("DOWN"); #region (2017.11.06) 간이영수증 삭제 기능 추가을 위한 다운(DOWN) 처리 intSelectRow += 1; // 행값(intSelectRow) 증가 if (intSelectRow > 4) { intSelectRow = 4; } if (intSelectRow > -1) { // 그리드 클릭 이벤트 호출 ----- dgvData_GridClickEvent(sender, intSelectRow.ToString()); } #endregion } } #endregion 업/다운 클릭 이벤트 /// /// Form Close /// /// /// private void btnExit_Click(object sender, EventArgs e) { this.Close(); } #region 버튼 입력 처리 /// /// 상품 등록 /// /// /// private void btnPluChoice_Click(object sender, EventArgs e) { try { //금액이 입력되지 않은 경우 처리하지 못함 if (txtAmount.Text == "" || txtAmount.Text == "0") { WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0175)); return; } //------------------------------------------------------------------------------------- // (2017.11.06) 간이영수증 삭제 기능 추가을 위한 번호 설정 //------------------------------------------------------------------------------------- // - 기존의 폼 변수에 +1 하는 처리 대신에 데이터 테이블 갯수에 +1 하는 처리로 변경한다. //------------------------------------------------------------------------------------- // nNO = nNO + 1; nNO = m_dtItemInit.Rows.Count + 1; //------------------------------------------------------------------------------------- DataRow dr = m_dtItemInit.NewRow(); dr["No"] = nNO; if (txtPluName.Text.Trim() == "") { txtPluName.Text = "기타제품"; } dr["Plu"] = txtPluName.Text; dr["Amount"] = CmUtil.GetToMoney(txtAmount.Text); m_dtItemInit.Rows.Add(dr); dgvData.CsmGridDataSource = m_dtItemInit; //금액 txtPluName.Text = ""; txtAmount.Text = "0"; //-------------------------------------------------------------------------------- // (2017.11.06) 간이영수증 삭제 기능 추가을 위한 그리드 클릭 이벤트 및 포커스 설정 //-------------------------------------------------------------------------------- // - 입력시 그리드 포커스는 맨위로 // - 포커스는 상품명으로 //-------------------------------------------------------------------------------- #region 그리드 클릭 이벤트 및 포커스 설정 dgvData_GridClickEvent(sender, "0"); txtPluName.Focus(); #endregion } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); } } /// /// 영수증 출력 /// /// /// private void btnPrint_Click(object sender, EventArgs e) { string sRet = UserCom.RST_ERR; double dTotAmount = 0; try { DataTable dtData = new DataTable(); dtData.Columns.Add(new DataColumn("NO", typeof(int))); dtData.Columns.Add(new DataColumn("SALEDT", typeof(string))); dtData.Columns.Add(new DataColumn("PLU", typeof(string))); dtData.Columns.Add(new DataColumn("AMOUNT", typeof(string))); if (dgvData.CsmGridRowsCount <= 0) { if (txtAmount.Text != "" && txtAmount.Text != "0") { DataRow dr = dtData.NewRow(); dr["NO"] = 1; dr["SALEDT"] = m_cPosStatus.Global.CultureToDate(txtDate.Text); dr["PLU"] = "기타제품"; dr["AMOUNT"] = txtAmount.Text; dtData.Rows.Add(dr); } else { WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0003)); return; } } for (int i = 0; i < dgvData.CsmGridRowsCount; i++) { string sAmount = (dgvData.CsmGridGetCell(i, 2)).Replace(m_cPosStatus.Global.m_stCultureMaster.strGroupingSymbol, ""); dTotAmount = dTotAmount + CmUtil.GetValueToLong(sAmount); DataRow dr = dtData.NewRow(); dr["NO"] = CmUtil.GetValueToInt(dgvData.CsmGridGetCell(i, 0)); dr["SALEDT"] = m_cPosStatus.Global.CultureToDate(txtDate.Text); dr["PLU"] = dgvData.CsmGridGetCell(i, 1); dr["AMOUNT"] = sAmount; dtData.Rows.Add(dr); } // 출력 버튼을 눌렀을 경우 저장 되는것 없이 출력만 가능해야 한다. sRet = m_cEtcReceipt.SetData(dtData); if (sRet == UserCom.RST_OK) { WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0179); } else { WinManager.ErrorMessage(sRet); } } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); } } #endregion 버튼 입력 처리 private void btnDate_Click(object sender, EventArgs e) { try { string sDate = WinBasic.ShowForm(new string[] { FormManager.FORM_CALENDAR }); if (sDate != "") txtDate.Text = m_cPosStatus.Global.DateToCulture(sDate); } catch (Exception ex) { WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message); } } #endregion Control Event //************************************************** // (2017.11.06) 간이영수증 삭제 기능 추가을 위한 // 삭제버튼(btnDelete) 클릭 이벤트 함수 //************************************************** #region 삭제버튼(btnDelete) 클릭 이벤트 함수 private void btnDelete_Click(object sender, EventArgs e) { if (intSelectRow > -1) { //--------------------------------------------- // 데이터 테이블에서 선택한 행을 우선 삭제하고, // 일련번호 재설정 후 // 데이터 테이블을 그리드에 표시한다. //--------------------------------------------- #region 데이터 테이블에서 선택행 삭제 -> 일련번호 재설정 -> 그리드에 표시한다. m_dtItemInit.Rows.RemoveAt(intSelectRow); // 선택한 행을 삭제한다. for (int i = 0; i < m_dtItemInit.Rows.Count; i++) { m_dtItemInit.Rows[i]["No"] = i + 1; // 일련번호 재설정 } dgvData.CsmGridDataSource = m_dtItemInit; // 그리드에 표시한다. #endregion //----------------------------------------------------------- // 마지막 행까지 삭제했을 경우 '삭제' 버튼을 비활성화 시킨다. //----------------------------------------------------------- #region 마지막 행까지 삭제했을 경우 '삭제' 버튼을 비활성화 시킨다. if (m_dtItemInit != null && m_dtItemInit.Rows.Count == 0) { // 삭제버튼 비표시 ----- SubDeleteButtonSetting("비표시"); // 포커스 설정 ----- txtPluName.Focus(); } #endregion //----------------------------------------------------------- // 삭제후 마지막 행이 아니면서 // 기존 소스가 디폴트로 맨처음 행으로 포커스를 이동하므로 // 행위치 값을 맞춰주기 위하여 그리드 클릭 이벤트를 호출한다. //----------------------------------------------------------- #region 행위치 값을 맞춰주기 위하여 그리드 클릭 이벤트를 호출한다. else { if (dgvData.CsmGridRowsCount <= intSelectRow) { intSelectRow = intSelectRow - 1; } dgvData_GridClickEvent(sender, intSelectRow.ToString()); dgvData.CsmGridSelectRow(intSelectRow); } #endregion } } #endregion //********************************************** // (2017.11.06) 간이영수증 삭제 기능 추가을 위한 // 그리드 클릭 이벤트 함수 //********************************************** #region 그리드 클릭 이벤트 함수 private void dgvData_GridClickEvent(object sender, string rowIndex) { // 사용자가 선택한 행 값(intSelectRow)을 저장한다. ----- if (dgvData.CsmGridRowsCount == 0) return; intSelectRow = Convert.ToInt16(rowIndex); // 행 값(intSelectRow) 저장 //------------------------------------------------------------------- // 만약 사용자가 선택한 행이 존재할 경우 '삭제' 버튼을 활성화 시킨다. //------------------------------------------------------------------- #region 만약 사용자가 선택한 행이 존재할 경우 '삭제' 버튼을 활성화 시킨다. if (intSelectRow > -1) { // 삭제버튼 표시 ----- SubDeleteButtonSetting("표시"); } else { return; } #endregion } #endregion //************************************************ // (2017.11.06) 간이영수증 삭제 기능 추가을 위한 // 삭제버튼(btnDelete) 상태 설정 함수 //************************************************ #region 삭제버튼(btnDelete) 상태 설정 함수 private void SubDeleteButtonSetting(string _strDiv) { //-------------------------------------------- // 만약 구분값이 '표시'일 경우 // 삭제 버튼을 출력 버튼 앞에 표시되도록 한다. //-------------------------------------------- #region 만약 구분값이 '표시'일 경우 if (_strDiv == "표시") { btnDelete.Visible = true; // 삭제버튼 표시 btnDelete.Left = 524; btnPrint.Left = 605; } #endregion //--------------------------------------------------------- // 만약 구분값이 '비표시'일 경우 // 삭제 버튼을 비표시하고 출력 버튼이 공백을 채우도록 한다. //--------------------------------------------------------- #region 만약 구분값이 '비표시'일 경우 else if (_strDiv == "비표시") { btnDelete.Visible = false; // 삭제버튼 비표시 btnDelete.Left = 605; btnPrint.Left = 524; } #endregion } #endregion } }