Forms/M_CustomerMaster.cs

/*
 * Copyright XXXX Co.
 */

using System;
using System.Windows.Forms;
using ChatworkBulkSender.Utils;
using ChatworkBulkSender.UserControls;
using System.Drawing;
using System.Linq;
using System.Collections.Generic;
using ChatworkBulkSender.Dtos;

namespace ChatworkBulkSender.Forms
{
    partial class M_CustomerMaster : Form
    {

        private SearchBoxControl _searchBoxControl = null;

        private CustomerDgvControl _customerDgvControl = null;

        private BtnAddMasterControl _btnControl = null;

        private CustomerMasterDto _dto = new CustomerMasterDto();
        
        // 追加:戻るボタンからの終了フラグ
        private bool _isReturnButtonClicked = false;

        public M_CustomerMaster()
        {
            InitializeComponent();

            // 初期の画面サイズ
            this.ClientSize = new Size(1600,900);

            // ウィンドウサイズを固定にする
            this.FormBorderStyle = FormBorderStyle.FixedSingle;

            // 現在の画面の中央に表示する
            this.StartPosition = FormStartPosition.CenterScreen;

            _searchBoxControl = new SearchBoxControl();
            _searchBoxControl.Dock = DockStyle.Fill;

            _customerDgvControl = new CustomerDgvControl();
            _customerDgvControl.Dock = DockStyle.Fill;

            _btnControl = new BtnAddMasterControl();
            _btnControl.Dock = DockStyle.Fill;

            // フォーム上のパネルへユーザーコントロールを格納する
            panelSearch.Controls.Add(_searchBoxControl);
            panelDgv.Controls.Add(_customerDgvControl);
            panelBtn.Controls.Add(_btnControl);

            this.ActiveControl = panelSearch;
        }

        private void M_CustomerMaster_Load(object sender, EventArgs e)
        {
            // 戻るボタンのクリックイベントの登録
            _btnControl.BtnReturnClicked += this.BtnReturn_Click;
            _btnControl.BtnCreateAddClicked += this.BtnCreateAdd_Click;

            _searchBoxControl.SearchRequested += SearchBoxControl_SearchRequested;

            // フォントの統一設定を適用
            FontSettingHelper.ApplyFontsToForm(this);
            
            // ユーザーコントロールにも適用
            FontSettingHelper.ApplyFontsToControl(_searchBoxControl);
            FontSettingHelper.ApplyFontsToControl(_customerDgvControl);
            FontSettingHelper.ApplyFontsToControl(_btnControl);
            
            // TableLayoutPanelの最初の行(検索ボックス)の高さを固定値に設定
            tableLayoutPanel.RowStyles[0] = new RowStyle(SizeType.Absolute, 270F);
            
            // レイアウトの調整(枠線とボタン配置の統一)
            LayoutAdjustmentHelper.AdjustMasterScreenLayout(
                this, 
                _searchBoxControl, 
                _customerDgvControl, 
                _btnControl);
                
            // TabIndexの設定(フォーカス順制御)
            TabIndexHelper.SetMasterScreenTabOrder(
                this,
                _searchBoxControl,
                _customerDgvControl,
                _btnControl);
        }

        /// <summary>
        /// フォーム内のDataGridViewのセルの選択状態を解除します。
        /// </summary>
        private void ClearCustomerGridSelection()
        {
            // パネル内から顧客マスタDGVの参照を検索し、最初に見つけた参照を取得する
            CustomerDgvControl customerDgv = panelDgv.Controls.OfType<CustomerDgvControl>().FirstOrDefault();

            if (customerDgv != null)
            {
                // セルの選択状態を解除する
                customerDgv.ClearSelection();
            }
        }

        private void TableLayoutPanel_MouseDown(object sender, MouseEventArgs e)
        {
            this.ClearCustomerGridSelection();
        }

        private void PanelBtn_MouseDown(object sender, MouseEventArgs e)
        {
            this.ClearCustomerGridSelection();
        }

        private void SearchBoxControl_SearchRequested(object sender, Dictionary<string,object> criteria)
        {
            _customerDgvControl.Search(criteria);
        }

        private void BtnSearch_Click(object sender, EventArgs e)
        {
            var mgmtNumber = _searchBoxControl.Controls.Find("mgmtNumberTxtBox",true).FirstOrDefault() as TextBox;
            var customerName = _searchBoxControl.Controls.Find("customerNameTxtBox", true).FirstOrDefault() as TextBox;
            var chkUnusedData = _searchBoxControl.Controls.Find("chkUnusedData", true).FirstOrDefault() as CheckBox;

            _customerDgvControl.Search(new Dictionary<string, object> {

                {"ManagementNumber", mgmtNumber.Text},
                {"CustomerName", customerName.Text},
                {"IsUnused", chkUnusedData.Checked ? true : false }
                ,

            });
            
        }

        private void BtnCreateAdd_Click(object sender, EventArgs e)
        {
            this.Hide();

            // デフォルトは新規登録状態
            M_CustomerMasterIndividualEdit individualEdit = new M_CustomerMasterIndividualEdit();

            // 親フォームを取得する
            individualEdit.Owner = this;

            // 開く
            individualEdit.Show();
        }



        private void BtnReturn_Click(object sender, EventArgs e)
        {
            // 戻るボタンからの終了であることを示すフラグを設定
            _isReturnButtonClicked = true;
            this.Close();
        }

        /// <summary>
        /// フォームに表示するユーザーコントロールをパネルから削除した後、明示的なDisposeで解放する。
        /// </summary>
        private void DisposeViewControls()
        {
            panelSearch.Controls.Clear();
            panelDgv.Controls.Clear();
            panelBtn.Controls.Clear();

            _searchBoxControl.Dispose();
            _customerDgvControl.Dispose();
            _btnControl.Dispose();
 
        }

        private void M_CustomerMaster_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 戻るボタンからの終了の場合は確認メッセージをスキップ
            if (!_isReturnButtonClicked)
            {
                DialogResult result = MessageBox.Show("顧客マスタ画面を終了してもよろしいですか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (result  == DialogResult.No)
                {
                    e.Cancel = true;
                    
                    return;
                }
            }

            // イベントの登録を解除
            _btnControl.BtnReturnClicked -= this.BtnReturn_Click;

            // 明示的に解放する
            DisposeViewControls();

            if (this.Owner != null) 
            {
                // 設定メニューを表示する
                this.Owner.Show();

                // 再描写を行う
                this.Owner.Refresh();
            }

        }
    }
}