2017-01-19 3 views
0

せずに別の形でtexboxにテキストを送ります最初の形式への一つの形態、そのフォームから二番目の形式にプログラムをコピーしたテキストそれは、新しいウィンドウ私は、Windowsフォームのプログラムを作成する必要があり

C)そのフォームからあなたは第二のフォーム上のボタンを押して、プログラムをコピーしたテキスト上のボタン

私はいくつかの異なるaproachesを試してみましたカプセル化の問題で落ち込んでしまった、siどちらのフォームも個別のインスタンスにする必要があります。私はそれを動作させることができたので、クリックするたびにテキストボックスに新しいテキストのフォームの新しいインスタンスが作成されますが、いくつかのステップの後には新しいウィンドウがいっぱいの画面が表示されました。ランタイム。

+0

2番目のウィンドウを初めて作成したときの参照をそのまま使用してください。 – Abion47

+0

[フォーム間の相互作用 - フォームのコントロールを別のフォームから変更する方法](http://stackoverflow.com/a/38769212/3110834) –

答えて

0

その後、staticプロパティを介してそれらにアクセスし、自分のMain方法でウィンドウを作成しますが、すぐには表示されません。Application.Runは、単一のフォーム自体を示しているため

public static class Program { 

    public static Form1 Form1 { get; private set; } 
    public static Form2 Form2 { get; private set; } 

    public static Int32 Main(String[] args) { 

     using(Program.Form1 = new Form1()) 
     using(Program.Form2 = new Form2()) { 

      Application.Run(Program.Form1); // Form1's `Load` method would then show `Form2` 
     } 
     Program.Form1 = Program.Form2 = null; 

     return 0; 
    } 
} 

Form1は(Form2のを示すために責任があります):

public class Form1 : Form { 

    protected override void OnLoad(...) { 

     Program.Form2.Show(); 

    } 

    private void Button1_Click(...) { 

     Program.Form2.TextBox1.Text = this.textBox1.Text; 
    } 
} 

Form2が(あなたは)公共の財産を経由してそのテキストボックスを公開する必要があります。

public class Form2 : Form { 

    public TextBox TextBox1 { get { return this.textBox1; } } 
} 
+0

デフォルトのVisual Studio生成コードに説明を収めなければならなかったが、意図したとおりに動作した変更はほとんどありません。 – Ennoia

+0

@Ennoiaあなたのコードを '.designer.cs'ファイルに置かないでください。それらは上書きされるからです。デザイナー以外のファイルに入れられない理由はありますか? – Dai

+0

Form2を閉じると、Form1のボタンを押してテキストを送信するとどうなりますか? –

0

次に、コンストラクタを使用して、最初のフォームへの参照を2番目のフォームに渡す方法を示す例を示します。その参照はクラスレベルで保存されるため、後で使用することができます。全く同じコード/フォームは両方のインスタンスに使用されている:

public partial class Form1 : Form 
{ 

    private Form1 target = null; 

    public Form1() 
    { 
     InitializeComponent(); 
     this.Text = "Instance #1"; 
     this.target = new Form1(this); 
     this.target.Text = "Instance #2"; 
     this.target.Show(); 
    } 

    public Form1(Form1 target) 
    { 
     InitializeComponent(); 
     this.target = target; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (this.target == null || this.target.IsDisposed) 
     { 
      this.target = new Form1(this); 
      this.target.Show(); 
     } 
     this.target.textBox1.Text = this.textBox1.Text; 
    } 

} 
0

カプセル化問題で泥沼得た、両方の形態は、右別個のインスタンスでなければならないので?

「カプセル化」はすぐにネストされたクラスを考えるようになりました。典型的な使用事例は、クラスを含むクラス以外の場所で使用されない/使用されないクラスのためのものです。

クライアントはForm1をインスタンス化できますが、Form2またはそのメンバーにアクセスすることはできません。 Form2から何かを公開する必要がある場合は、クライアントがForm1からのすべてのものを見るように、Form1のプロパティを記述することをお勧めします。

public class Form1 : Form { 
    protected Form Sibling { get; set; } 

    public Form1() { 
     Sibling = new Form2(this); 
    } 

    protected override void OnLoad(...) { 
     Sibling.Show(); 
    } 

    private void Button1_Click(...) { 
     Sibling.TextBox1.Text = this.textBox1.Text; 
    } 

    protected class Form2 : Form { 
     protected Form Sibling { get; set; } 

     public Form1 (Form mySibling) { 
     Sibling = mySibling; 
     } 

     private void Button1_Click(...) { 
      Sibling.TextBox1.Text = this.textBox1.Text; 
     } 
    } // Form2 
} // Form1 
関連する問題