6

ドラッグアンドドロップでコントロールを作成すると、VSは次のようなコードを自動的に生成します。

public System.Windows.Forms.Label label1;

そのコントロールの修飾子を静的に変更したい場合は、Form1.Designer.csに移動し、次のように編集します。

public static System.Windows.Forms.Label label1;

大丈夫です。しかし、すべてのコントロールを変更すると、VSは自動的にそれをoriginに変更します:(。では、コントロールの変更を静的に変更するにはどうすればよいですか?

すみません、英語が苦手です:(


コメントからのコード:

public static void setLabelInfoVisible(bool visible) 
{ 
   if (Form1.labelInfo.InvokeRequired) 
   { 
      setLabelInfoVisibleDelegate del =
         new setLabelInfoVisibleDelegate(setLabelInfoVisible);
      Form1.labelInfo.Invoke(del, new object[] { visible }); 
   } 
   else 
   { 
     Form1.labelInfo.Visible = visible; 
   } 
}
4

7 に答える 7

7

実際の問題は別の問題のようです。別のスレッドからのコントロールの更新です。これは静的制御によって達成されるべきではありません!

これらの関連する質問はあなたの問題を解決するはずです:

C#の別のスレッドからGUIのテキストボックスを更新する方法

C#の別のスレッドからGUIを更新するにはどうすればよいですか?

于 2010-01-11T12:07:25.990 に答える
4

デザイナコードは、デザイナでフォームに変更を加えるたびにVisual Studioによって再記述されるため、ユーザーが変更することは想定されていません(発見したとおり)。

制御宣言と初期化をデザイナー以外のコードファイルに移動する1つの方法。ただし、これは、コントロールがデザイナに表示されなくなることを意味します。

編集: これは、コントロールを他のスレッドからアクセスできるようにする方法ではありません!コントロールを静的にする正当な理由を考えることはできません。

于 2010-01-11T11:48:17.090 に答える
4

ウェイン、

  1. いいえ、コントロールを静的にしたくありません。あなたがそう思う理由を説明してください。私たちはより良い選択肢が何であるかを見つけることができます。

  2. *.Designer.csファイルで編集しないでください。ツール(フォーム/データセット/ ...デザイナー)には、すべてを上書きする権利があります。

編集:

解決すべき2つの問題があります。

  1. 別のクラスからコントロールにアクセスする。これは、インスタンス参照を他のクラスに渡すことによって実行する必要があります。何かのようなもの:
    void Form1_Load(..) { otherObject.Form = this; }

  2. コントロールフォームを使用して別のスレッドを作成します。これを直接行うことはできません。常にControl.Invoke()を使用してください。Divoには2つの便利なリンクがリストされています。

于 2010-01-11T11:52:23.570 に答える
2

自動生成されたデザイナーコードから、ファイルからコードに定義を移動する必要があり Form.Designer.csますForm.cs

于 2010-01-11T11:48:45.480 に答える
0

おそらく、問題のコントロールを継承する新しいクラスを作成し、それにシングルトンパターンを適用することができます。

そうすれば、グローバルな(スレッドセーフな)アクセスポイントが得られます。

于 2010-01-11T15:48:05.127 に答える
0

使用方法の例を次に示します。

Label label1 = Application.OpenForms["Form1"].Controls["label1"] as Label;
于 2020-10-11T16:28:56.597 に答える
0

私が見つけた最良の方法は、上記とは逆のことをすることです。コントロールを静的にするなどの理由を説明していませんが、悪いことです。これはあなたの質問を解決するために投稿する必要があることを意味します。これはあなたが答えたい質問であり、ただ言われるだけの質問ではないからです...なぜ...またはしないでください...そのような理由もなく、答えませんあなたの質問。下記を参照してください。

コントロールが作成されると、そのフォームのdesigner.csのボタンで新しいプライベートに作成されたコントロールコードを見つけることができます。終わりに近づいているはずですが、例えばボタンを作るとこんな感じになります。

"#endregion

    Private Button button1;"

これを次のように変更すると...

"#endregion

    public static Button button1; "

デザイナ内のthis.button1を参照するすべての制御コードが赤でエラーになっていることに気付くでしょう。「これ」は削除できます。それぞれに、行くのは良いでしょう。

別のクラスで参照するには、上記の名前空間を使用していることを確認してください。

mainformを使用する

次に、クラスコードで、ボタンを次のように参照できます。

mainform.button1.text = "blah";

于 2020-12-16T23:01:08.087 に答える