0

テーブル レイアウト コントロールを含むフォームがあります。テーブル レイアウトには、3 つの列といくつかの行があります。

最初の列にはラベルが含まれ、2 番目の列はテキストボックス、コンボボックス、または日時ピッカーのいずれかです。3 番目の列には、ユーザーが入力した情報にエラーが含まれている場合にオンまたはオフに切り替わる画像が含まれています。これは、間違って入力したフィールドや見逃したフィールドを確認できるようにするためです。

5 行目には、ユーザーが入力するトランザクションの種類を選択できるコンボボックスが含まれています。ユーザーの選択内容によっては、コントロールを再配置する必要がある場合があります。

スクリーンショットを使用した例を示しましょう。

http://i.stack.imgur.com/OZmFH.png

これは実行中のフォームの標準バージョンであり、ユーザーはトランザクション タイプを選択していません。

ここで、ユーザーがローンの支払いを選択したとします。フォームは次のように再配置されます。

http://i.stack.imgur.com/j76wG.png

説明文と総額が数行下に移動し、新しいボックスが表示されて、ユーザーがローンと支払い回数を選択できるようになっていることがわかります。

選択した取引タイプに応じて、3 つの異なるレイアウトを表示できます。

現時点では、Transaction Type コンボボックスの SelectedIndexChanged イベントをチェックしてこれを行い、メソッドを呼び出してビューをセットアップします。

これを達成するための最良の方法は何ですか? 現在、それを行うコードがありますが、非常に面倒です。

テーブル レイアウト パネル以外の何かを見る必要がありますか?

    読み取り専用 TableLayoutPanelCellPosition tlCCccLbl = new TableLayoutPanelCellPosition(0, 5);
    読み取り専用 TableLayoutPanelCellPosition tlCCccList = new TableLayoutPanelCellPosition(1, 5);
    読み取り専用 TableLayoutPanelCellPosition tlCCccError = new TableLayoutPanelCellPosition(2, 5);

    読み取り専用 TableLayoutPanelCellPosition tlCCnarrativeLbl = new TableLayoutPanelCellPosition(0, 6);
    読み取り専用 TableLayoutPanelCellPosition tlCCnarrativeTxt = new TableLayoutPanelCellPosition(1, 6);

    読み取り専用 TableLayoutPanelCellPosition tlCCgrossLbl = new TableLayoutPanelCellPosition(0, 7);
    読み取り専用 TableLayoutPanelCellPosition tlCCgrossTxt = new TableLayoutPanelCellPosition(1, 7);
    読み取り専用 TableLayoutPanelCellPosition tlCCgrossError = new TableLayoutPanelCellPosition(2, 7);

    読み取り専用 TableLayoutPanelCellPosition tlStdnarrativeLbl = new TableLayoutPanelCellPosition(0, 5);
    読み取り専用 TableLayoutPanelCellPosition tlStdnarrativeTxt = new TableLayoutPanelCellPosition(1, 5);

    読み取り専用 TableLayoutPanelCellPosition tlStdgrossLbl = new TableLayoutPanelCellPosition(0, 6);
    読み取り専用 TableLayoutPanelCellPosition tlStdgrossTxt = new TableLayoutPanelCellPosition(1, 6);
    読み取り専用 TableLayoutPanelCellPosition tlStdgrossError = new TableLayoutPanelCellPosition(2, 6);

    読み取り専用 TableLayoutPanelCellPosition tlStdLoanPymntsLbl = new TableLayoutPanelCellPosition(0, 8);
    読み取り専用 TableLayoutPanelCellPosition tlStdLoanPymntsCmb = new TableLayoutPanelCellPosition(1, 8);
    読み取り専用 TableLayoutPanelCellPosition tlStdLoanPymntsError = new TableLayoutPanelCellPosition(2, 8);

    読み取り専用 TableLayoutPanelCellPosition tlStdLoanLbl = new TableLayoutPanelCellPosition(0, 9);
    読み取り専用 TableLayoutPanelCellPosition tlStdLoanError = new TableLayoutPanelCellPosition(2, 9);
    読み取り専用 TableLayoutPanelCellPosition tlStdccLbl = new TableLayoutPanelCellPosition(0, 10);
    読み取り専用 TableLayoutPanelCellPosition tlStdccList = new TableLayoutPanelCellPosition(1, 10);
    読み取り専用 TableLayoutPanelCellPosition tlStdccError = new TableLayoutPanelCellPosition(2, 10);

    読み取り専用 TableLayoutPanelCellPosition tlLnLoanLbl = new TableLayoutPanelCellPosition(0, 5);
    読み取り専用 TableLayoutPanelCellPosition tlLnLoanCmb = new TableLayoutPanelCellPosition(1, 5);
    読み取り専用 TableLayoutPanelCellPosition tlLnLoanError = new TableLayoutPanelCellPosition(2, 5);

    読み取り専用 TableLayoutPanelCellPosition tlLnLoanPymntsLbl = new TableLayoutPanelCellPosition(0, 6);
    読み取り専用 TableLayoutPanelCellPosition tlLnLoanPymntsCmb = new TableLayoutPanelCellPosition(1, 6);
    読み取り専用 TableLayoutPanelCellPosition tlLnLoanPymntsError = new TableLayoutPanelCellPosition(2, 6);

    読み取り専用 TableLayoutPanelCellPosition tlLnnarrativeLbl = new TableLayoutPanelCellPosition(0, 7);
    読み取り専用 TableLayoutPanelCellPosition tlLnnarrativeTxt = new TableLayoutPanelCellPosition(1, 7);

    読み取り専用 TableLayoutPanelCellPosition tlLngrossLbl = new TableLayoutPanelCellPosition(0, 8);
    読み取り専用 TableLayoutPanelCellPosition tlLngrossTxt = new TableLayoutPanelCellPosition(1, 8);
    読み取り専用 TableLayoutPanelCellPosition tlLngrossError = new TableLayoutPanelCellPosition(2, 8);

    private void cmbTransactionType_SelectedIndexChanged (オブジェクト送信者、EventArgs e)
    {
        ToggleLoanControls(false);
        ToggleCreditCardControls(false);
        ToggleReceiptNumbers();

        if (clsTransactionTypes.TransactionStringToTransactionID(cmbTransactionType.Text) == clsTransactionTypes.LoanPayments || clsTransactionTypes.TransactionStringToTransactionID(cmbTransactionType.Text) == clsTransactionTypes.HpPayment)
             ToggleLoanControls(真);
        それ以外の場合 (clsTransactionTypes.TransactionStringToTransactionID(cmbTransactionType.Text) == clsTransactionTypes.TransferToCreditCardCard)
            ToggleCreditCardControls(真);

        SetupViews(cmbTransactionType.Text);
    }

    private void SetupViews(string transactionTypeSelected)
    {
         if (transactionTypeSelected == "クレジットカードへの支払い")
            SetupCreditCardsLayouts();
        else if(transactionTypeSelected == "HP 支払い" || transactionTypeSelected == "ローン支払い")
            SetupLoanLayouts();
        そうしないと
            SetupStandardLayouts();
    }

    private void SetupLoanLayouts()
    {
        tableBank1Income.SetCellPosition(panelLoans, tlLnLoanCmb);
        tableBank1Income.SetCellPosition(lblLoans, tlLnLoanLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanName, tlLnLoanError);

        tableBank1Income.SetCellPosition(cmbNumberOfLoanPayments, tlLnLoanPymntsCmb);
        tableBank1Income.SetCellPosition(lblLoanPayments, tlLnLoanPymntsLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanPayments, tlLnLoanPymntsError);

        tableBank1Income.SetCellPosition(txtTransactionGross, tlLngrossTxt);
        tableBank1Income.SetCellPosition(lblTransactionAmount, tlLngrossLbl);
        tableBank1Income.SetCellPosition(lblErrorTransactionGross, tlLngrossError);

        tableBank1Income.SetCellPosition(txtTransactionNarrative, tlLnnarrativeTxt);
        tableBank1Income.SetCellPosition(lblTransactionNarrative, tlLnnarrativeLbl);

        tableBank1Income.SetCellPosition(panelCreditCards, tlStdccList);
        tableBank1Income.SetCellPosition(lblCreditCard, tlStdccLbl);
        tableBank1Income.SetCellPosition(lblCCError, tlStdccError);

    }

    private void SetupStandardLayouts()
    {
        tableBank1Income.SetCellPosition(txtTransactionGross, tlStdgrossTxt);
        tableBank1Income.SetCellPosition(lblTransactionAmount, tlStdgrossLbl);
        tableBank1Income.SetCellPosition(lblErrorTransactionGross, tlStdgrossError);

        tableBank1Income.SetCellPosition(txtTransactionNarrative, tlStdnarrativeTxt);
        tableBank1Income.SetCellPosition(lblTransactionNarrative, tlStdnarrativeLbl);

        tableBank1Income.SetCellPosition(txtTransactionGross, tlStdgrossTxt);
        tableBank1Income.SetCellPosition(lblTransactionAmount, tlStdgrossLbl);
        tableBank1Income.SetCellPosition(lblErrorTransactionGross, tlStdgrossError);

        tableBank1Income.SetCellPosition(panelLoans, tlStdLoanLbl);
        tableBank1Income.SetCellPosition(lblLoans, tlStdLoanLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanName, tlStdLoanError);

        tableBank1Income.SetCellPosition(cmbNumberOfLoanPayments, tlStdLoanPymntsCmb);
        tableBank1Income.SetCellPosition(lblLoanPayments, tlStdLoanPymntsLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanPayments, tlStdLoanPymntsError);

        tableBank1Income.SetCellPosition(panelCreditCards, tlStdccList);
        tableBank1Income.SetCellPosition(lblCreditCard, tlStdccLbl);
        tableBank1Income.SetCellPosition(lblCCError, tlStdccError);

        lblCCError.Visible = false;
        lblErrorLoanName.Visible = false;
        lblErrorLoanPayments.Visible = false;
    }

    private void SetupCreditCardsLayouts()
    {
        tableBank1Income.SetCellPosition(panelCreditCards, tlCCccList);
        tableBank1Income.SetCellPosition(lblCreditCard, tlCCccLbl);
        tableBank1Income.SetCellPosition(lblCCError, tlCCccError);

        tableBank1Income.SetCellPosition(txtTransactionGross, tlCCgrossTxt);
        tableBank1Income.SetCellPosition(lblTransactionAmount, tlCCgrossLbl);
        tableBank1Income.SetCellPosition(lblErrorTransactionGross, tlCCgrossError);

        tableBank1Income.SetCellPosition(txtTransactionNarrative, tlCCnarrativeTxt);  
        tableBank1Income.SetCellPosition(lblTransactionNarrative, tlCCnarrativeLbl);

        tableBank1Income.SetCellPosition(panelLoans, tlStdLoanLbl);
        tableBank1Income.SetCellPosition(lblLoans, tlStdLoanLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanName, tlStdLoanError);

        tableBank1Income.SetCellPosition(cmbNumberOfLoanPayments, tlStdLoanPymntsCmb);
        tableBank1Income.SetCellPosition(lblLoanPayments, tlStdLoanPymntsLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanPayments, tlStdLoanPymntsError);

     }

このコードは、不要なコントロールをテーブルの一番下に移動し、必要なコントロールを上に移動することで機能します。そうすれば、テーブルに隙間がなくなります。たとえば、ローン コンボボックスの可視性を単にオンまたはオフにしたくはありません。トランザクション タイプと 2 つの行の説明の間にギャップが生じるからです。とにかくコンパクトにしたい。

現在のシステムの唯一の問題は、下部に非表示のコントロールを含む空の行があることです。また、行を追加するのも困難です。移動を処理するすべてのコードを変更しなければならないからです。

ここまで読んでくれてありがとう。

>ふぅ<

ありがとう

トグル コントロール メソッドはリストされていません。基本的に、可視性を必要としないコントロールのオン/オフを切り替えます。

4

1 に答える 1

1

私はときどき似たような状況に陥り、あまり面倒でないアプローチを好みます。

  1. まず第一に、あなたのスクリーンショットは、最初の列の幅がすでに長いラベル「トランザクション量 (グロス)」で「固定」されているため、1 つの列で十分であることを示しているようです。したがって、1 つの列を削除します。
  2. 各ラベル/テキスト ボックスのペアを独自の (通常の) パネルに配置します。したがって、行ごとに 1 つのパネルです。(左側の「列」の幅は固定されているため、すべてのパネルを同じ幅にして、TextBox を揃えることができます。)
  3. すべてのパネルを TableLayoutPanel に追加します。
  4. TableLayoutPanel のすべての行の高さを「自動サイズ」に設定します。TableLayoutPanel に AutoSize=true および AutoSizeMode=GrowAndShrink を設定します。

フォームのレイアウトを調整するには、9 つ​​のパネルの Visible-property を設定するだけです。パネルが非表示になると、AutoSizing 行のためにテーブル レイアウトの行全体が非表示になり、他の行が上に移動します。新しい行を表示する場合も同様です。したがって、レイアウトは自動化されているため、表示する行を決定するだけで済みます。

また、TableLayoutPanel はコンテンツに合わせて縮小されるようになりました。必要に応じて、含まれているフォームの AutoSize* プロパティをいじってフォームを自動サイズにすることもできますが、この動作でユーザーを悩ませないように注意してください。また、TableLayoutPanel の SizeChanged イベントを処理して、必要に応じてフォームのサイズを調整することもできます。

私の説明が理解できることを願っています。それ以外の場合は、お気軽に詳細をお尋ねください。

于 2011-07-20T19:53:30.017 に答える