如何窗体间传递变量的值? 现有form1和form2,在form1中定义了变量A,并且A的值来自于数据库中不同遍历条件所获取的数据。如何在form2中引用A的值呢?C#中没有了全局变量,想了好几个办法都行不通,望指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在FORM2构造函数里面传值呀 你的FORM1应该是个主窗体吧 在FORM1 NEW FORM2的时候把A的值传递过去! form1不是主窗体。我是form1中点击确定后show form2的,但2个form之间并无关联。 form2 form2=new form2(你要传递的值) form2 form2=new form2(你要传递的值)是不是哪里打错了? 最简单的方法就是定义一个全局静态变量,使用方法就像asp.net中的session。比如定义一个string: public static int flag=1; 那么你在整个application里面都可以调用到flag来保存你要的int值 说错了 应该是比如定义一个全局变量int 手误 这里面没有错, 你在FORM2里面定义个构造函数。看你要传什么类型的变量。然后在FORM1里面Form2 form2=new Form2(你要传递的值) 括号里面就是你要传递的值 首先,我写的是winform。其次,我要传递的必须是一个string 变量呀。最后,这个变量A的取值是随时变的,不是固定的。并不是传递初始值就算了呀。 或者我把我的2个form的代码贴出来,麻烦大家帮下忙,谢谢! 第一个form:public partial class kaitai : Form { public kaitai() { InitializeComponent(); } public void button1_Click(object sender, EventArgs e) { string Cnum = ""; foreach (DataGridViewRow row in dataGridView1.Rows) { if (Convert.ToBoolean(row.Cells[0].Value)) { Cnum =(row.Cells[1].Value.ToString()); } } string Afile = "provider=Microsoft.Jet.OleDb.4.0;Data Source=1.mdb"; OleDbConnection AconnStr = new OleDbConnection(Afile); OleDbCommand Icmd = new OleDbCommand("update TableUSE set A='C' where AA='" + Cnum + "'", AconnStr); AconnStr.Open(); int ExeNum = Icmd.ExecuteNonQuery(); AconnStr.Close(); this.Hide(); addfood.Show(); } }第二个form: public partial class addfood : Form { public addfood() { InitializeComponent(); } private void textBox1_TextChanged(object sender, EventArgs e) { 我是希望把第一个form的Cnum变量的值传递到textbox1这里,并在界面上显示出来。 } } 有一个简单的方法就是在项目里建一个公共类,里面定义公共静态变量,把一个窗口处理出来的数值保存到静态变量,然后另外一个窗口要用的时候直接用静态变量就可以了静态变量也不用new,直接类名.变量名就可以用了 在项目中添加一个类public static class 类名(){ public static string 变量名;}第一个form中在if (Convert.ToBoolean(row.Cells[0].Value)) { Cnum =(row.Cells[1].Value.ToString()); } 添加代码,变为如下if (Convert.ToBoolean(row.Cells[0].Value)) { Cnum =(row.Cells[1].Value.ToString()); 类名.变量名=Cnum;} 第二个form中在 private void textBox1_TextChanged(object sender, EventArgs e) { 我是希望把第一个form的Cnum变量的值传递到textbox1这里,并在界面上显示出来。 } 添加代码,变为如下 private void textBox1_TextChanged(object sender, EventArgs e) { textBox1.Text=类名.变量名; } 感谢14楼的朋友,效果是差不多实现了,不过有一个小问题,就是在form2打开的时候,textbos里并不会马上就显示出Cnum的值,而需要在上面随便按一下键盘才会显示,这是什么问题呢? 那是你的方法有问题,不应该是textBox1的TextChanged事件而应该是form2的load事件private void form2_load(object sender, EventArgs e) { textBox1.Text=类名.变量名; } 给你几个可行的方法:1、定向传递,Form1声明一个public或者internal(要求同一个namespace)变量,在form2创建之后直接使用form1的这个变量,这样就可以把form1的这个值传到form2里面去。方法1最简单,也最不推荐,可能会存在安全问题,比如form2访问该变量的时候,该变量并没有准备好,关键是破坏了OOP语言模式。2、使用观察者模式,让form2去观察form1,自己去查设计模式,有的是例子,C#的话,实现Observer类或者实现ObserverCollection接口。3、C#的话使用反射技术进行数据绑定,绑定的就是这个要传递的值,这本身也是观察者模式的一种实现,只不过内部机制被C#语言帮你实现了。4、C#的话,让类实现INotifiyValueChanged接口。5、form1和form2之间实现消息循环,这是最基本的win32平台思想。方法5灵活,关键是比起前几种方法,不仅可以实现同步传递,更可以实现异步通信,对于并行线程很有效。就这几个应该够你用的了。就提示到这里,我觉得已经说得很明白了。具体的自己查,不会自己查的人不要再去编程了,或者本来你这些都了解,只是一时想不起来用它们,提示到此。 终于解决问题了。。学到了不少东西,谢谢lenheat! repeat 嵌套treeview 控件 有的树 不能展开 关于c#多线程对特定cpu的操作 Process调用外部setup.exe进行安装,如何得知该程序安装成功了还是被终止了? 关于用timer做的时间提醒的问题? 请教一个调用Marshal.StructureToPtr方法的问题 BackgroundWorker 正忙错误 笨熊问题,刚接触web form,数据库连接的问题,在线等!!!!谢谢!!!! DataView问题求助!! 请给出个用c#实现tftp的代码或站点。 <FOO>标记的意义是什么? C#下播放 恳请高手帮我解答这个正则表达式的问题
比如定义一个string: public static int flag=1;
那么你在整个application里面都可以调用到flag来保存你要的int值
这里面没有错, 你在FORM2里面定义个构造函数。看你要传什么类型的变量。然后在FORM1里面
Form2 form2=new Form2(你要传递的值)
括号里面就是你要传递的值
其次,我要传递的必须是一个string 变量呀。
最后,这个变量A的取值是随时变的,不是固定的。并不是传递初始值就算了呀。
{
public kaitai()
{
InitializeComponent();
}
public void button1_Click(object sender, EventArgs e)
{
string Cnum = "";
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(row.Cells[0].Value))
{
Cnum =(row.Cells[1].Value.ToString());
}
}
string Afile = "provider=Microsoft.Jet.OleDb.4.0;Data Source=1.mdb";
OleDbConnection AconnStr = new OleDbConnection(Afile);
OleDbCommand Icmd = new OleDbCommand("update TableUSE set A='C' where AA='" + Cnum + "'", AconnStr);
AconnStr.Open();
int ExeNum = Icmd.ExecuteNonQuery();
AconnStr.Close();
this.Hide();
addfood.Show();
}
}第二个form: public partial class addfood : Form
{
public addfood()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
我是希望把第一个form的Cnum变量的值传递到textbox1这里,并在界面上显示出来。
}
}
静态变量也不用new,直接类名.变量名就可以用了
public static class 类名()
{
public static string 变量名;
}第一个form中在
if (Convert.ToBoolean(row.Cells[0].Value))
{
Cnum =(row.Cells[1].Value.ToString());
}
添加代码,变为如下
if (Convert.ToBoolean(row.Cells[0].Value))
{
Cnum =(row.Cells[1].Value.ToString());
类名.变量名=Cnum;
} 第二个form中在
private void textBox1_TextChanged(object sender, EventArgs e)
{
我是希望把第一个form的Cnum变量的值传递到textbox1这里,并在界面上显示出来。
}
添加代码,变为如下
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox1.Text=类名.变量名;
}
而应该是form2的load事件
private void form2_load(object sender, EventArgs e)
{
textBox1.Text=类名.变量名;
}
1、定向传递,Form1声明一个public或者internal(要求同一个namespace)变量,在form2创建之后直接使用form1的这个变量,这样就可以把form1的这个值传到form2里面去。
方法1最简单,也最不推荐,可能会存在安全问题,比如form2访问该变量的时候,该变量并没有准备好,关键是破坏了OOP语言模式。
2、使用观察者模式,让form2去观察form1,自己去查设计模式,有的是例子,C#的话,实现Observer类或者实现ObserverCollection接口。
3、C#的话使用反射技术进行数据绑定,绑定的就是这个要传递的值,这本身也是观察者模式的一种实现,只不过内部机制被C#语言帮你实现了。
4、C#的话,让类实现INotifiyValueChanged接口。
5、form1和form2之间实现消息循环,这是最基本的win32平台思想。
方法5灵活,关键是比起前几种方法,不仅可以实现同步传递,更可以实现异步通信,对于并行线程很有效。就这几个应该够你用的了。就提示到这里,我觉得已经说得很明白了。具体的自己查,不会自己查的人不要再去编程了,或者本来你这些都了解,只是一时想不起来用它们,提示到此。