父窗口给子窗口传值我用的是重写构造函数
private void button1_Click(object sender, EventArgs e)
{
FrmChild frm = new FrmChild(textBox1.Text);
frm.ShowDialog();
}
但是子窗口给父窗口传值怎么做呢。不可能还用FrmMain.ShowDialog()这就会有调出一个父窗口了,请问如何做呢
private void button1_Click(object sender, EventArgs e)
{
FrmChild frm = new FrmChild(textBox1.Text);
frm.ShowDialog();
}
但是子窗口给父窗口传值怎么做呢。不可能还用FrmMain.ShowDialog()这就会有调出一个父窗口了,请问如何做呢
在FrmChild添加:
public delegate MyDelegate(string text);//可以有多个参数,其他数据类型
public event MyDelegate MyEvent = null;//定义事件,即委托实例
在想要传值的地方,比如FrmChild的某个button_Click事件中添加:
if(MyEvent != null)
{
MyEvent(textBox2.Text);//这里可以传其他值
}
在FrmMain里添加:
private void button1_Click(object sender, EventArgs e)
{
FrmChild frm = new FrmChild(textBox1.Text);
frm.MyEvent += new MyDelegate(frm_MyEvent);
frm.ShowDialog();
}void frm_MyEvent(string text)
{
//这里处理从frm中传过来的值
}简单的流程就是这样,自己再看看委托和事件,多看看例子,自己写写就明白了。
也可以按楼上说的使用委托。
private void button4_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2(this.textBox1.Text,this.textBox2 ); //利用带参数的构造函数在父子窗体间的数据交互,此处参数为主窗体Form1中需要与子窗体Form2进行数据交互的控件名,参数类型和个数要与Form2中定义的一致
form2.ShowDialog(); //此模式打开,只能对于当前窗体进行操作,而form2.Show()是以非模式打开,即可同时操作多个窗体
form2.Dispose();
}在窗体2里
private TextBox textBox1_2; //在Form2中增加了一个类数据成员textBox1_2用来保存构造函数传来的变量,不过他们并不属于Form2的Controls容器
public Form2(string text,TextBox textbo) //添加相应的参数与Form1中构造函数中的参数一致
{
InitializeComponent();
this.textBox1.Text = text;
this.textBox2.Text = textbo.Text;//此句将Form1的textBox2中的数据传递到Form2的textBox2中,如同textBox1的参数传递,屏蔽此句则只由form2单向form1传递数据,不主动接受form1的数据
this.textBox1_2 = textbo; //用textBox1_2将实例中的数据传递给Form2参数
} private void button1_Click(object sender, EventArgs e)
{
this.textBox1_2.Text = this.textBox2.Text;
this.Close();
}
{
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show(this);
}
} public partial class Form2 : Form
{
private void button1_Click(object sender, EventArgs e)
{
Form1 frm1 = (Form1)this.Owner;
((TextBox)frm1.Controls["textBox1"]).Text = this.textBox2.Text;
this.Close();
}
}
Form1 f1 = new Form1();
f1.Size = 10;
Form2 f2 = f1;
f2.Size = 20;
上面四行代码结束,f1和f2的Size的值都会是20,因为f1和f2引用的都是一个Form1的对象,此时通过谁去改变里面的属性,那么另一个因为也引用这个对象所以值也会跟着改变.
由以上的分析:
ParForm(主窗体)、ChiForm(子窗体),
现在要实现你要求的功能:
首先需要在子窗体里面定义一个公共的主窗体的对象变量,即在ChiForm中:
public ParForm Par = new ParForm();
现在按正常的操作步骤:
1.从主窗体显示子窗体,即在主窗体相应的代码区(可能是一个Click事件),
ChiForm chi = new ChiForm();
//给子窗体的父窗体对象赋值,即把自己的引用传递给子窗体的变量
chi.Par = this;
//给子窗体需要赋值的地方赋值,该步骤可以代替楼主构造函数里面实现的东西,此过程也即为父窗体给子窗体传值
实现代码
//显示子窗体
chi.Show();
2.在子窗体中改变父窗体的值,即给父窗体传值
通过对chi.Par操作即可,因为chi.Par在1的步骤中已经将父窗体本身传过来了,所以只要对chi.Par进行操作,那么原来的父窗体相应的值也会相应的改变,此过程即实现了子窗体传递值给父窗体.以上几位子-父窗体传值,这里本人觉得最重要的莫过于对引用的理解.当然,其实通过公共的静态变量其实也可以做到这样的一个效果,即子窗体和父窗体都去对一些公共的静态变量进行操作,通过这些静态的公共变量进行传值.
http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx
Windows窗体间的数据交互
http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx