Forms/M_SendPatternIndividualEdit.cs

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

namespace ChatworkBulkSender.Forms
{
    public partial class M_SendPatternIndividualEdit : Form, ICreatable<PatternMasterDto>, IUpdateble<PatternMasterDto>
    {

        public enum ButtonMode
        {
            Register, // 新規登録
            Update    // 更新
            ,
        }

        private List<int> _selectedCustomerIds = null;

        // パターン名称ヘッダー
        private PatternNameHeaderControl _patternNameHeader = null;

        private SendContentControl _sendPatternIndividualEdit = null;

        // 送信パターンマスタ編集部分
        private SendContentControl _sendContent = null;

        private BtnRegisterControl _btnRegister = null;

        private BtnUpdateControl _btnUpdate = null;

        // 初期値は、新規登録
        private ButtonMode _btnMode = ButtonMode.Register;

        public event EventHandler<PatternMasterDto> DataCreated;
        public event EventHandler<PatternMasterDto> DataUpdated;


        public ButtonMode BtnMode
        {
            set
            {
                _btnMode = value;
            }
        }

        public M_SendPatternIndividualEdit(ButtonMode buttonMode = ButtonMode.Register, PatternMasterDto sendPattern = null)
        {
            InitializeComponent();

            this._btnMode = buttonMode;

            // 初期のウィンドウサイズ
            this.ClientSize = new Size(1600,900);

            // ウィンドウサイズの固定
            this.FormBorderStyle = FormBorderStyle.FixedSingle;

            // 初期のウィンドウ表示位置
            this.StartPosition = FormStartPosition.CenterScreen;


            _patternNameHeader = new PatternNameHeaderControl();
            _sendContent = new SendContentControl();

            if (_btnMode == ButtonMode.Update)
            {
                _btnUpdate = new BtnUpdateControl();
                _btnUpdate.Dock = DockStyle.Fill;
                panel3.Controls.Add(_btnUpdate);
            }
            else
            {
                _btnRegister = new BtnRegisterControl();
                _btnRegister.Dock = DockStyle.Fill;
                panel3.Controls.Add(_btnRegister);
            }

            // レイアウトを垂直に設定
            _sendContent.LayoutMode = LayoutMode.Vertical;

            // Dock設定
            _sendContent.Dock = DockStyle.Fill;
            _patternNameHeader.Dock = DockStyle.Fill;

            // パネルに追加、表示する
            panel1.Controls.Add(_patternNameHeader);
            panel2.Controls.Add(_sendContent);

            Label label1 = _sendContent.Controls.Find("label1",false).FirstOrDefault() as Label;
            label1.Width = 170;
            label1.Text += "(定型文)";

        }

        private void M_SenderPatternIndividualEdit_Load(object sender, EventArgs e)
        {
            this.ActiveControl = panel1;

            if (_btnMode == ButtonMode.Update)
            {
                _btnUpdate.BtnReturnClicked += BtnReturn_Click;

            }
            else
            {
                _btnRegister.BtnReturnClicked += BtnReturn_Click;
            }

        }

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

            // 削除だけでは解放されないので、明示的に解放する
            _patternNameHeader.Dispose();
            _sendContent.Dispose();

            if (_btnMode == ButtonMode.Update)
            {
                _btnUpdate.Dispose();
            }
            else
            {
                _btnRegister.Dispose();
            }
        }

        private void BtnRegister_Click(object sender, EventArgs e)
        {
            try
            {
                if (_selectedCustomerIds != null)
                {
                    _selectedCustomerIds.Clear();
                }
                else
                {
                    _selectedCustomerIds = new List<int>();

                }

                var newPattern = GetPatternData();

                if (newPattern == null) { return; }

                var dao = new PatternMasterDao();

                var createdId = dao.InsertWithCustomersBatch(newPattern,_selectedCustomerIds);

                if (createdId == 1)
                {
                    DataCreated?.Invoke(this, newPattern);

                }

            }
            catch (Exception ex)
            {
                MessageBoxUtil.ShowErr($"{ex.Message}\n\n");
            }
        }


        private void BtnReturn_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void M_SendPatternIndividualEdit_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult result = MessageBox.Show("送信パターンマスタ 個別編集画面を終了してもよろしいですか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

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

                return;
            }

            // イベント登録の解除
            if (_btnMode == ButtonMode.Update)
            {
                _btnUpdate.BtnReturnClicked -= BtnReturn_Click;
            }
            else
            {
                _btnRegister.BtnReturnClicked -= BtnReturn_Click;
            }

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

            // 設定メニューを表示する
            this.Owner.Show();

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

        private PatternMasterDto GetPatternData()
        {
            var patternName =_patternNameHeader.Controls.Find("txtPatternName",false).FirstOrDefault() as TextBox;
            var templateTxt = _sendContent.Controls.Find("txtContents", true).FirstOrDefault() as TextBox;
            var sortOrder = _patternNameHeader.Controls.Find("txtSortOrder", false).FirstOrDefault() as TextBox;
            var isUnused = _patternNameHeader.Controls.Find("chkUnusedFlg", false).FirstOrDefault() as CheckBox;
            var dgvDestinationList = _sendContent.Controls.Find("dgvDestinationList", true).FirstOrDefault() as DataGridView;
            var rdoAutomatic = _sendContent.Controls.Find("rdoAutomaticSelection",true).FirstOrDefault() as RadioButton;

            if (dgvDestinationList != null)
            {
                foreach (DataGridViewRow row in dgvDestinationList.Rows)
                {
                    if (row.Cells["送信対象"].Value != null && (bool)row.Cells["送信対象"].Value)
                    {
                        _selectedCustomerIds.Add(Convert.ToInt32(row.Cells["管理番号"].Value));
                    }
                }
            }

            var newPattern = new PatternMasterDto
            {
                PatternName = patternName.Text,
                TemplateText = templateTxt.Text,
                SortOrder = int.Parse(sortOrder.Text),
                IsUnused = isUnused.Checked,
            };

            return newPattern;

        }

    }
}