1

私は C# が初めてで、別のクラスからフォームを編集する方法を理解しようとしています。フォームは、次のように、デフォルトの VS アプローチによって作成されます。

static void Main()
{
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(new Form1());
}

Form1 にある label1 フィールドを更新する方法のテストとして、Form1.cs ファイルにメソッドを作成しました。メソッドは次のとおりです。

public void UpdateLabel(string state = "Changed Text")
{
  label1.Text = state;
}

私が抱えている問題は、Application.Run コマンドが Form1 型の名前付きオブジェクトを提供しないことです。したがって、Program.cs から UpdateLabel メソッドをトリガーする場合は、次のようにします。

XXX.UpdateLabel();

フォームにアクセスするためのオブジェクトがありません。フォームを手動で作成していた場合、これでうまくいくと思います。

Form1 myForm = new Form1();
myForm.UpdateLabel();

Windows フォーム アプリケーションが提供する Application.Run(Form1) を使用して、作成中のフォーム オブジェクトにアクセスするにはどうすればよいですか? また、これはこの種の問題に対して私が取るべきアプローチですか、それともより良い方法がありますか?

4

4 に答える 4

2

次の方法で当面の問題を修正できます。

Form1 form = new Form1());

form.UpdateLabel();

Application.Run(form);

2番目の質問に関しては、それはあなたが最終的に何を達成しようとしているのかによります。

于 2012-10-15T14:16:48.113 に答える
2

さて、最後の例をこのように統合できます....

static void Main() 
{ 
  Application.EnableVisualStyles(); 
  Application.SetCompatibleTextRenderingDefault(false); 
  Form1 myForm = new Form1();
  myForm.UpdateLabel();
  Application.Run(myForm); 
} 

しかし、私はあなたに尋ねさせてください:なぜあなたのロジックは Form1 コンストラクターの外でこれを行うように指示するのですか?

public Form1()
{
    InitializeComponents();
    label1.Text = "Changed Text";
}

編集:以下のコメントに従って、次のようなことに取り組むべきだと思います:

MyApplicationCode appCode;

public Form1()
{
    InitializeComponents();
    appCode = new MyApplicationCode();

    this.Text = appCode.GetFormText();
    label1.Text = appCode.GetLabelText();
    cmdSave.Enabled = appCode.UserHasSavePermission();
    ...... // and so on for other decisions on 

}
于 2012-10-15T14:15:09.677 に答える
1

したがって、フォーム内のいくつかのコントロールの初期値を決定するために使用されるかなり複雑なロジックがあります。そのロジックは複雑であるため、そのコードを の定義から抽出し、Form1別のクラスに移動することをお勧めします。これまでのところ、それはすべて良いことです。

他のクラスを作成し、そのクラスをForm1 使用して、に値を提供することができますForm1。a を持つ他のクラスを持つのではなく(これは、コードをにForm1配置する効果になります) 、その他のクラスを持つ必要があります。MainForm1

これを実装するのはかなり簡単です。別のクラスを作成し、文字列を返すインスタンスまたは静的メソッドをそれに与えます。 Form1静的メソッドを呼び出すか、クラスのインスタンスを作成してインスタンス メソッドを呼び出します。次に、そのメソッドの結果に基づいてラベルを設定します。

于 2012-10-15T14:40:11.920 に答える
0

Application.Run は通常、アプリケーションが閉じるまで WinForms アプリケーションを起動するために使用されます。Program.cs クラスのどの関数が UpdateLabel を呼び出すことになっていますか? アプリケーションは、ラベル値パラメーターを使用して外部で起動されていますか?

于 2012-10-15T14:15:19.783 に答える