C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1

时间:2021-03-14 23:39:45
如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

29 个解决方案

#1


我觉得你需要恶补一下基础知识
明显winform和webform都搞混了
winform根本没有页面跳转的概念,它只是打开窗口,关闭窗口

#2


使用定时器timer控件肯定是可以的。
用sleep(3000)也算可行~

#3


1.登陆,跳转到主界面
2.在主界面的Form.Shown 事件写入代码:
{
new 签到().show();
sleep(3000);
this.close();
}
只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。
2.主界面.show();

#4


这不就是一个窗口显示隐藏的功能么

#5


引用 楼主 JessieCoder 的回复:
如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

看需求是想在登陆完成后,给出一个提示信息框。
1.验证登陆,如果成功,new 个新窗体.这个新窗体上添加个timer控件
2. ShowDialog() ,在新窗体的load函数中启用timer,
timer的interval就是需要显示的时间
timer的执行内容就是 this.Close()
3.新窗体关闭后,使用dispose释放


#6


3楼正解  C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1

#7


引用 1 楼 Z65443344 的回复:
我觉得你需要恶补一下基础知识
明显winform和webform都搞混了
winform根本没有页面跳转的概念,它只是打开窗口,关闭窗口

我错了 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1那能帮我解决一下问题吗?

#8


做个自定义控件吧   可以不用再弹出窗体

#9


3楼和5楼的方案都可行
不过5楼的方案更好一点
把timer放到新窗体中,而不是主窗体中

#10


引用 5 楼 xian_wwq 的回复:
Quote: 引用 楼主 JessieCoder 的回复:

如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

看需求是想在登陆完成后,给出一个提示信息框。
1.验证登陆,如果成功,new 个新窗体.这个新窗体上添加个timer控件
2. ShowDialog() ,在新窗体的load函数中启用timer,
timer的interval就是需要显示的时间
timer的执行内容就是 this.Close()
3.新窗体关闭后,使用dispose释放



timer的用法是不是这样:
 System.Timers.Timer t = new System.Timers.Timer(3000);
 t.Elapsed += new System.Timers.ElapsedEventHandler(theout);
 t.AutoReset = false;
 t.Enabled = true;
然后在theout方法里写timer的执行内容?
但是这样会报错啊,报错说要在创建新窗体的线程里面关闭新窗体(this.Close();)报错

#11


引用 3 楼 zhi_ai_yaya 的回复:
1.登陆,跳转到主界面
2.在主界面的Form.Shown 事件写入代码:
{
new 签到().show();
sleep(3000);
this.close();
}
只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。
2.主界面.show();


+1

#12


你直接从工具箱里拖个timer出来就可以了,不要乱用System.Timers.Timer ,这个是多线程的

#13


引用 3 楼 zhi_ai_yaya 的回复:
1.登陆,跳转到主界面
2.在主界面的Form.Shown 事件写入代码:
{
new 签到().show();
sleep(3000);
this.close();
}
只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。
2.主界面.show();

sleep方法不是在线程里面用的吗,这里应该用不了啊

#14


引用 13 楼 JessieCoder 的回复:
Quote: 引用 3 楼 zhi_ai_yaya 的回复:

1.登陆,跳转到主界面
2.在主界面的Form.Shown 事件写入代码:
{
new 签到().show();
sleep(3000);
this.close();
}
只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。
2.主界面.show();

sleep方法不是在线程里面用的吗,这里应该用不了啊
System.Threading.Thread.Sleep(3000);

#15


引用 13 楼 JessieCoder 的回复:
sleep方法不是在线程里面用的吗,这里应该用不了啊

主线程难道不是线程?
你基础知识需要恶补了.
另外,有怀疑,就动手试,报错了再问.
没试你怎么知道用不了

#16


timer控件有3种,你先恶补一下到底有什么区别.
如果没区别,也没必要弄3种了
各有各的用途,不能乱用.

#17


可以把你不对的代码贴出来看看

#18


引用 16 楼 Z65443344 的回复:
timer控件有3种,你先恶补一下到底有什么区别.
如果没区别,也没必要弄3种了
各有各的用途,不能乱用.

好的好的,其实C#我一点没学过,现在赶鸭子上架要我写这个也是迫不得已。。
完全一点都不会T_T

#19


引用 10 楼 JessieCoder 的回复:
Quote: 引用 5 楼 xian_wwq 的回复:

Quote: 引用 楼主 JessieCoder 的回复:

如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

看需求是想在登陆完成后,给出一个提示信息框。
1.验证登陆,如果成功,new 个新窗体.这个新窗体上添加个timer控件
2. ShowDialog() ,在新窗体的load函数中启用timer,
timer的interval就是需要显示的时间
timer的执行内容就是 this.Close()
3.新窗体关闭后,使用dispose释放



timer的用法是不是这样:
 System.Timers.Timer t = new System.Timers.Timer(3000);
 t.Elapsed += new System.Timers.ElapsedEventHandler(theout);
 t.AutoReset = false;
 t.Enabled = true;
然后在theout方法里写timer的执行内容?
但是这样会报错啊,报错说要在创建新窗体的线程里面关闭新窗体(this.Close();)报错

不需要这么麻烦,直接从工具栏拖个timer放在弹出窗体上就行了

#20


新手还是多用工具箱,直接拖控件,事件在属性里双击生成
少写乱七八糟自己都看不懂的代码

#21


用WPF可以实现web那样的跳转,没有问题
另外,可以尝试使用MDI窗体来切换子窗体

#22


除此之外,楼主所示代码里,不要关闭窗体,而要隐藏窗体。用timer来调用Hide()和Show()即可

#23


form1作为父窗体,
form2作为子状体,
form1:
(form2).show();
form2:
(from1).show();
this.close();

#24


我又看了一遍你的问题,3楼的代码不对,最后一行不应该是this.Close(),这样岂不是主界面被关闭了
正确的代码应该是:
签到 obj1=new 签到();
obj1.Show();
System.Threading.Thread.Sleep(3000);
obj1.Close();

#25


参考如下代码:
Timer是拖拽到Form2里的。
主窗体Form1:
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.ShowDialog();
        }


被弹出窗体Form2:
        int i = 5;
        public Form2()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            i--;
            button1.Text = string.Format("关闭({0})", i);
            if (i == 0)
                this.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            button1.Text = string.Format("关闭({0})", i);
        }

#26


登录窗体的登录按钮事件
private void btn_login_Click(object sender, EventArgs e)
        {
            MainForm mainForm = new MainForm();
            mainForm.ShowDialog();
        }
主窗体的load事件
private void MainForm_Load(object sender, EventArgs e)
        {
            PromptForm promptForm = new PromptForm();
            promptForm.ShowDialog();
        }
提示窗体里拖一个Timer控件 设置属性Enable 为true Interval 为3000 然后加Timer的Tick事件
  private void timer1_Tick(object sender, EventArgs e)
        {
            this.Close();
        }

引用 楼主 JessieCoder 的回复:
如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

#27


O(∩_∩)O谢谢这么热情的大家啦~问题已经解决了~

#28


引用 24 楼 hxwangcong 的回复:
我又看了一遍你的问题,3楼的代码不对,最后一行不应该是this.Close(),这样岂不是主界面被关闭了
正确的代码应该是:
签到 obj1=new 签到();
obj1.Show();
System.Threading.Thread.Sleep(3000);
obj1.Close();


有道理,这个问题只牵涉到2个点:
1.线程睡眠或者/定时器
2.this指针

Sleep(3000);和System.Threading.Thread.Sleep(3000);没有区别,因为都是在主线程中,没有子线程存在。
this指针的问题:
3楼原来的是直接使用:new 签到();这是一个匿名对象,接着在后面调用 close(); 的话,就是隐式调用this.close();这时候的this是指向那个匿名对象,还是主窗体?答案应该是主窗体。所以应该使用命名对象,正如上面。

#29


同问,不过我是在wpf中,mark一下

#1


我觉得你需要恶补一下基础知识
明显winform和webform都搞混了
winform根本没有页面跳转的概念,它只是打开窗口,关闭窗口

#2


使用定时器timer控件肯定是可以的。
用sleep(3000)也算可行~

#3


1.登陆,跳转到主界面
2.在主界面的Form.Shown 事件写入代码:
{
new 签到().show();
sleep(3000);
this.close();
}
只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。
2.主界面.show();

#4


这不就是一个窗口显示隐藏的功能么

#5


引用 楼主 JessieCoder 的回复:
如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

看需求是想在登陆完成后,给出一个提示信息框。
1.验证登陆,如果成功,new 个新窗体.这个新窗体上添加个timer控件
2. ShowDialog() ,在新窗体的load函数中启用timer,
timer的interval就是需要显示的时间
timer的执行内容就是 this.Close()
3.新窗体关闭后,使用dispose释放


#6


3楼正解  C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1

#7


引用 1 楼 Z65443344 的回复:
我觉得你需要恶补一下基础知识
明显winform和webform都搞混了
winform根本没有页面跳转的概念,它只是打开窗口,关闭窗口

我错了 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1那能帮我解决一下问题吗?

#8


做个自定义控件吧   可以不用再弹出窗体

#9


3楼和5楼的方案都可行
不过5楼的方案更好一点
把timer放到新窗体中,而不是主窗体中

#10


引用 5 楼 xian_wwq 的回复:
Quote: 引用 楼主 JessieCoder 的回复:

如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

看需求是想在登陆完成后,给出一个提示信息框。
1.验证登陆,如果成功,new 个新窗体.这个新窗体上添加个timer控件
2. ShowDialog() ,在新窗体的load函数中启用timer,
timer的interval就是需要显示的时间
timer的执行内容就是 this.Close()
3.新窗体关闭后,使用dispose释放



timer的用法是不是这样:
 System.Timers.Timer t = new System.Timers.Timer(3000);
 t.Elapsed += new System.Timers.ElapsedEventHandler(theout);
 t.AutoReset = false;
 t.Enabled = true;
然后在theout方法里写timer的执行内容?
但是这样会报错啊,报错说要在创建新窗体的线程里面关闭新窗体(this.Close();)报错

#11


引用 3 楼 zhi_ai_yaya 的回复:
1.登陆,跳转到主界面
2.在主界面的Form.Shown 事件写入代码:
{
new 签到().show();
sleep(3000);
this.close();
}
只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。
2.主界面.show();


+1

#12


你直接从工具箱里拖个timer出来就可以了,不要乱用System.Timers.Timer ,这个是多线程的

#13


引用 3 楼 zhi_ai_yaya 的回复:
1.登陆,跳转到主界面
2.在主界面的Form.Shown 事件写入代码:
{
new 签到().show();
sleep(3000);
this.close();
}
只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。
2.主界面.show();

sleep方法不是在线程里面用的吗,这里应该用不了啊

#14


引用 13 楼 JessieCoder 的回复:
Quote: 引用 3 楼 zhi_ai_yaya 的回复:

1.登陆,跳转到主界面
2.在主界面的Form.Shown 事件写入代码:
{
new 签到().show();
sleep(3000);
this.close();
}
只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。
2.主界面.show();

sleep方法不是在线程里面用的吗,这里应该用不了啊
System.Threading.Thread.Sleep(3000);

#15


引用 13 楼 JessieCoder 的回复:
sleep方法不是在线程里面用的吗,这里应该用不了啊

主线程难道不是线程?
你基础知识需要恶补了.
另外,有怀疑,就动手试,报错了再问.
没试你怎么知道用不了

#16


timer控件有3种,你先恶补一下到底有什么区别.
如果没区别,也没必要弄3种了
各有各的用途,不能乱用.

#17


可以把你不对的代码贴出来看看

#18


引用 16 楼 Z65443344 的回复:
timer控件有3种,你先恶补一下到底有什么区别.
如果没区别,也没必要弄3种了
各有各的用途,不能乱用.

好的好的,其实C#我一点没学过,现在赶鸭子上架要我写这个也是迫不得已。。
完全一点都不会T_T

#19


引用 10 楼 JessieCoder 的回复:
Quote: 引用 5 楼 xian_wwq 的回复:

Quote: 引用 楼主 JessieCoder 的回复:

如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

看需求是想在登陆完成后,给出一个提示信息框。
1.验证登陆,如果成功,new 个新窗体.这个新窗体上添加个timer控件
2. ShowDialog() ,在新窗体的load函数中启用timer,
timer的interval就是需要显示的时间
timer的执行内容就是 this.Close()
3.新窗体关闭后,使用dispose释放



timer的用法是不是这样:
 System.Timers.Timer t = new System.Timers.Timer(3000);
 t.Elapsed += new System.Timers.ElapsedEventHandler(theout);
 t.AutoReset = false;
 t.Enabled = true;
然后在theout方法里写timer的执行内容?
但是这样会报错啊,报错说要在创建新窗体的线程里面关闭新窗体(this.Close();)报错

不需要这么麻烦,直接从工具栏拖个timer放在弹出窗体上就行了

#20


新手还是多用工具箱,直接拖控件,事件在属性里双击生成
少写乱七八糟自己都看不懂的代码

#21


用WPF可以实现web那样的跳转,没有问题
另外,可以尝试使用MDI窗体来切换子窗体

#22


除此之外,楼主所示代码里,不要关闭窗体,而要隐藏窗体。用timer来调用Hide()和Show()即可

#23


form1作为父窗体,
form2作为子状体,
form1:
(form2).show();
form2:
(from1).show();
this.close();

#24


我又看了一遍你的问题,3楼的代码不对,最后一行不应该是this.Close(),这样岂不是主界面被关闭了
正确的代码应该是:
签到 obj1=new 签到();
obj1.Show();
System.Threading.Thread.Sleep(3000);
obj1.Close();

#25


参考如下代码:
Timer是拖拽到Form2里的。
主窗体Form1:
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.ShowDialog();
        }


被弹出窗体Form2:
        int i = 5;
        public Form2()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            i--;
            button1.Text = string.Format("关闭({0})", i);
            if (i == 0)
                this.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            button1.Text = string.Format("关闭({0})", i);
        }

#26


登录窗体的登录按钮事件
private void btn_login_Click(object sender, EventArgs e)
        {
            MainForm mainForm = new MainForm();
            mainForm.ShowDialog();
        }
主窗体的load事件
private void MainForm_Load(object sender, EventArgs e)
        {
            PromptForm promptForm = new PromptForm();
            promptForm.ShowDialog();
        }
提示窗体里拖一个Timer控件 设置属性Enable 为true Interval 为3000 然后加Timer的Tick事件
  private void timer1_Tick(object sender, EventArgs e)
        {
            this.Close();
        }

引用 楼主 JessieCoder 的回复:
如题,刚刚开始学习winform编程,这个小问题不懂 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下 C#中如何让窗口1弹出窗口2,窗口2显示几秒之后再跳转回窗口1,最好给出解决方案,贴一下源码,感激不尽!

#27


O(∩_∩)O谢谢这么热情的大家啦~问题已经解决了~

#28


引用 24 楼 hxwangcong 的回复:
我又看了一遍你的问题,3楼的代码不对,最后一行不应该是this.Close(),这样岂不是主界面被关闭了
正确的代码应该是:
签到 obj1=new 签到();
obj1.Show();
System.Threading.Thread.Sleep(3000);
obj1.Close();


有道理,这个问题只牵涉到2个点:
1.线程睡眠或者/定时器
2.this指针

Sleep(3000);和System.Threading.Thread.Sleep(3000);没有区别,因为都是在主线程中,没有子线程存在。
this指针的问题:
3楼原来的是直接使用:new 签到();这是一个匿名对象,接着在后面调用 close(); 的话,就是隐式调用this.close();这时候的this是指向那个匿名对象,还是主窗体?答案应该是主窗体。所以应该使用命名对象,正如上面。

#29


同问,不过我是在wpf中,mark一下