-3

Form1VB と C# の両方で無効にしようとしています。

作成された子フォームの例、ボタン クリックまたは w/e

  • VB.NET

    Me.Focus()
    Me.Enabled = True
    Form1.Enabled = False
    
  • C#

      //This is my attempt at a functional translation
      //if (_form1 == null)
      //        _form1 = new Form1();
      //    _form1.Enabled = False;
    
     //This is a literal translation
     // This Code will not disable form1
     this.Focus();
     this.Enabled = true;
     Form1.Enabled = false;
    

C# コードはForm1、VB.NET コードのように form2 を無効にしません。

これらの C# リファレンスから、上記のコメント付きのコードが機能することを収集しました (VB.net での使用方法を知っていました): Ref1Ref2Ref3

私が知りたいのは

  • VB のように (Form2 から) Form1 にアクセスできないのはなぜですか?
  • Form1 に完全にアクセスするには、他にどのような手順が必要ですか?
4

1 に答える 1

3

VB コードは、既定のフォーム インスタンスの機能を利用しています。

(VB.NET の場合) 各 Form クラスには、フォーム自体と同じ型の静的変数が舞台裏で与えられ、新しいフォームが作成されると、その静的変数の値として自身を設定します。その変数は、その型の既定の静的プロパティでもあります (VB にはあり、C# にはない別の機能です)。これが、型名を使用してこのプロパティに直接アクセスできる理由です。厳密にはもはや意味をなさないという事実にもかかわらず、なぜこの機能がまだ VB に存在するのかについては、少し歴史についてこの関連する質問を見ることができます。

C# でこの動作をほぼ複製し、静的プロパティを自分で作成して手動で設定/クリアする方法がありますが、そうしないことを強くお勧めします。この一般的な概念はあまり適切ではないため、C# ではこの機能が意図的に省略されています。

使用するフォームの一部がたまたま 1 回しか存在しない場合でも、フォームのインスタンスは概念的に 1 つだけではありません。

より好ましい方法は、最初のフォームがサブスクライブする 2 番目のフォームでイベントを作成することです。(または、適切な場合は既存のイベントを使用します)。この場合Enabled、子フォームが Enabled を true に設定するたびに親フォームを false に設定したい場合は、既存のイベントを使用してこれを行うことができます。

親内から子フォームを作成するときは、EnableChangedイベントを使用して、子のアクションに基づいて親のプロパティを変更します。

Form2 child = new Form2();
child.EnabledChanged += (s, args) => Enabled = !child.Enabled;

次に、子フォームは親について何も知る必要はありません。これは、デザインの観点から素晴らしいことです。結合を減らし、モジュール性を向上させます。子フォームの開発者は、親フォームや親フォームが何をする必要があるかについて何も知る必要はありません。子フォームは、誰もがそれをどのように使用したいかを知り、必要な機能を提供する必要があるだけです。

于 2013-09-19T19:41:01.797 に答える