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

JessieCoder 2014-08-19 08:43:02
如题,刚刚开始学习winform编程,这个小问题不懂
程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面
百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。
有没有大神来帮我一下,最好给出解决方案,贴一下源码,感激不尽!
...全文
707 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
candyvoice 2016-11-28
  • 打赏
  • 举报
回复
同问,不过我是在wpf中,mark一下
我叫小菜菜 2014-08-22
  • 打赏
  • 举报
回复
引用 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是指向那个匿名对象,还是主窗体?答案应该是主窗体。所以应该使用命名对象,正如上面。
JessieCoder 2014-08-22
  • 打赏
  • 举报
回复
O(∩_∩)O谢谢这么热情的大家啦~问题已经解决了~
Qxiaojie 2014-08-20
  • 打赏
  • 举报
回复
登录窗体的登录按钮事件 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编程,这个小问题不懂 程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面 百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。 有没有大神来帮我一下,最好给出解决方案,贴一下源码,感激不尽!
hxwangcong 2014-08-19
  • 打赏
  • 举报
回复
参考如下代码: 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);
        }
hxwangcong 2014-08-19
  • 打赏
  • 举报
回复
我又看了一遍你的问题,3楼的代码不对,最后一行不应该是this.Close(),这样岂不是主界面被关闭了 正确的代码应该是: 签到 obj1=new 签到(); obj1.Show(); System.Threading.Thread.Sleep(3000); obj1.Close();
feixuyue 2014-08-19
  • 打赏
  • 举报
回复
form1作为父窗体, form2作为子状体, form1: (form2).show(); form2: (from1).show(); this.close();
hxwangcong 2014-08-19
  • 打赏
  • 举报
回复
除此之外,楼主所示代码里,不要关闭窗体,而要隐藏窗体。用timer来调用Hide()和Show()即可
hxwangcong 2014-08-19
  • 打赏
  • 举报
回复
用WPF可以实现web那样的跳转,没有问题 另外,可以尝试使用MDI窗体来切换子窗体
於黾 2014-08-19
  • 打赏
  • 举报
回复
新手还是多用工具箱,直接拖控件,事件在属性里双击生成 少写乱七八糟自己都看不懂的代码
xian_wwq 2014-08-19
  • 打赏
  • 举报
回复
引用 10 楼 JessieCoder 的回复:
[quote=引用 5 楼 xian_wwq 的回复:] [quote=引用 楼主 JessieCoder 的回复:] 如题,刚刚开始学习winform编程,这个小问题不懂 程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面 百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。 有没有大神来帮我一下,最好给出解决方案,贴一下源码,感激不尽!
看需求是想在登陆完成后,给出一个提示信息框。 1.验证登陆,如果成功,new 个新窗体.这个新窗体上添加个timer控件 2. ShowDialog() ,在新窗体的load函数中启用timer, timer的interval就是需要显示的时间 timer的执行内容就是 this.Close() 3.新窗体关闭后,使用dispose释放 [/quote] 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();)报错[/quote] 不需要这么麻烦,直接从工具栏拖个timer放在弹出窗体上就行了
JessieCoder 2014-08-19
  • 打赏
  • 举报
回复
引用 16 楼 Z65443344 的回复:
timer控件有3种,你先恶补一下到底有什么区别. 如果没区别,也没必要弄3种了 各有各的用途,不能乱用.
好的好的,其实C#我一点没学过,现在赶鸭子上架要我写这个也是迫不得已。。 完全一点都不会T_T
  • 打赏
  • 举报
回复
可以把你不对的代码贴出来看看
於黾 2014-08-19
  • 打赏
  • 举报
回复
timer控件有3种,你先恶补一下到底有什么区别. 如果没区别,也没必要弄3种了 各有各的用途,不能乱用.
於黾 2014-08-19
  • 打赏
  • 举报
回复
引用 13 楼 JessieCoder 的回复:
sleep方法不是在线程里面用的吗,这里应该用不了啊
主线程难道不是线程? 你基础知识需要恶补了. 另外,有怀疑,就动手试,报错了再问. 没试你怎么知道用不了
Peng_baoqing 2014-08-19
  • 打赏
  • 举报
回复
引用 13 楼 JessieCoder 的回复:
[quote=引用 3 楼 zhi_ai_yaya 的回复:] 1.登陆,跳转到主界面 2.在主界面的Form.Shown 事件写入代码: { new 签到().show(); sleep(3000); this.close();} 只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。 2.主界面.show();
sleep方法不是在线程里面用的吗,这里应该用不了啊[/quote]System.Threading.Thread.Sleep(3000);
JessieCoder 2014-08-19
  • 打赏
  • 举报
回复
引用 3 楼 zhi_ai_yaya 的回复:
1.登陆,跳转到主界面 2.在主界面的Form.Shown 事件写入代码: { new 签到().show(); sleep(3000); this.close();} 只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。 2.主界面.show();
sleep方法不是在线程里面用的吗,这里应该用不了啊
於黾 2014-08-19
  • 打赏
  • 举报
回复
你直接从工具箱里拖个timer出来就可以了,不要乱用System.Timers.Timer ,这个是多线程的
allen0118 2014-08-19
  • 打赏
  • 举报
回复
引用 3 楼 zhi_ai_yaya 的回复:
1.登陆,跳转到主界面 2.在主界面的Form.Shown 事件写入代码: { new 签到().show(); sleep(3000); this.close();} 只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。 2.主界面.show();
+1
JessieCoder 2014-08-19
  • 打赏
  • 举报
回复
引用 5 楼 xian_wwq 的回复:
[quote=引用 楼主 JessieCoder 的回复:] 如题,刚刚开始学习winform编程,这个小问题不懂 程序是这样子:登陆—主页面—显示签到成功(三秒)—回到主页面 百度谷歌了很久,很多人都说使用定时器,我试过很多都不行,各种出错。小白好悲伤,女程序员就要崩溃了!T_T所以来这里发帖求助。 有没有大神来帮我一下,最好给出解决方案,贴一下源码,感激不尽!
看需求是想在登陆完成后,给出一个提示信息框。 1.验证登陆,如果成功,new 个新窗体.这个新窗体上添加个timer控件 2. ShowDialog() ,在新窗体的load函数中启用timer, timer的interval就是需要显示的时间 timer的执行内容就是 this.Close() 3.新窗体关闭后,使用dispose释放 [/quote] 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();)报错
加载更多回复(9)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧