Пример #1
0
        /// <summary>
        /// 引数の <paramref name="tableControlList"/> に存在する全てのコントロールを、
        /// <see cref="TableLayoutPanel"/> に追加する(先頭行に追加する)
        /// </summary>
        /// <param name="tableControlList">
        /// 追加対象のコントロールのリスト
        /// (NULL 又は、要素0の場合、追加対象なしとして処理を終了する)
        /// </param>
        /// <exception cref="Exception">
        /// 追加するコントロールがトップレベルのコントロール または、
        /// 追加によって循環参照になる場合に発生
        /// </exception>
        public void Add(IList <Control> tableControlList)
        {
            // 対象のTableLayoutPanelコントロール取得
            TableLayoutPanel tablePanel = PlListTable;

            // 引数のコレクションがNULL 又は、0行の場合、追加対象なしとして処理を終了する
            if (tableControlList == null || tableControlList.Count == 0)
            {
                return;
            }

            // 描画処理を一時中断
            tablePanel.SuspendLayout();

            try
            {
                // 現在の行数が1以下かつコントロールが未配置の状態であるかの判定を取得
                bool isNoRow = IsNoRow();

                // 現状の行数を取得
                // (現在の行数が1以下かつコントロールが未配置の状態の場合、現在の行数は0とする)
                int beforeRowCount = isNoRow ? 0 : tablePanel.RowCount;

                // 追加する行数
                int addRowCount = tableControlList.Count;

                // 行カウントを増やす
                tablePanel.RowCount = beforeRowCount + addRowCount;

                // スタイル情報を配列で取得し、追加する行数分配列を拡張する
                RowStyle[] rowStyles = tablePanel.RowStyles.ToArray();
                Array.Resize(ref rowStyles, beforeRowCount + addRowCount);

                // 追加行数分コントロール及びスタイルを下に移動させる
                for (int row = beforeRowCount - 1; row >= 0; row--)
                {
                    MoveRow(
                        toRowIndex: row + addRowCount,
                        getControl: (column) => tablePanel.GetControlFromPosition(column, row),
                        rowStyles: ref rowStyles,
                        getRowStyle: () => rowStyles[row]);
                }

                // 追加対象のコントロールとそのスタイルを追加
                int rowIndex = 0;
                foreach (Control control in tableControlList)
                {
                    // コントロールの設定
                    // ラジオボタン
                    TableRadioButton radioButton
                        = new TableRadioButton(tablePanel, (int)ListTableColumn.Radio, SelectRowBackColor);
                    TableRadioButtons.Add(radioButton);
                    tablePanel.Controls.Add(radioButton, (int)ListTableColumn.Radio, rowIndex);

                    // パネル
                    TableControlPanel controlPanel = new TableControlPanel(control);
                    TableControlPanels.Add(controlPanel);
                    tablePanel.Controls.Add(controlPanel, (int)ListTableColumn.Control, rowIndex);

                    // スタイルを設定
                    rowStyles[rowIndex] = new RowStyle();

                    // 行インデックスをインクリメント
                    rowIndex++;
                }

                // スタイルを再設定
                SetRowStyle(rowStyles);

                // Tabインデックスの再設定を行う
                SetTabIndex();
            }
            finally
            {
                // 描画処理を再開
                tablePanel.ResumeLayout(false);
                tablePanel.PerformLayout();
            }
        }