Пример #1
0
        /// <summary>
        /// <see cref="PlListTable"/> の対象行に存在する子コントロールを削除する
        /// </summary>
        /// <param name="removeRowIndex">
        /// 削除対象の行インデックス
        /// </param>
        /// <param name="isDelete">
        /// 削除処理かどうかのフラグ
        /// 削除の場合:True、移動の場合:False
        /// (削除の場合は対象のコントロールの Dispose を行う)
        /// </param>
        /// <exception cref="ArgumentOutOfRangeException">
        /// 引数の <paramref name="removeRowIndex"/> が <see cref="PlListTable"/> コントロールの
        /// 行の範囲(0以上、行カウント未満の範囲)の値でない場合に発生
        /// </exception>
        private void RemoveRow(int removeRowIndex, bool isDelete)
        {
            // 対象のTableLayoutPanelコントロール取得
            TableLayoutPanel tablePanel = PlListTable;

            // 引数のチェック
            if (removeRowIndex < 0 || removeRowIndex >= tablePanel.RowCount)
            {
                // 引数のremoveRowIndexがtablePanelの行の範囲にない場合
                throw new ArgumentOutOfRangeException(nameof(removeRowIndex));
            }

            // 削除対象行に存在する全てのコントロールを削除する
            for (int column = 0; column < tablePanel.ColumnCount; column++)
            {
                Control removeControl = tablePanel.GetControlFromPosition(column, removeRowIndex);
                if (removeControl != null)
                {
                    tablePanel.Controls.Remove(removeControl);

                    // 削除の場合は対象のコントロールを破棄する
                    if (isDelete)
                    {
                        if (removeControl is TableRadioButton radio)
                        {
                            TableRadioButtons.Remove(radio);
                        }
                        else if (removeControl is TableControlPanel panel)
                        {
                            TableControlPanels.Remove(panel);
                        }

                        removeControl.Dispose();
                    }
                }
            }
        }
Пример #2
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();
            }
        }