原先是做Web开发的,刚开始试着用vs2005作winform程序开发。
问题1:在MDI(多文档)中,假设有主窗体frmMain和form1、form2两个子窗体,两个子窗体上各有一个Button。点击frmMain中主菜单的某个菜单项后打开了form1子窗体,现在想点击form1中的button将form1先隐藏不显示,然后显示form2,点击form2上面的Button关闭form2再显示出form1来,应该如何编码?
问题2:点击form1上的button能否在打开form2的同时向form2传值?同样的,在关闭form2的同时能否也向form1传值?
谢谢各位指教我。
问题1:在MDI(多文档)中,假设有主窗体frmMain和form1、form2两个子窗体,两个子窗体上各有一个Button。点击frmMain中主菜单的某个菜单项后打开了form1子窗体,现在想点击form1中的button将form1先隐藏不显示,然后显示form2,点击form2上面的Button关闭form2再显示出form1来,应该如何编码?
问题2:点击form1上的button能否在打开form2的同时向form2传值?同样的,在关闭form2的同时能否也向form1传值?
谢谢各位指教我。
改变控件的可访问属性 (public)
在显示窗体前需要创建窗体对象 比如
Form2 f2= new Form2();
f2.控件名称.text="";
f2.ShowDialog();this.控件.text=f2.控件名称.text;//传回来
f2.Dispose();//关闭对象在f2的关闭前先隐藏对象
this.Hide();
在form2中重载构造函数,如下:private string _orderid = "";public ucStockIn(string orderid)
{
InitializeComponent();
_orderid = orderid;
}
点击form1上的button时新建form2的对象,并往form2的构造函数中传入值。string orderid = "001";
ucStockIn mStockIn = new ucStockIn(orderid);
==
构造form2时把form1的引用传过去,点击form2上面的Button是form1.Show()
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}//确认
private void btnAccept_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
==
一般通过构造函数传递窗体引用同样的,在关闭form2的同时能否也向form1传值?
==
不规范的做法是将form1的控件属性设为public,就可以随意访问;规范点给form1一些public的属性返回或设置这些值
private Form2 form2 = null; public Form1 Form1
{
get
{
return form1;
}
set
{
form1 = value; if (form1 != null)
{
form1.MdiParent = this;
}
}
} public Form2 Form2
{
get
{
return form2;
}
set
{
form2 = value; if (form2 != null)
{
form2.MdiParent = this;
}
}
}在主窗体frmMain某菜单单击事件中添加如下代码: private void menuFileOpen_Click(object sender, EventArgs e)
{
if (Form1 == null)
{
Form1 = new Form1();
} Form1.Show();
}2.在Form1中按钮单击事件中添加如下代码: private void buttonOK_Click(object sender, EventArgs e)
{
this.Hide(); frmMain parent = MdiParent as frmMain;
if (parent != null)
{
if (parent.Form2 == null)
{
parent.Form2 = new Form2();
} parent.Form2.Text = "从Form1传入的参数"; //这里加入要传入的参数
parent.Form2.Show();
}
}3.在Form2的按钮单击事件中加入如下代码: private void buttonOK_Click(object sender, EventArgs e)
{
this.Hide(); frmMain parent = MdiParent as frmMain;
if (parent != null)
{
if (parent.Form1 == null)
{
parent.Form1 = new Form1();
} parent.Form1.Text = "从Form2传入的参数"; //这里加入要传入的参数
parent.Form1.Show();
}
}
在frmMain中的跳转到form1的按钮中写
Form1 f1= new Form1();
f1.Show(); //这是非模式的窗体,用这种方式还可以对其它窗体进行操作
或f1.ShowDialog(); //这是模式化的窗体,当打开这个窗体后必须对这个窗体执行相关的操作
this.Hide(); //隐藏当前窗体
f1.Dispose(); //关闭当前窗体
你要的跳转可以类似的这样做
问题二:你说的那种情况当然是可以的
首先你要先把两个窗体建立联系,即在form1中可调用form2中的文字或者某个控件
代码:
在form1中
Form2 f2= new Form2();
f2.Owner=this;
f1.Show();
this.Hide();
f1.Dispose();
在Form2中
Form1 f1=(Form1)this.Owner;
这样的话就可以在关闭Form1后但是Form1中的控件的在Form2中可以调用的到了
例如在Form1中有个Lable1你想在Form2中调用给textBox1,在写完上面的代码后你就可以继续在Form2中写
this.textBox1.Text=f1.Lable1.Text;
在Form2回到Form1窗体中也就是将上面的代码反过来即可
********归根你的两个问题还是一个问题,只要问题二中的代码就可以全部解决了
OK,到此了
主窗体是可以访问form1和form2的,利用事件机制,
当点击主窗体菜单时位于主窗体中的事件处理函数创建form1,
当点击form1中的按钮时位于form1中的事件处理程序激发form1中的自定义事件"打开form2"
主窗体中事件"打开form2"的处理函数执行,隐藏form1,创建form2
当点击form2中的按钮时,位于form2中的事件处理函数激发form2的自定义事件"显示form1"
位于主窗体的事件处理程序处理"显示form1"事件,执行关闭form2,显示form1的动作
说明:默认的button控件是私有的,但是可以用public开放,这样就不用在form中自定义事件了,主窗体直接编写button的点击事件处理函数.
问题二:
可以传值,也是利用事件机制:
1.自定义一套事件,以便于传送自定义的参数类型.
像这样
delegate void 打卡form2(object sender, 自定义参数 args);
event 打卡form2 on打卡form2;
public Form2(Form1 form1)
{
this.form1 = form1;
}
这样就可以直接操作form1里面的属性呀,方法什么的.FORM1同样写为一样..
if(form2.ShowDialog=== DialogResult.Cancel)
{
this.Show();
}
1,form1上加个命名为"隐藏"的按钮,
设置它的Visible属性(true/false)
例如:button1.Visible=false;//隐藏,但实例数据状态依然被保存,
当你:
button1.Visible=true;//时它原样显现出来.2,所谓传值,就是这样的设你的MDI主窗口为:form1,有两个子窗口subf1,subf2它们都被包含在form1之中如果你想往子窗口中加入自定义值,那么你应该先,让子窗口继承Form基类然后在在其中设计时添加你所期的字段比如 string address; int number;等等并让它们可以被包含它们 的类(这里是form1)所访问到,那么你可以大致这样传值,例如:...//在form1内部的构造函数中订阅子窗口的事件
subf2.Click+=this.subf2_Click;
...//事件应答设计
void subf2_Click(object sender,EventArgs e)
{
//向subf1传值:
this.subf1.Address=this.subf2.Address;//subf2中的Address比如被一个TextBox.Text的值所赋予
//...
}
设置它的Visible属性(true/false)
例如: button1.Visible=false;//隐藏,但实例数据状态依然被保存,
当你:
button1.Visible=true;//时它原样显现出来.
//晕了,写错了,对不起加上一个命名"隐藏"的按钮当点击它时写入:设两个子窗口分别为subf1,subf2this.Visible=false;//在子窗口(subf1)内部的Click事件应答函数中this.subf1.Visible=true;//在主窗口里的另一个子窗口的Click事件应答函数中
第一个问题通过.ShowDialog()和.Hide()就可以了
第二个问题上面的方法也可以,
你也可以定义一个窗体的属性来传值,
或使用窗体自带的.Tag属性来传值
当你做完一个事件,就想做什么事
ShowDialog()这个方法是在当前页面弹出一个新窗口,此窗口不被关闭时其他窗口都不能用,Show()则可以用
Hide()就是一个隐藏控件的方法,为false显示,反之隐藏