在线等,高分求助C#的ShowDialog问题
三个窗体Form1,Form2,Form3,Form1为默认启动窗体
Form2是Form1按钮点击通过非模态对话框显示出来(Show()),
Form3是Form2按钮点击通过模态对话框显示出来(ShowDialog()),
当Form1窗体接收到外部信号时,要激活并显示本程序的最上方,
把Form3(模态对话框)隐藏或置底到程序的最下方,
等Form1的事件结束后把Form3再显示在本软件的上方。
Form2 f2=new Form2()
f2.Show();
Form3 f3=new Form3()
f3.ShowDialog();
--------------------编程问答-------------------- 我觉得你说的应该不是很难吧,也许我没理解清楚,但是我觉得你只要在打开Form1时,将form3也打开,不过是隐藏form3,等关闭form1时再将form3显示出来就行了。
或者就是只打开form1,在form1关闭后,再打开form3,我觉得这些不冲突 --------------------编程问答-------------------- 说的很迷糊,建议楼主想清楚到底哪一个环节实现不了再来问。 --------------------编程问答-------------------- 和2楼一样,不知道楼主要表达什么
form2干什么用的
要启动还可以子线程 Application.Run运行窗体再this.close()关闭原窗体 --------------------编程问答-------------------- 在弹出的时候 设置最大值 最上层 --------------------编程问答-------------------- 窗体执行的顺序是:运行程序显示form1,在form1上的一按钮点击显示form2:f2.Show();然后在form2上有个按钮点击显示form3:f3.ShowDialog();form1中一直在检测某事件,当检测到时,form2,form3隐藏或置底,form1置顶;但form3是ShowDialog生成的,在form3关闭之前是就算form1置顶了,form1也不能操作,有没什么解决方案 --------------------编程问答-------------------- 纠结.. --------------------编程问答-------------------- form3.ShowDialog()的定义就是不允许操作下面的窗体,你为何不把ShowDialog()改成Show()呢,这两种方法没什么区别,只是允不允许操作下面窗体。
隐藏窗体可以用form3.Hide();
这样回答不知道可以不 --------------------编程问答-------------------- form3必须要showDialog,因为form2需要form3的操作完后的值,如果用show不符合要求 --------------------编程问答--------------------
补充:当form1执行完后,它再次置底,form2,form3显示,并置顶 --------------------编程问答-------------------- 子窗体显示的时候貌似不能操作父窗体 --------------------编程问答-------------------- 有点纠结了。。 --------------------编程问答-------------------- 你可以设置Form1的TopMost属性为true,这样它就在最上面了,当关闭Form1的时候,再把Form3的TopMost属性设为True --------------------编程问答--------------------
修改:这样form3会停在form2的上面,并跟随form2一起动作,
但是form3弹出后form2仍然可以继续操作,不过这个很简单
你弹出form3的设置一下就可以了,关闭form3的时候再恢复form2的操作即可。
Form3 f3=new Form3()
f3.Owner = this;
f3.Show();
--------------------编程问答--------------------
这样有试过,但当from3是showDialog后,form1的TopMost属性为true,窗体可以置顶,但焦点不在form1上,form1是不能动的 --------------------编程问答--------------------
刚才试了下,用f3.Owner = this;f3.Show();string strTest="test";在显示form3窗体后,还是会执行到string strTest="test",原来的想法是,在form3窗体结束之前,它后面的操作是不能执行到的 --------------------编程问答-------------------- 设置 form3.TopLevel=false
设置 form2.Controls.Add(from3);
然后 form3.show();这里form3会作为form2的子控件打开,会遮挡住form2下面的控件。哈哈。不会影响form1的操作。 --------------------编程问答-------------------- --------------------编程问答-------------------- 那你可以把form3用show()啊。之后把前面的都隐藏,form隐藏,之后检测到事件再。把前面2个隐藏,form显示。 --------------------编程问答-------------------- f3.ShowDialog();
就会把整个程序阻塞掉, f3永远在最上面 --------------------编程问答--------------------
试了下,from3是变成了form2容器里的控件,也可以挡住form2的控件,只要把form3移开还是可以触发form2的控件 --------------------编程问答--------------------
form3必须要showDialog,因为form2需要form3的操作完后的值,如果用show不符合要求 --------------------编程问答--------------------
那有没什么替代的方式 --------------------编程问答--------------------
我也不太明白为什么你要这么设计。。。。。不能改改吗?
f3.Show();
// 在这里添加循环代码,直到f3给出关闭信号为止while(true){}
string strTest="test", --------------------编程问答-------------------- 并不是最好的解决方案,
FrmAppWorkSpace是Form1,在Form1这样写
static Form3 frm3;
public static void ShowForm3()
{
if (frm3 == null)
{
frm3 = new Form3();
frm3.Show();
//frm3.Activate();
}
frm3.Activate();
}
public static void CloseForm3()
{
frm3 = null;
}
private void btnOverlay_Click(object sender, EventArgs e)
{
FrmAppWorkSpace.ShowForm3();
}
在Form3关闭的时候要处理一下
private void Form3_FormClosed(object sender, FormClosedEventArgs e)
{
FrmAppWorkSpace.CloseForm3();
} --------------------编程问答-------------------- Form2显示的时候代码
Form3 f3=new Form3()
f3.Show(); --------------------编程问答-------------------- 用DialogResult返回值方法判断。
Form1 frm1 =new Form1();
...
Form2 frm2 =new Form2();
...
Form3 frm3 =new Form3();
...
frm3中,如果某些逻辑执行成功后
frm3.DialogResult=DialogResult.OK
在frm2中判断frm3的返回值是不是OK,同时
if (frm3.ShowDialog()==DialogResult.OK)
// do something
frm2.DialogResult=DialogResult.OK
最后在frm1中进行最后的处理。
if (frm2.ShowDialog()==DialogResult.OK)
// do something
如果会错意了,笑笑就行了^_^ --------------------编程问答--------------------
这是一个MDI程序,如果每个子窗体都要声明成这中静态的,不大好吧 --------------------编程问答--------------------
你知道是MDI就行啦
应该要一个窗体的POOL
该POOL有几个方法,例如FindForm,ShowForm,
显示页面前,要先在POOL”注册“,相当于AddControl,通过FindControl找到那个窗体
实现方法还是有很多的,不过基本上都是占用一点公共内存,操作就对那块POOL进行操作 --------------------编程问答-------------------- 用API设置画面前端显示和隐藏,效果奇好啊~! --------------------编程问答--------------------
SetWindowPos貌似也不行,还有啥API正解呢 --------------------编程问答-------------------- SetForegroundWindow
可以参考这个,最后
http://topic.csdn.net/u/20110422/12/9f4ed8dd-f975-48f0-af69-5918c8958a89.html
不过C#怎么取句柄,我一直没有做出来= = --------------------编程问答-------------------- FindWindow可以找到句柄,但找不到隐藏窗体的句柄
补充:.NET技术 , C#