0

GUI アプリケーションを UserControls に分割し始めました。たくさんのTagePagesを持つTabControlがあります。明らかに、私の MainForm.cs ファイルは大量のイベントやコントロールなどでいっぱいになり、非常に面倒になりました。

以前の質問で、UserControl の作成方法についての洞察が得られました。TabPage ごとに UserControl を作成するつもりですが、メイン フォームまたは他の UserControls でコンポーネントを操作する方法を知りたいと思っていました。

これは、現在選択されている TabPage に応じてボタンを有効または無効にする必要がある UserControl を使用して作成した TabPage の例です。これは適切な使用法ですか、それとももっと良い方法がありますか?

public partial class TabDetails : UserControl
{
    private RequestForm fRequestForm;
    public TabDetails()
    {
        InitializeComponent();
    }

    public void CustomInitialization(RequestForm pRequestForm)
    {
        fRequestForm = pRequestForm;
        pRequestForm.TabControl_Main.SelectedIndexChanged += SelectedTabIndexChanged;
    }

    private void SelectedTabIndexChanged(object pSender, EventArgs pEvents)
    {
        fRequestForm.Button_SubmitRequest.Enabled = fRequestForm.TabControl_Main.SelectedTab != fRequestForm.Tab_Details;
    }
}

MainForm.cs コンストラクターで、次のように呼び出します。

this.tab_Details1.CustomInitialization(this);
4

1 に答える 1

3

これは、ユーザー コントロールの適切な使用法とは思えません。ユーザー コントロールは、ユーザー コントロールで何かが変更されたときのフォーム内の動作を決定するべきではありません。ユーザー コントロールは、そのコンテナーを認識せず、任意のコンテナーで動作する必要があります。

The user control should notify the form that something has changed without telling what's the internal implementation and the form should decide what to do.

Example: A user control named "NameUserControl" consists of TitleComboBox, FirstNameTextBox and LastNameTextBox. The user control wants to notify when one of the values has changed.

Wrong Way:

Create events:

TitleComboBox - SelectedIndexChanged. FirstNameTextBox, LastNameTextBox - TextChanged.

The problems here:

  1. You expose the internal controls behavior. What will happen if you want to change the TitleComboBox to TextBox? You'll have to change the event name and implementation.
  2. 正確に 3 つの異なるコントロールを使用しているという事実を公開します。姓と名に同じテキスト ボックスを使用するとどうなりますか? 1 つの予定を削除し、もう 1 つの予定の名前を変更する必要があります。

良い方法:

NameChangedという 1 つのイベントのみを作成し、FullName の 1 つのプロパティまたは値の 3 つの異なるプロパティを公開します。

どちらの方法でも、フォームはイベントをサブスクライブし、次に何をするかを決定します。

もう 1 つ考慮すべきことがあります。ユーザー コントロールに機能を追加すればするほど、再利用性が低下するか、コードが複雑になります。たとえば、ユーザー コントロール内にバリデーションを追加すると、バリデーションなしで必要になる日が来るので、「bool ValidateData」プロパティを追加するか、非常に複雑になり、別のプロパティを作成する必要があります。コントロール。これを解決する 1 つの方法は、非常に小さなユーザー コントロールを構築することですが、現在のすべてのニーズに適合する 1 つまたは複数の大きなユーザー コントロールにそれらを組み合わせます。

于 2012-09-05T14:57:44.747 に答える