UserControls/CustomerDgvControl.cs

/*
 * Copyright INDEX Co.
 */

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

namespace ChatworkBulkSender.UserControls
{
    /// <summary>
    /// 顧客マスタ画面DGVコントロール。
    /// デザイナー表示のためデバッグ時は、中間クラスを経由する。
    /// </summary>
    [DesignerCategory("UserControl")] // デザイナーでユーザーコントロールとして表示することを明記する
    public partial class CustomerDgvControl : BaseCustomerDgvControl
    {
        protected override int EditButtonColumnIndex => 6;

        protected override int SortableColumnMaxIndex => 5;

        protected override string InitialSortColumnName => "SortOrder";

        EventHandler<CustomerMasterDto> _createdCustomer;


        public CustomerDgvControl()
        {
            if (!IsInDesignMode())
            {
                InitializeComponent();
                if (_dgv == null)
                {
                    base._dgv = this.customerDgv;
                }
                InitializeDgv();
                SetUpColumns();
                customerDgv.Dock = DockStyle.Fill;

            }
        }

        protected override void InitializeDgv()
        {
            base.InitializeDgv();
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if (!IsInDesignMode())
            {
                _createdCustomer = (s, args) => CreatedCustomer();
                _individualEditForm = new M_CustomerMasterIndividualEdit();
                _individualEditForm.DataCreated += _createdCustomer;
                RefreshData();
            }
        }

        public void ClearSelectionCell()
        {
            ClearSelection();
        }

       /* public void ShowCreateForm()
        {
            customerDgv.Enabled = false;

            try
            {
                var createForm = new M_CustomerMasterIndividualEdit(
                    M_CustomerMasterIndividualEdit.ButtonMode.Register);

                createForm.DataCreated += _createdCustomer;
                createForm.Owner = this.ParentForm;

                createForm.FormClosed += (s, args) =>
                {
                    customerDgv.Enabled = true;

                    if (this.ParentForm != null && !this.ParentForm.Visible)
                    {
                        this.ParentForm.Show();
                        this.ParentForm.BringToFront();
                    }

                    RefreshData();
                };
                this.ParentForm.Hide();
                createForm.Show();
            }
            catch(Exception e)
            {
                customerDgv.Enabled = true;

                if (this.ParentForm != null && !this.ParentForm.Visible)
                {
                    this.ParentForm.Show();
                }
                MessageBoxUtil.ShowErr($"新規作成画面の表示中にエラーが発生しました。\n\n{e.Message}");
            }
        }*/

        protected override void ShowEditForm(CustomerMasterDto selectedItem)
        {
            customerDgv.Enabled = false;

            try
            {
                if(_individualEditForm != null && !_individualEditForm.IsDisposed)
                {
                    var form = _individualEditForm;

                    if (form != null)
                    {
                        form.DataCreated += _createdCustomer;
                    }
                    _individualEditForm.Close();
                    _individualEditForm.Dispose();
                    // 内部メッセージ処理
                    Application.DoEvents();
                }

                // フォームを作成(更新ボタン配置の設定にする)
                _individualEditForm = new M_CustomerMasterIndividualEdit(
                    M_CustomerMasterIndividualEdit.ButtonMode.Update, selectedItem);

                var editForm = _individualEditForm;
                if (editForm != null)
                {
                    editForm.DataCreated += _createdCustomer;
                }

                _individualEditForm.Owner = this.ParentForm;

                _individualEditForm.FormClosed += (s, args) =>
                {
                    customerDgv.Enabled = true;

                    if (this.ParentForm != null && !this.ParentForm.Visible)
                    {
                        this.ParentForm.Show();
                        this.ParentForm.BringToFront();
                    }

                    RefreshData();
                };

                this.ParentForm.Hide();
                _individualEditForm.Show();

            }
            catch(Exception e)
            {
                customerDgv.Enabled = true;

                if (this.ParentForm != null && !this.ParentForm.Visible)
                {
                    this.ParentForm.Show();
                }

                MessageBoxUtil.ShowErr($"個別編集画面の表示中にエラーが発生しました。\n\n{e.Message}");
            }
        }

        private void CreatedCustomer()
        {
            RefreshData();
        }

        private void SetUpColumns()
        {
            _dgv.Columns.Clear();

            _dgv.Columns.Add(new DataGridViewTextBoxColumn
            {

                DataPropertyName = nameof(CustomerMasterDto.ManagementNumber),
                Name = nameof(CustomerMasterDto.ManagementNumber),
                HeaderText = "管理番号",
                ReadOnly = true,
                SortMode = DataGridViewColumnSortMode.Programmatic
    ,
            });
            var mgmtNumberCol = customerDgv.Columns[nameof(CustomerMasterDto.ManagementNumber)];
            mgmtNumberCol.FillWeight = 60;


            _dgv.Columns.Add(new DataGridViewTextBoxColumn
            {

                DataPropertyName = nameof(CustomerMasterDto.CustomerName),
                Name = nameof(CustomerMasterDto.CustomerName),
                HeaderText = "顧客名",
                ReadOnly = true,
                SortMode = DataGridViewColumnSortMode.Programmatic
                ,
            });
            var customerNameCol = customerDgv.Columns[nameof(CustomerMasterDto.CustomerName)];
            customerNameCol.FillWeight = 400;

            _dgv.Columns.Add(new DataGridViewTextBoxColumn
            {

                DataPropertyName = nameof(CustomerMasterDto.RoomId),
                Name = nameof(CustomerMasterDto.RoomId),
                HeaderText = "ルームID(rid)",
                ReadOnly = true,
                SortMode = DataGridViewColumnSortMode.Programmatic
                ,
            });
            var roomIdCol = customerDgv.Columns[nameof(CustomerMasterDto.RoomId)];
            roomIdCol.FillWeight = 60;


            _dgv.Columns.Add(new DataGridViewTextBoxColumn
            {

                DataPropertyName = nameof(CustomerMasterDto.DestinationAccountId),
                Name = nameof(CustomerMasterDto.DestinationAccountId),
                HeaderText = "宛先アカウントID",
                ReadOnly = true,
                SortMode = DataGridViewColumnSortMode.Programmatic
                ,
            });
            var destinationCol = customerDgv.Columns[nameof(CustomerMasterDto.DestinationAccountId)];
            destinationCol.FillWeight = 90;

            _dgv.Columns.Add(new DataGridViewTextBoxColumn
            {
                DataPropertyName = nameof(CustomerMasterDto.SortOrder),
                Name = nameof(CustomerMasterDto.SortOrder),
                HeaderText = "並び順",
                ReadOnly = true,
                SortMode = DataGridViewColumnSortMode.Programmatic
                ,
            });
            var sortOrderCol = customerDgv.Columns[nameof(CustomerMasterDto.SortOrder)];
            sortOrderCol.FillWeight = 38;
            sortOrderCol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            sortOrderCol.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            sortOrderCol.HeaderCell.Style.Padding = new Padding(12, 0, 0, 0);

            _dgv.Columns.Add(new DataGridViewCheckBoxColumn
            {
                DataPropertyName = nameof(CustomerMasterDto.IsUnused),
                Name = nameof(CustomerMasterDto.IsUnused),
                HeaderText = "未使用フラグ",
                ReadOnly = true,
                SortMode = DataGridViewColumnSortMode.Programmatic
    ,
            });
            var isUnusedCol = customerDgv.Columns[nameof(CustomerMasterDto.IsUnused)];
            isUnusedCol.FillWeight = 55;
            isUnusedCol.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            isUnusedCol.HeaderCell.Style.Padding = new Padding(12, 0, 0, 0);

            _dgv.Columns.Add(new DataGridViewButtonColumn
            {
                // Data列ではないのでNameのみを設定
                Name = "BtnEdit",
                HeaderText = "編集",
                Text = "\u270F\uFE0F",
                UseColumnTextForButtonValue = true,
                ReadOnly = true,
                DefaultCellStyle = new DataGridViewCellStyle
                {
                    Font = new Font("Segoe UI Emoji", 10),
                    Alignment = DataGridViewContentAlignment.MiddleCenter
                    ,
                }
            });
            var editCol = customerDgv.Columns["BtnEdit"];
            editCol.FillWeight = 38;
            editCol.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;

        }

        protected override List<CustomerMasterDto> GetDataFromDao()
        {
            var dao = new CustomerMasterDao();

            List<CustomerMasterDto> currentData = dao.GetAll(true);

            if (_searchCriteria != null && _searchCriteria.Count > 0)
            {
                var query = currentData.AsQueryable();

                if (_searchCriteria.ContainsKey("ManagementNumber"))
                {
                    var mgmtNumber = _searchCriteria["ManagementNumber"].ToString();
                    query = query.Where(x => x.ManagementNumber.ToString().StartsWith(mgmtNumber));
                }
                if (_searchCriteria.ContainsKey("CustomerName"))
                {
                    var customerName = _searchCriteria["CustomerName"].ToString();
                    query = query.Where(x => x.CustomerName.ToString().Contains(customerName));
                }
                if (_searchCriteria.ContainsKey("IsUnused"))
                {
                    var includeUnused = (bool)_searchCriteria["IsUnused"];

                    if (!includeUnused)
                    {
                        query = query.Where(x => !x.IsUnused);
                    }

                }
                return query.ToList();
            }
            return currentData.Where(x => !x.IsUnused).ToList(); ;
        }

        protected override bool HasUpdateAfter(DateTime? lastLoadTime)
        {
            if (lastLoadTime == null) { return false; }

            return new CustomerMasterDao().HasUpdatesAfter(lastLoadTime);
        }
        public override void Search(Dictionary<string, object> criteria)
        {
            base.Search(criteria);
            this.GetDataFromDao();
        }

        protected override void Dgv_ColumnHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            base.Dgv_ColumnHeaderMouseDoubleClick(sender, e);
        }

        protected override void Dgv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            base.Dgv_CellClick(sender, e);
        }

        private void customerDgv_BringContextChanged(object sender, EventArgs e)
        {
            ClearSelection();
        }
        private void customerDgv_Leave(object sender, EventArgs e)
        {
            ClearSelection();
        }

    }
}