4

私はC#にかなり慣れていませんが、この時点まではすべてうまくいきました。

フォームとほとんどの作業を行うクラス (非静的およびプログラム部分) から始めます。フォーム 1 のクラスのオブジェクトをインスタンス化し、ログインします。

次に、次のフォーム form2 に切り替えます。実際、クラスはそれを行います。そこに次の行を含むメソッドがあります。

this.f2 = new Form2();

その後:

f2.Show();

f2 は Form2 型のクラス メンバーであり、この時点まではすべて正常に動作します。

この Form2 は、ネットワーク イベントを表示したい大きなテキスト ボックスだけで構成されています。イベント ハンドラーは問題なく動作しますが、フォームへの参照は機能していないようです。私が行った場合

f2.tetBox1.Text = "Some text";

テキスト ボックス内のテキストは変更されません。

ここで何が間違っていますか?

ここに私がやっていることのより詳細な説明があります:

Form1myProgのインスタンスである にログイン情報を渡しますMyClass。ログインが成功した場合、Form1 は呼び出しますmyProg.makeForm();

MyClass のメソッドは次のようになります。

public void makeForm() {
            this.f2 = new Form2();
            f2.Show();
            this.sendString("start f2");
}

これはMyClass.sendString()次のとおりです。

private void sendString(string text) {
            SystemSounds.Beep.Play();
            this.f2.setTextBox(text);
}

setTextBox()ご覧のとおり、これはofを呼び出しますForm2- ここで提案されているように実装しました。奇妙なことに、ここまではすべてうまく機能しています。Form2 には、textBox1 に "start f2" が含まれていることが示されます - 期待どおりです。しかし、イベントが発生しても、textBox1 のテキストは変化しません。ビープ音が問題なく再生されるため、sendString() メソッドが問題なく呼び出されます。

私が観察したことの1つは、ビープラインが の呼び出しの後に配置されている this.f2.setTextBox(text);場合、メソッドがイベントハンドラーから呼び出された場合に再生されません。

f2、ところで、はの非公開メンバーですMyClass:

private Form2 f2;
4

2 に答える 2

3

デザイナーによって作成されたコントロール (デザイン時にツールボックスからドロップされたものなど) は、自動的に非公開として設定されます。したがって、別のフォームからアクセスすることはできません。

代わりに、デザイナーをいじりたくない -Form2からテキストボックスのテキストを変更できるようにするプロパティを作成しますForm1

短い例は次のようなものです。

フォーム2:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }


    // When modifying the Text property it will change the text in textbox1
    public string Text
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }
}

次に、Form1 で:

Form2 frm2 = new Form2();
frm2.Text = "123"; // Uses the public Text property declared in Form2
frm2.Show();
于 2013-03-03T22:49:02.790 に答える
0

デザイナを介してテキスト ボックスを配置すると、デフォルトでテキスト ボックスは非公開になります。つまり、Form2 の外部から textBox1 にアクセスすることはできません (Form2 クラス内のコードに対してのみ「表示」されます)。テキストボックスを internal または public に変更できます(これにより、(Form1 から) 次のことが可能になります):

f2.tetBox1.Text = "Some text";

しかし、それはForm2だけが本当に知っているべき Form2 の部分を公開することになるでしょう...だから、それは最もクリーンな解決策ではありません (おそらく最も速いでしょう))

より良い解決策は、テキスト値を設定するメソッドまたはプロパティ (内部またはパブリック) を Form2 に作成することです。例えば:

internal  void SetText(string value)
{
   textBox1.Text = value;
}

メソッド (またはプロパティ) は Form2 に存在するため、テキスト ボックスにアクセスできるため、textBox1 がまだ非公開である間に値を設定できます。

このメソッドを「外部」コードに公開する方が (テキストボックスを可視化するのではなく)、テキストを変更することしかできないため、安全です。一方、テキストボックス全体を公開すると、呼び出し元が背景色などを変更しようとする可能性があります

于 2013-03-03T22:49:34.457 に答える