Utils/LayoutAdjustmentHelper.cs

using System.Windows.Forms;
using System.Drawing;

namespace ChatworkBulkSender.Utils
{
    /// <summary>
    /// マスタ画面のレイアウトを統一するヘルパークラス
    /// </summary>
    public static class LayoutAdjustmentHelper
    {
        /// <summary>
        /// マスタ画面の枠線とボタン配置を統一
        /// </summary>
        public static void AdjustMasterScreenLayout(Form form, 
            Control searchBoxControl, 
            Control dgvControl, 
            Control btnControl)
        {
            // nullチェック
            if (form == null || searchBoxControl == null || 
                dgvControl == null || btnControl == null) return;
            
            // 検索ボックス内の枠線パネルを探す
            Panel searchPanel = FindPanelWithBorder(searchBoxControl);
            if (searchPanel != null)
            {
                // 送信履歴画面と同じように左右に余白を設定
                searchPanel.Location = new Point(28, searchPanel.Location.Y);
                // 左右28pxずつの余白を確保
                searchPanel.Width = searchBoxControl.Width - 56;
            }
            
            // DataGridViewの枠線スタイルを統一
            DataGridView dgv = FindDataGridView(dgvControl);
            if (dgv != null)
            {
                dgv.BorderStyle = BorderStyle.FixedSingle;
                // Dockプロパティを確認
                if (dgv.Dock != DockStyle.Fill)
                {
                    dgv.Location = new Point(0, 0);
                    dgv.Width = dgvControl.Width;
                }
            }
            
            // ボタンの配置を調整
            AdjustButtonPositions(btnControl);
        }
        
        /// <summary>
        /// 枠線を持つパネルを検索
        /// </summary>
        private static Panel FindPanelWithBorder(Control parent)
        {
            foreach (Control control in parent.Controls)
            {
                if (control is Panel panel && panel.BorderStyle != BorderStyle.None)
                {
                    return panel;
                }
                
                // 再帰的に検索
                Panel found = FindPanelWithBorder(control);
                if (found != null) return found;
            }
            return null;
        }
        
        /// <summary>
        /// DataGridViewを検索
        /// </summary>
        private static DataGridView FindDataGridView(Control parent)
        {
            foreach (Control control in parent.Controls)
            {
                if (control is DataGridView dgv)
                {
                    return dgv;
                }
                
                // 再帰的に検索
                DataGridView found = FindDataGridView(control);
                if (found != null) return found;
            }
            return null;
        }
        
        /// <summary>
        /// ボタンの位置を調整
        /// </summary>
        private static void AdjustButtonPositions(Control btnControl)
        {
            Button btnReturn = null;
            Button btnCreate = null;
            
            // ボタンを探す
            foreach (Control control in btnControl.Controls)
            {
                if (control is Button btn)
                {
                    if (btn.Text.Contains("戻る"))
                    {
                        btnReturn = btn;
                    }
                    else if (btn.Text.Contains("新規"))
                    {
                        btnCreate = btn;
                    }
                }
            }
            
            // 親コントロールのパディングを考慮
            int leftPadding = 0;
            int rightPadding = 0;
            
            // ボタンの位置を調整
            if (btnReturn != null)
            {
                btnReturn.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
                btnReturn.Location = new Point(leftPadding, btnReturn.Location.Y);
            }
            
            if (btnCreate != null)
            {
                btnCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
                btnCreate.Location = new Point(
                    btnControl.Width - btnCreate.Width - rightPadding, 
                    btnCreate.Location.Y);
            }
        }
    }
}