using HotelPms.Share.Windows.Component; using HotelPms.Share.Windows.Tool; using HotelPms.Share.Windows.Util; using HotelPms.WinForm.Common.Interface; using System.Data; namespace HotelPms.WinForm.Common { public partial class MasterBase : FormBase { #region ★★★★★ Declartions ★★★★★ protected DataTable? m_Data; protected bool m_DisableSelectionChanged = false; protected CTextBoxArray? tbArray; protected ValueChangeListener? m_ValueChangeListener = null; protected static string DelMsg = "選択されたデータを削除しますか?"; protected static string ExistsMsg = "該当データが既に存在します。"; protected static string NotExistsMsg = "指定したコードがマスタに存在しません。"; protected static string LockMsg = $"現在の情報は他の端末か他の機能で更新済です。{Environment.NewLine}最新情報を取得しますか?"; protected Dictionary m_GridColNameDict = new Dictionary(); #endregion #region ★★★★★ Property ★★★★★ public IMasterCtrl? MasterCtrl { get; set; } #endregion #region ★★★★★ Class Event ★★★★★ public MasterBase() => InitializeComponent(); private void MasterBase_Load(object sender, EventArgs e) { if (DesignMode) { return; } System.Diagnostics.Debug.WriteLine("MasterBase_Load"); InitGrid(); tbArray = new CTextBoxArray(true, this); tbArray.ValueChanged += CTextBoxArray_ValueChanged; tbArray.IsCorrectEtc += CTextBoxArray_IsCorrectEtc; tbArray.KeyEnd += CTextBoxArray_KeyEnd; tbArray.TextChanged += CTextBoxArray_TextChanged; tbArray.BeforeAutoNextFocus += CTextBoxArray_BeforeAutoNextFocus; m_ValueChangeListener = new ValueChangeListener(lblStatus); m_ValueChangeListener.SetUpdateFormMode(UpdateFormMode.Normal); } private void MasterBase_FormClosing(object sender, FormClosingEventArgs e) { if (DesignMode) { return; } //編集中の時に警告メッセージを出す if (m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Inputting || m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Edit) { switch (ExitDialog.ExecuteDialog()) { case DialogResult.Cancel: e.Cancel = true; return; case DialogResult.OK: tbArray.DisbleValidating = true; if (!MasterCtrl.Save()) { e.Cancel = true; return; } tbArray.DisbleValidating = false; break; case DialogResult.Abort: break; } } } private void MasterBase_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Escape: ActiveControl = btnExit; btnExit_Click(btnExit, e); e.Handled = true; break; case Keys.F1: ActiveControl = btnNew; btnNew_Click(btnExit, e); e.Handled = true; break; case Keys.F2: ActiveControl = btnEdit; btnEdit_Click(btnExit, e); e.Handled = true; break; case Keys.F12: ActiveControl = btnSave; btnSave_Click(btnExit, e); e.Handled = true; break; } } private void MasterBase_FormClosed(object sender, FormClosedEventArgs e) { if (DesignMode) { return; } if (m_Data != null) { m_Data.Dispose(); m_Data = null; } if (m_ValueChangeListener != null) { m_ValueChangeListener.Dispose(); m_ValueChangeListener = null; } System.Diagnostics.Debug.WriteLine("MasterBase_FormClosed"); } #endregion #region ★★★★★ Control Event ★★★★★ private void txtSearchKey_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Return) { MasterCtrl.ShowData(); } } private void btnSave_Click(object sender, EventArgs e) { MasterCtrl.Save(); } private void btnExit_Click(object sender, EventArgs e) { Close(); } private void btnNew_Click(object sender, EventArgs e) { if (m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Inputting || m_ValueChangeListener.CurUpdateMode == UpdateFormMode.New) { return; } //編集中の時に警告メッセージを出す if (m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Edit) { switch (ExitDialog.ExecuteDialog()) { case DialogResult.Cancel: return; case DialogResult.OK: tbArray.DisbleValidating = true; if (!MasterCtrl.Save()) { return; } tbArray.DisbleValidating = false; break; case DialogResult.Abort: break; } } SetNewMode(); } private void btnEdit_Click(object sender, EventArgs e) { if (m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Normal || m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Edit) { return; } if (dgvData.Rows.Count == 0) { return; } //編集中の時に警告メッセージを出す if (m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Inputting) { switch (ExitDialog.ExecuteDialog()) { case DialogResult.Cancel: return; case DialogResult.OK: tbArray.DisbleValidating = true; if (!MasterCtrl.Save()) { return; } tbArray.DisbleValidating = false; break; case DialogResult.Abort: break; } } //閲覧へ MasterCtrl.ShowDetail(); } private void dgvData_SelectionChanged(object sender, EventArgs e) { if (m_DisableSelectionChanged) { return; } if (m_ValueChangeListener.CurUpdateMode == UpdateFormMode.New || m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Inputting) { return; } if (m_ValueChangeListener.CurUpdateMode == UpdateFormMode.Edit) { tbArray.DisbleValidating = true; MasterCtrl.Save(); tbArray.DisbleValidating = false; } MasterCtrl.ShowDetail(); } private void dgvData_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex < 0) { return; } if (e.ColumnIndex == dgvData.Columns["colDel"].Index) { MasterCtrl.Delete(); } } protected virtual void CTextBoxArray_BeforeAutoNextFocus(object sender, int index, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Return: if (tbArray.Items[index].Equals(tbArray.Items[tbArray.Items.Count - 1])) { btnSave.Focus(); } break; } } protected virtual void CTextBoxArray_TextChanged(object sender, int index, EventArgs e) { tbArray.DisbleTextChanged = true; //名称をクリア if (tbArray.Items[index].MstNameCtrl != null) { tbArray.Items[index].MstNameCtrl.Text = string.Empty; } tbArray.DisbleTextChanged = false; } protected virtual void CTextBoxArray_KeyEnd(object sender, int index, KeyEventArgs e) { MasterCtrl.ShowList(tbArray.Items[index]); } protected virtual bool CTextBoxArray_IsCorrectEtc(object sender, int index, CTextBoxArrayBaseEventArgs e) { if (m_ValueChangeListener.CurUpdateMode != UpdateFormMode.Inputting && m_ValueChangeListener.CurUpdateMode != UpdateFormMode.Edit) { return true; } try { CTextBox obj = tbArray.Items[index]; if (!MasterCtrl.IsCorrectEtc(obj, e.CheckAll, e.ShowErrMsg)) { return false; } //コード存在チェック if (obj.Text.Length > 0 && obj.MstNameCtrl != null) { if (!IsCDExists(obj)) { if (e.ShowErrMsg) { ShowIDErrMsg(obj); return false; } else { obj.Text = obj.OrgText; IsCDExists(obj); return true; } } } return true; } catch (Exception ex) { if (e.ShowErrMsg) { MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } return false; } } protected virtual void CTextBoxArray_ValueChanged(object sender, int index, CTextBoxArrayBaseEventArgs e) { //編集状態 switch (m_ValueChangeListener.ChangeToEditingMode()) { case ChangeEditingModeResult.Error: e.Cancel = true; return; case ChangeEditingModeResult.ReLoad: e.Cancel = true; e.ResetOrgValue = false; return; } } #endregion #region ★★★★★ Private Function ★★★★★ private void InitGrid() { GeneralSub.SetDoubleBuffered(dgvData); GeneralSub.InitDataGridView(dgvData, true); //dgvData.RowsDefaultCellStyle.BackColor = Color.FromArgb(60, 63, 65); //dgvData.RowsDefaultCellStyle.ForeColor = Color.White; dgvData.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //dgvData.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(60, 63, 65); dgvData.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(240, 240, 240); dgvData.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black; dgvData.ColumnHeadersDefaultCellStyle.SelectionBackColor = dgvData.ColumnHeadersDefaultCellStyle.BackColor; dgvData.DefaultCellStyle.SelectionBackColor = Color.LemonChiffon; dgvData.DefaultCellStyle.SelectionForeColor = Color.Black; //DataGridViewButtonColumn col = new DataGridViewButtonColumn(); DataGridViewLinkColumn col = new DataGridViewLinkColumn(); col.Name = "colDel"; col.Text = "削除"; col.HeaderText = string.Empty; //col.UseColumnTextForButtonValue = true; col.UseColumnTextForLinkValue = true; col.Width = 50; col.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgvData.Columns.Add(col); } protected void SetGridColNameDict() { m_GridColNameDict.Clear(); foreach (DataGridViewColumn col in dgvData.Columns) { if (string.IsNullOrEmpty(col.DataPropertyName)) { continue; } m_GridColNameDict.Add(col.DataPropertyName, col.Name); } } protected object GetCellValue(string dataField) { return GetCellValue(dataField, dgvData.CurrentRow); } protected object GetCellValue(string dataField, DataGridViewRow row) { return row.Cells[m_GridColNameDict[dataField]].Value; } protected virtual void SetNewMode() { tbArray.DisbleValidating = true; foreach (TextBox item in tbArray.Items) { if ((item as CTextBox).IsPrimaryKey) { (item as CTextBox).Enabled = true; } (item as CTextBox).Text = string.Empty; } this.ActiveControl = tbArray.Items[0]; m_ValueChangeListener.SetUpdateFormMode(UpdateFormMode.New); tbArray.DisbleValidating = false; } /// /// コードの存在チェック /// /// protected bool IsCDExists(CTextBox sender) { MasterCtrl.SetDispName(sender); return sender.MstNameCtrl.Text.Length > 0; } /// /// 指定コードが存在しない時のエラーメッセージ /// protected void ShowIDErrMsg(CTextBox sender) { MessageBox.Show(NotExistsMsg, sender.TipText, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } /// /// 項目遷移(Mouse、キー以外でコードからFocus()を使う)の時に、 /// 前の項目のValidatingイベント発生しないようにしないといけない /// /// protected void SetCellFocus(int row, int col, bool isFocus) { try { m_DisableSelectionChanged = true; dgvData.Rows[row].Cells[col].Selected = true; dgvData.CurrentCell = dgvData.Rows[row].Cells[col]; if (isFocus) { dgvData.Focus(); } } catch { } finally { m_DisableSelectionChanged = false; } } #endregion #region ★★★★★ Public Function ★★★★★ #endregion } }