0

Form1 と Form2 の 2 つのフォームがあります。Form1 には変数 int x があります。プログラムが実行されると、Form1 が非表示になり、Form2 が表示されます。ただし、既存の Form1 から変数を呼び出す必要があります。

Form1 の新しいインスタンスを呼び出して変数を呼び出す方法を知っています。

     Form1 r = new Form1();
     r.x = 20;

しかし、既に開いている Form1 に対してそれを行う方法を知りたいです。

Form1 から複数のフォーム (Form2、Form3、Form4 など) によって呼び出される複数の変数がある場合など、いくつかのケースを取り上げます。フォームは Form1 から任意の変数を呼び出すことができます。また、フォームは他のフォームから変数を呼び出すことができます (Form1 と Form2 が開いている場合、Form3 は Form1 と Form2 から変数を呼び出すことができます)。

私はその巨大なリストを知っていますが、誰かがそれを実装する良い方法を見つけることができれば本当に感謝しています.

4

7 に答える 7

1

次の方法でそれを行うことができます。

私の場合、form1 は form4 で、form2 は form5 です。考えてください、 :)

  1.  //code on form4:
    
    // this is by passing the reference of the form to other form
    public partial class Form4 : Form
    
    {
    
    public int a { get; set; }
    public int b { get; set; }
    
    public Form4()
    {
        InitializeComponent();
    }
    
    private void Form4_Load(object sender, EventArgs e)
    {
    
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        a = 5;
        b = 6;
    
        Form5 frm5 = new Form5();
    
        frm5.frm4 = this;
    
        this.Close();
    
        frm5.Show();
    }
     }
    
    // code on form5
    
    public Form4 frm4 { get; set; }
    
    private void Form5_Load(object sender, EventArgs e)
    {
        int x = frm4.a;
        int y = frm4.b;
    }
    
  2. form1また、 のインスタンスがとなるクラス ファイルを作成して、そのインスタンスを使用してプロパティを参照staticできるようにすることもできます。form2form1's

問題が解決しない場合はお知らせください。

お役に立てば幸いです。:)

于 2013-06-19T05:54:20.410 に答える
1

フォーム自体にパブリック プロパティを作成します。get アクセサーがフォーム値を返すようにします。このように呼び出すことができます。Form1.MyProperty;

public string MyPrperty {
  get {
      return Form1.txtExample.text;
  }
}

編集:

一度に多くの値を返す場合は、これらすべての値の辞書を返すことができます。20 ~ 40 個の値が入力されている場合は、フォームを再考することを真剣に検討します。それは私には貧弱なユーザーエクスペリエンスのように思えます.

于 2013-06-19T04:59:45.740 に答える
0

状況を見てみましょう。アプリケーションに複数のフォームがあり、これらのフォームのいくつかの変数にアクセスしたいとします。

私の推測では、

public static class GlobalVariables
{
    public static object MyVariable1 { get; set; }
    public static object MyVariable2 { get; set; }
}

したがって、プロジェクトのどこからでも変数にアクセスできます。

于 2013-06-19T14:40:50.810 に答える
0

どちらのフォームが開いているか閉じているかは問題ではありません。最終的な目標は、Form1 のメンバーに Form2 でアクセスすることですよね? Form2 のインスタンスを作成するときにその場合は、次のようにします。

    Form1 objForm1 = new Form1();
    Form2 obj = new Form2(objForm1);

フォーム2のクラスは次のようになります

    class Form2: Form
    {
         private Form1 form1Object;
         public Form2(Form1 obj)
         {
              form1Object = obj;
         }

         private void SomeMethodInForm2()
         {
              //Here you can access the variable in form1 like
              form1Object.PropertyNameYouWantToAccess;
         }
     }

フォーム 1 クラスは次のようになります。

     class Form1: Form
    {
         public int PropertyNameYouWantToAccess{get;}

     }
于 2013-06-19T05:06:04.867 に答える
0

私の推測では、開いているすべてのフォームを配列に保持するSystem.Windows.Forms.Application.OpenFormsプロパティを探していると思います。

あなたがする必要があるのは、各フォームのタイプをチェックし、それがForm1変数の値にアクセスすることと同等かどうかを確認することです。また、フォーム外の変数にアクセスするには、アクセス修飾子をいずれかに設定するかPublic、対応するプロパティを作成する必要があります。

編集

サンプルコードは次のとおりです: (未テスト)

public partial class Form1 : Form
{

public int X;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    X = 100;

    Form2 frm = new Form2();
    frm.Show();

    this.Hide();
}  
}



public partial class Form2 : Form
{

int local_X = 0;

public Form2()
{
    InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
   foreach(Form f in System.Windows.Forms.Application.OpenForms)
   {
      if(typeof(f) == typeof(Form1))
    {
       local_X = f.X;   // access value here and set in local variable
    }
   }
}

private void button1_Click(object sender, EventArgs e)
{
   MessageBox.Show("Value of X is : " + local_X); // Show alert for value of variable on button click
}

}

編集

または、コンストラクターのオーバーロードを使用して、このタスクを実行できます。

public partial class Form1 : Form
{

public int X;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    X = 100;

    Form2 frm = new Form2(x); // pass variable to form2, if multiple values pass int array
    frm.Show();

    this.Hide();
}  
}



public partial class Form2 : Form
{

int local_X = 0;

public Form2()
{
    InitializeComponent();
}

// Overloading of constructor
public Form2(int X) // if multiple values pass int array
{
    InitializeComponent();
    local_X = x;  // capture value from constructor in class variable.
}

private void Form2_Load(object sender, EventArgs e)
{
   // no need to iterate here for now due to overloading value get passed during initialization.
}

private void button1_Click(object sender, EventArgs e)
{
   MessageBox.Show("Value of X is : " + local_X);  // display value if alert box.
}

}
于 2013-06-19T05:32:09.700 に答える
0

プロジェクトメニューからアクセスしようとしない理由があると思いSystem.Properties.Settings.Default ます->ビジュアルスタジオのプロパティ...

ありがとう...

于 2013-06-19T05:16:07.227 に答える