第一次 用C#开发WinForm程序,问大家一个简单问题关于模式窗口:(遇到的问题就是和下面举例一样)
我有一个主窗口Main ,点击 Main 上面的一个按钮 弹出模式窗口 A,然后在点击A中的一个按钮 弹出模式窗口B,同时关闭A,点击B中按钮弹出模式窗口C,同时关闭B。怎么实现?
我这么写的 :
Main中:A a=New A(); a.ShowDialog(); 此时 Main 上面弹出 模式窗口A
A中: B b=New B(); b.ShowDialog(); this.Close(); 此时 Main 上面弹出 窗口A ,A上面有B,关闭B的时候,A,B都关了
请问这种现在怎么解决?
我有一个主窗口Main ,点击 Main 上面的一个按钮 弹出模式窗口 A,然后在点击A中的一个按钮 弹出模式窗口B,同时关闭A,点击B中按钮弹出模式窗口C,同时关闭B。怎么实现?
我这么写的 :
Main中:A a=New A(); a.ShowDialog(); 此时 Main 上面弹出 模式窗口A
A中: B b=New B(); b.ShowDialog(); this.Close(); 此时 Main 上面弹出 窗口A ,A上面有B,关闭B的时候,A,B都关了
请问这种现在怎么解决?
解决方案 »
- C#中线程传递参数能用ref吗?
- 怎样指定endpoint
- vc# 如何判断按钮控件被点击???
- 文件上传的简单问题,帮帮我
- C/S B/S 已经算是分部式了,为什么还要讲谈论分布式,到底是分布式是意思?在哪里分布??
- 如何得到LISTVIEW中当前选中项的值?
- 求助解决方案:关于双向XML数据传输的问题(分数不够,可以另外开一贴)
- 关于windowsService的问题!请各位大哥帮忙!用c#还不到两个星期~!
- 求救 一个登陆的时候按照用户权限跳转各页面的问题
- 如何让treeView中某一个节点前面有CheckBox?
- 关于在C# 调用API的问题
- 我有一个很老的sybase sql anywhere数据库文件,后缀是.db,请问在vs.net 2005里面,怎么写连接字符串?
将所有窗口声明写到main中。
private void button1_Click(object sender, EventArgs e)
{
Form2 fm = new Form2();
fm.Show();
}
其他窗体:
private void button1_Click(object sender, EventArgs e)
{
Form3 fm = new Form3();
fm.Show();
this.Close();
}
不是要的Show(),
show 当然可以,但是可以操作主界面了
我要的希望是 A弹出B的时候,关闭A
private void button1_Click(object sender, EventArgs e)
{
Form2 fm = new Form2();
fm.ShowDialog();
}
其他窗体:
private void button1_Click(object sender, EventArgs e)
{
Form3 fm = new Form3();
this.Hide();
//opacity=0; //这个是隐藏本窗体,也可以试一试。
fm.ShowDialog();
this.Close(); //注意这个Close()是在关Form3时这个窗体也关掉,不是在开Form3时这个窗体关掉。
}
然后showDialog
关闭子窗体的时候释放主窗体
private void button1_Click(object sender, EventArgs e)
{
Form2 fm = new Form2();
fm.ShowDialog();
}
其他窗体:
private void button1_Click(object sender, EventArgs e)
{
Form3 fm = new Form3();
this.Hide();
//opacity=0; //这个是隐藏本窗体,也可以试一试。
fm.ShowDialog();
this.Close(); //注意这个Close()是在关Form3时这个窗体也关掉,不是在开Form3时这个窗体关掉。
}我的代码和你的一样,就是没写隐藏,我想找的解决方法是 不隐藏 能否实现关闭!
b.ShowDialog();
this.Close(); 一定要等b窗体关闭后,b.ShowDialog() 才会返回,然后继续执行this.Close();如果要实现你要的效果,在主窗体中写如下代码,然后在A中调用:
a.Close();
B b=New B();
b.ShowDialog();
我没有实际测试,你自己测一下,看行不行;
A中: B b=New B(); b.ShowDialog(); this.Close();问题是你这样写,本来就是b.ShowDialog()以后关闭a啊……去掉this.Close();写个假的吧,a closing 事件里 b.ShowDialog()呵呵Form.ShowDialog (IWin32Window) 在ShowDialog的时候 把(this) 也就是a 传过去在B的构造里面关闭a这样就达到楼主的要求了
Form b = new FormB() DialogRestult rel = a.ShowDialog() if(rel = DialogResutl.OK)
b.ShowDialog
可是Main中写的是以下内容:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
就把你说的内容写到里面吗?
请赐教!!
A中: B b=New B(); b.ShowDialog(); this.Close();改為:
Main中:A a=New A(); a.ShowDialog();
A中: B b=New B(); this.Dispose(); b.ShowDialog();
用Dispose,而且寫在ShowDialog之前
main到a:
双击a上的按钮:
b fr =new b();
fr.show();
this.hiden();
a到b:
双击b上的按钮:
c fr=new c();
fr.show();
this.hiden();
这样做的时候最后关闭b页面的时候进程中a不会关闭·!
所以在关闭程序的时候应该写一个FromCloseing 事件
代码简单一句话:Application.Exit();
这里没VS 单词可能不对 但应该是这样的!用智能杳寻一定找的到的!
LZ的意思是在打开B的时候A自动关闭,打开C的时候B自动关闭
你们的程序是实现这个的吗?
我想这个问题可能是和你用的是show()有关
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.ShowDialog();
}
//第2个窗体
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
Form1 frm1 = new Form1();
frm1.Show();
Form3 frm = new Form3();
frm.ShowDialog();
frm1.Hide();
}
这样就可以实现你说的要求
//mainFrom
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Form showForm = null; //简化用公共变量 private void btnShowA_Click(object sender, EventArgs e)
{
A a = new A(this);
a.ShowDialog(); } private void Form1_Activated(object sender, EventArgs e)
{
if (showForm != null)
{
try
{
showForm.ShowDialog();
}
catch
{
showForm = null;
}
}
}
}//A Form
public partial class A : Form
{
private Form1 mainForm;//注意是Form1
public A(Form1 x)
{
InitializeComponent();
mainForm = x;
} private void btnShowB_Click(object sender, EventArgs e)//关闭后show B
{
mainForm.showForm = new B();
this.Dispose();
} private void button1_Click(object sender, EventArgs e)//关闭后无反应
{
mainForm.showForm = null;
this.Close();
}
}//B Form
public partial class B : Form
{
public B()
{
InitializeComponent();
}
}B以后的自己扩展一下
Form a = new FormA()
Form b = new FormB()private void button1_Click(object sender, EventArgs e)//这是主窗口的按钮事件
{
DialogResult rel = a.ShowDialog()
if (rel == DialogResult.OK)//假设A窗体点OK按钮时关闭A,打开B
b.ShowDialog()
}FormA:private void buttonOK_Click(object sender, EventArgs e)
{
//如果FormA的OK按钮被点击,设置本窗体DialogResult,并关窗本窗体
this.DialogResult = DialogResult.OK
this.Close()
}
差不多是这样子吧.上面大家的思路都在于用FormA来打来B,但其实不用,只要让FormA返回一个结果,由MainForm来打来FormB就行了.
a.ShowDialog();
b.ShowDialog();不就得了,呵呵
主窗体:
private void button1_Click(object sender, EventArgs e)
{
Form2 fm = new Form2();
fm.ShowDialog();
}
其他窗体:
private void button1_Click(object sender, EventArgs e)
{
Form3 fm = new Form3();
opacity=0; //这个是隐藏本窗体,也可以试一试。
fm.ShowDialog();
this.Close(); //注意这个Close()是在关Form3时这个窗体也关掉,不是在开Form3时这个窗体关掉。
}只是LZ说不想用opacity=0;这个方法。
不过我发现的他们共同的一个缺点,就是在打开新窗口(老窗口立即关闭)时都要闪一下,而且很明显的。(唯一缺点)
我也不喜欢opacity=0;因为我觉得不用的东西就应该释放掉,不要占资源……
一般人都是想的 在a中打开b、关闭或者隐藏a 在b中打开c 关闭或者隐藏b...............
只有iTidy 的思路新颖!!顶~~~~~~~~~~~~~~~~``方法完全正确啊
Form2 f2 = new Form2(); //Form2 中有一个Button按钮 DialogResult属性设置为OK
Form3 f3 = new Form3(); private void button1_Click(object sender, EventArgs e)//这是主窗口的按钮事件
{
if (f1.ShowDialog() == DialogResult.OK)
{
if(f2.ShowDialog() == DialogResult.OK)
{
f3.ShowDialog();
}
}
} private void button1_Click(object sender, EventArgs e)//这是Form1
{
this.Close();
}private void button1_Click(object sender, EventArgs e)//这是Form2
{
this.Close();
}