[英]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。 請考慮, :)
//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; }
您還可以擁有一個類文件,其中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.