簡體   English   中英

從打開的窗體C#傳遞變量

[英]Pass a variable from an open form C#

我有兩種形式,Form1和Form2。 Form1具有變量int x。 執行該程序時,將隱藏Form1,並顯示Form2。 但是我需要從現有的Form1調用變量。

我知道通過調用Form1的新實例來調用變量的方法。

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

但是我想知道如何對已經打開的Form1進行操作。

請采取幾種情況,例如是否有幾種形式(Form2,Form3,Form4等)從Form1調用多個變量。 表單可以從Form1調用任何變量。 此外,表單可以從其他表單中調用變量(例如,如果打開了Form1和Form2,則Form3可以從Form1 AND Form2中調用變量)

我知道它的清單很大,但是如果有人能找到實現它的好方法,我將不勝感激。

您將必須引用“已經打開的” form1實例,以便可以引用該表單上的x值。

因此,可以說Form2實例化了隱藏的form1。 您必須在form2中有一個對form1的引用,才能引用該變量。

好,可以說這是form2的代碼

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

    private void Form2_Load(object sender, EventArgs e)
    {
        f = new Form1
                {
                    Visible = false
                };
        int x = f.X;
    }
}

然后為form1編碼

public partial class Form1 : Form
{
    public int X { get; set; }

    public Form1()
    {
        InitializeComponent();
        X = 20;
    }
}

並且您需要確保從程序類插入的表單是

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form2());
    }
}

在窗體本身上創建一個公共屬性。 讓get訪問器返回表單值。 您可以這樣稱呼它。 Form1.MyProperty;

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

編輯:

如果一次要返回的值太多,則可以返回所有這些值的字典。 如果您填寫了20-40個值,我將認真考慮重新考慮您的表格。 對我來說,這聽起來像是糟糕的用戶體驗。

無論打開還是關閉表單都沒有關系。 您的最終目標是從Form2中的Form1訪問成員,不是嗎? 如果是這種情況,則在創建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;}

     }

我認為有一個原因您不會嘗試從Project菜單-> Visual Studio中的Properties訪問System.Properties.Settings.Default

謝謝...

我的猜測是您正在尋找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.
}

}

您可以按照以下方式進行操作,

在我的情況下,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 ,以便您可以在form2上使用該實例來引用form1's屬性。

讓我知道,如果它不能解決您的問題。

希望對您有幫助。 :)

讓我們看一下情況。您的應用程序中有多種形式,您想訪問這些形式的幾個變量。

我的猜測是

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

因此,您可以在項目的任何地方訪問變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM