当前位置:编程学习 > C#/ASP.NET >>

在线等,高分求助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不符合要求 --------------------编程问答--------------------
引用 5 楼 feigehs 的回复:
窗体执行的顺序是:运行程序显示form1,在form1上的一按钮点击显示form2:f2.Show();然后在form2上有个按钮点击显示form3:f3.ShowDialog();form1中一直在检测某事件,当检测到时,form2,form3隐藏或置底,form1置顶;但form3是ShowDialog生成的,在form3关闭之前是就算form1置顶了,form1也不能操作,有没什么解决方案……

补充:当form1执行完后,它再次置底,form2,form3显示,并置顶 --------------------编程问答-------------------- 子窗体显示的时候貌似不能操作父窗体 --------------------编程问答-------------------- 有点纠结了。。  --------------------编程问答-------------------- 你可以设置Form1的TopMost属性为true,这样它就在最上面了,当关闭Form1的时候,再把Form3的TopMost属性设为True --------------------编程问答--------------------
引用 8 楼 feigehs 的回复:
form3必须要showDialog,因为form2需要form3的操作完后的值,如果用show不符合要求


修改:这样form3会停在form2的上面,并跟随form2一起动作,
      但是form3弹出后form2仍然可以继续操作,不过这个很简单
      你弹出form3的设置一下就可以了,关闭form3的时候再恢复form2的操作即可。
Form3 f3=new Form3()
f3.Owner = this;
f3.Show();
--------------------编程问答--------------------
引用 12 楼 wu_rual123 的回复:
你可以设置Form1的TopMost属性为true,这样它就在最上面了,当关闭Form1的时候,再把Form3的TopMost属性设为True


这样有试过,但当from3是showDialog后,form1的TopMost属性为true,窗体可以置顶,但焦点不在form1上,form1是不能动的 --------------------编程问答--------------------
引用 13 楼 isjoe 的回复:
引用 8 楼 feigehs 的回复:
form3必须要showDialog,因为form2需要form3的操作完后的值,如果用show不符合要求


修改:这样form3会停在form2的上面,并跟随form2一起动作,
      但是form3弹出后form2仍然可以继续操作,不过这个很简单
      你弹出form3的设置一下就可以了,关闭form3的时候再恢复form2的……


刚才试了下,用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永远在最上面 --------------------编程问答--------------------
引用 16 楼 pisanan 的回复:
设置 form3.TopLevel=false
设置 form2.Controls.Add(from3);
然后 form3.show();这里form3会作为form2的子控件打开,会遮挡住form2下面的控件。哈哈。不会影响form1的操作。


试了下,from3是变成了form2容器里的控件,也可以挡住form2的控件,只要把form3移开还是可以触发form2的控件 --------------------编程问答--------------------
引用 18 楼 advisd 的回复:
那你可以把form3用show()啊。之后把前面的都隐藏,form隐藏,之后检测到事件再。把前面2个隐藏,form显示。

form3必须要showDialog,因为form2需要form3的操作完后的值,如果用show不符合要求 --------------------编程问答--------------------
引用 19 楼 avi9111 的回复:
f3.ShowDialog();

就会把整个程序阻塞掉, f3永远在最上面


那有没什么替代的方式 --------------------编程问答--------------------
引用 15 楼 feigehs 的回复:
刚才试了下,用f3.Owner = this;f3.Show();string strTest="test";在显示form3窗体后,还是会执行到string strTest="test",原来的想法是,在form3窗体结束之前,它后面的操作是不能执行到的


我也不太明白为什么你要这么设计。。。。。不能改改吗?

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


如果会错意了,笑笑就行了^_^ --------------------编程问答--------------------
引用 24 楼 avi9111 的回复:
并不是最好的解决方案,

FrmAppWorkSpace是Form1,在Form1这样写    

    static Form3 frm3;
        public static void ShowForm3()
        {
            if (frm3 == null)
            {
                frm3 = n……

这是一个MDI程序,如果每个子窗体都要声明成这中静态的,不大好吧 --------------------编程问答--------------------
你知道是MDI就行啦

应该要一个窗体的POOL

该POOL有几个方法,例如FindForm,ShowForm,

显示页面前,要先在POOL”注册“,相当于AddControl,通过FindControl找到那个窗体

实现方法还是有很多的,不过基本上都是占用一点公共内存,操作就对那块POOL进行操作 --------------------编程问答-------------------- 用API设置画面前端显示和隐藏,效果奇好啊~! --------------------编程问答--------------------
引用 29 楼 haisheng707 的回复:
用API设置画面前端显示和隐藏,效果奇好啊~!

SetWindowPos貌似也不行,还有啥API正解呢 --------------------编程问答-------------------- SetForegroundWindow

可以参考这个,最后
http://topic.csdn.net/u/20110422/12/9f4ed8dd-f975-48f0-af69-5918c8958a89.html

不过C#怎么取句柄,我一直没有做出来= =  --------------------编程问答-------------------- FindWindow可以找到句柄,但找不到隐藏窗体的句柄
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,