我有form1,form2和一个类。我想使用form2来修改类中的变量,然后在form1中读取该变量。
当我尝试从form1读取变量时,变量不会改变,也不会在我再次打开form2之后停留。
这是我的代码:
Form1中
namespace app1 {
public partial class Form1 : Form {
Class1 md = new Class1();
public Form1() {
InitializeComponent();
}
private void loginToolStripMenuItem_Click(object sender, EventArgs e) {
Login login = new Login();
login.MdiParent = this;
login.enbctrs += new ShowFrm(enablecrts);
login.disctrs += new ShowFrm(disablecrts);
login.Show();
}
private void Form1_Load(object sender, EventArgs e) {
if (md.user == null) {
disablecrts();
stat_usr.Text = "No active user";
} else {
stat_usr.Text = md.user.ToString();
}
}
void disablecrts() {
stat_usr.Text = "No active user";
}
void enablecrts() {
stat_usr.Text = md.user;
}
}}
窗体2
namespace app1.Forms {
public delegate void ShowFrm();
public partial class Login : Form {
public event ShowFrm enbctrs;
public event ShowFrm disctrs;
int ing_counter = 0;
Class1 md = new Class1();
public Login() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
string u = "user";
string p = "pass";
if(Txt_user.Text == u && Txt_pass.Text == p) {
string msg = "Welcome: " + u + "";
MessageBox.Show(msg, "", MessageBoxButtons.OK);
md.changeusr(u);
active_user.Text = md.user.ToString();
enbctrs();
}
private void Login_Load(object sender, EventArgs e) {
if (md.user == null) {
active_user.Text = "No active user";
} else {
active_user.Text = md.user.ToString();
}
}
}}
的Class1
namespace app1.Modules {
class Class1 {
public string user;
public void changeusr(string u) {
user = u;
return;
}
}}
答案 0 :(得分:1)
您的代码中有许多内容可以改进。但主要问题是,当您在Login
方法中创建loginToolStripMenuItem_Click()
类时,新的Login
实例也会创建Class1
的新实例,并使用该实例代替您Form1
知道的实例。因此,当Login
更改用户值时,它会在Form1
无法了解的位置更改用户值。
最简单的解决方法是,Form1
只需将Class1
引用传递给Login
即可使用,而不是让Login
创建自己的实例。例如:
public partial class Login : Form {
// ...
readonly Class1 md;
public Login(Class1 md) {
InitializeComponent();
this.md = md;
}
// ...
}
在Form1
:
private void loginToolStripMenuItem_Click(object sender, EventArgs e) {
Login login = new Login(md);
login.MdiParent = this;
login.enbctrs += new ShowFrm(enablecrts);
login.disctrs += new ShowFrm(disablecrts);
login.Show();
}
然后当Login
更改用户并引发事件时,它会更改Form1
正在使用的同一实例中的值,因此Form1
将在其中获得所需的值自己的代码。
答案 1 :(得分:-1)
public static class global{
public static int myInt = 0;
}
public class Form1{
global.myInt = 10;
}
public class Form2{
Console.WriteLine(global.myInt.ToString());
}