0

フォームにダイアログが表示されると、右クリック メニュー オプションまたはメニュー コマンドのいずれかから、2 つの異なるコール スタックから開くことができます。そして、それらは異なります (1 つは新しいレポート フィールドを作成し、もう 1 つは現在のレポート フィールドのプロパティを表示します) したがって、そのフォームのフィールドに入力するデータは異なりますが、どこかで共通の方法も使用しています。 . そのため、情報をメソッドに渡すPopulateFields()方法が必要だったので、メソッドがプロパティ ウィンドウの右クリックから呼び出されたのか、それとも [挿入] メニュー オプションから呼び出されたのかがわかります。

したがって、最下位レベルのクラスでは、このようなパブリック列挙を作成して、どこから呼び出されているかを把握しているので、最後に、どこから来たのPopulateFields()かに応じてフィールドにデータを入力する方法を知っています。コールスタックがさまざまなクラスに移動することがわかりますそのため、列挙型をパブリックとして定義する必要がありました。パブリックグローバル変数ですか?うーん!それは私が変更したいことなので、もう公開しません。より良い解決策は何ですか?そのクラスで定義する代わりに、この列挙型用に別のクラスを作成できますか? そのほうがいいですか?

public enum FieldDialogSource
{
    FromPropertiesWindow,
    FromInsertMenu
}

public FieldDialogSource FieldDialogLaunchSource { get; set; }

MyLibrary.FieldDlgController.PopulateFields()
MyLibrary.frmMyForm.Init()
MyLibrary.frmMyForm.ShowForm()
MyLibrary.FieldDlgController.ShowForm()
MyLibrary.Controller.FiledProperties()
4

1 に答える 1

2

フォームクラス内で列挙を定義できます(フォームに属しているため)

一方、フォームが「どこから」開かれたかを伝えることは、良い習慣とは見なされない場合があります。ユーザーが右クリックを使用して別の状態でフォームを開くことを突然許可した場合、またはフォームを開くために 3 番目のソースを追加する必要がある場合 (2 つの既存の状態のいずれか)...

おそらく、コンストラクターをオーバーロードできます。

  • パラメーターなしのコンストラクター: フォームを「作成モード」で開く必要があります。
  • データを含むコンストラクター: フォームを「表示モード」で開き、プロパティを表示します。

列挙型とプロパティをフォームでプライベートとして引き続き使用できるため、すべてのメソッドがどのコンストラクターが呼び出されたか (したがって、新しいレポートを作成しているか既存のレポートを表示しているか) をすべての時点で認識できます)
。この列挙型は、次のように定義できます。 (例えば):

private enum FormState
{
    Insert,
    ViewData
} 

これは、「ソース」よりも一般的です。

于 2012-09-21T14:23:41.650 に答える