C#中如何通过一个窗体中的按钮点击事件打开另一个窗体并且关闭自身?

时间:2021-12-27 05:09:08
C#中如何通过一个窗体中的按钮点击事件打开另一个窗体并且关闭自身?要求是关闭窗体自身,不是隐藏,怎么button的事件代码啊?哪位大侠帮帮忙,谢谢了!

55 个解决方案

#1


form2 f2=new form2();
f2.show();
this.hide();

#2


为什么不能隐藏呢。。。

#3


隐藏占用内存资源啊,所以不隐藏!

#4


引用 1 楼 mdq001 的回复:
form2 f2=new form2(); 
f2.show(); 
this.hide();

只见过隐藏的,学习~

#5


要是隐藏那问题就变得简单了,不过谢谢二位了!大家都一起学习!

#6


form2 f2=new form2(); 
f2.show(); 
this.Dispose(); 

#7


1、窗体设计成一个类。
2、主窗体隐藏并构造自己设计的 窗体对象,并将自己的窗体Show。
3、关闭窗体就是 析构窗体对象。

#8


引用 6 楼 zhaozhijun0207 的回复:
C# codeform2 f2=new form2(); 
f2.show(); 
this.Dispose(); 


这样一样会占资源的..
你FROM2是在这个窗体实例的..FORM2没销毁,WINDOWS是不中释放FORM1的..

#9


晕,楼上好快,我刚写完...

#10


还是不行,两个都关了啊!

#11


form f1=new form();
f1.f1.ShowDialog();
this.hide;

#12


学习一下!!

#13


学习一下。

#14


如果主窗体为Form1,子窗体为Form2

把Form1的属性:isMdicontainer设置为true 

给主窗体中拉进一个botton1;双击(写代码) 
如下: 
Form2 myForm2 = new Form2(); 
myForm2.MdiParent = this; 
this.close();
myForm2.Show();

#15


强调一点,就是不可能打开一个子窗体再把主窗体给关掉,效果是什么都没打开,但程序直接就关闭了~

#16


把主窗体一开始就做成隐藏的,在后台运行,并自动呼叫一个子窗体1~

把一个子窗体1做成貌似主窗体的样子~在他上边呼叫子窗体2~

这样几个子窗体之间关关开开对主窗体都不造成影响了~~

代码不会写,这是觉得应该这样去实现~·不晓得有没有参考价值~学习了。

#17


是否要做登录界面啊?下面是例子,测试通过.
新建项目添加两窗体frmLogin,frmMain,frmLogin窗体中添加两按钮,分别命名为btnOK,btnCancel,按钮代码如下:

   private void btnOK_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
        }


Main方法代码:

/// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            frmLogin login = new frmLogin();
            if (login.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new frmMain());
            }
        }

#18


frm2 fr = new frm2();
fr.show();
this.Visible = false;

#19


最好通过js实现,通过windows弹出窗体实现。Response.Write("<script>alert('" + sMessage + "');window.opener=null;window.close()</script>")

#20


引用 10 楼 guangguang465355249 的回复:
还是不行,两个都关了啊!

别析构主窗体,否则肯定要关的,主窗体隐藏,弹出子窗体,子窗体再切换的时候可以把没用的子窗体析构。

#21


不能关闭主窗体,要不然你就连进程给关了,当然就不能显示第二个窗体了

#22


主窗体是不能被关闭的,否则整个程序将结束,所以你想真正关闭主窗体而运行其他窗体无解。。。其他窗体可以用Close方法关闭,这样也只有一个窗体在运行啊,能占用多少资源??不要哪么偏激。

#23


主窗体用
f2.show(); 
this.hide();
其他子窗体用
f1.show(); 
this.Close();
就可以了

#24


哦,谢谢各位啦!要是可以的话,请帮帮忙!

#25


学习

#26


17楼正解!!!

#27


引用 8 楼 lowsong 的回复:
这样一样会占资源的.. 
你FROM2是在这个窗体实例的..FORM2没销毁,WINDOWS是不中释放FORM1的..


你迄今做的项目,(除了退出程序)有哪个窗体关闭后是完全释放资源的?

#28


把main函数改成

[STAThread]
static void Main()
{
    // 设置需要显式的调用Application.Shutdown 方法调用来停止应用程序。
     // 默认为OnMainWindowClose
    Application.ShutdownMode = ShutdownMode.OnExplicitShutdown;
    Application.Run(new FrmMain());
}

这样进程就不会随着你的主窗体的关闭而关闭了。

#29


引用 17 楼 iStarSoft 的回复:
是否要做登录界面啊?下面是例子,测试通过. 
新建项目添加两窗体frmLogin,frmMain,frmLogin窗体中添加两按钮,分别命名为btnOK,btnCancel,按钮代码如下: 

C# code
   private void btnOK_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = Dia…

正解

#30


帮17楼顶一下

#31


不是做登录界面,我做的只是普通的窗体,不过还是谢谢各位!

#32


隐藏就行了吧,我没见过做关闭的。要么你就启动的时候先启动登录窗体。

#33


17楼可以,我试了~!我之前做登陆页是用隐藏,学习了~!!

#34


16楼想法很好
有新意

#35


多线程不知是否可以

#36


学习

#37


17L,长见识了,我还没看到过这样写登陆界面的呵呵,谢谢。
form2 f2=new form2(); 
f2.show(); 
this.Close 

一般这样写的,会把整个程序关闭,原因是因为Form1拥有Main的UI线程,所以关闭导致整个程序关闭。
一般写登陆简单的是
form2 f2=new form2(); 
f2.show(); 
this.Hide();
就是把它隐藏了。但是要记住,当你MainForm关闭的时候不能this.Close()来关闭程序。
应该 Application .Exit ()来退出,因为前者没有关闭UI线程,也就是主线程。


贴出我的写法
        private void FormStart()//声明一个发开Form2的方法
        {
            Application.Run(new Form2());//运行1个新的程序窗口   

        }  
        private void button1_Click(object sender, EventArgs e)//form1的按钮点击事件
        {
            Thread thread = new Thread(new ThreadStart(FormStart));//这里可能有人看不懂,ThreadStart方法参数是上面那个方法名,对方法被作为参数了,如果你看过委托就会了,当然这里不是讨论委托。
            thread.Start();//定义1个线程;执行FormsStrat函数; 
            this.Close();
        }
用到了线程来写。添加引用using System.Threading;就这么简单。很多人不会做系统重新登陆,用这个方法也可以做的。

#38


你可以在Program.cs文檔中這樣寫
方法1:
static void main()
{
   form1 frm=new form1();
   application.run(frm);
   if(frm.DialogResult==dialogresult.ok)
       application(new form2());
}

form1中的button click 事件
{
   this.dialogresult=dialogresult.ok;
   this.close();
}
方法2:
用線程做
private void openForm()
{
   form2 frm=new form2();
   frm.showdialog();
}

form1 button click事件
{
  thread t=new thread(openform);
  t.start();
}

方法上為樓上

#39


如果做登录窗口,17楼的才是正解
application.run的才是真正的主窗口,即主消息循环,登录对话框是不应该通过application.run的方式运行然后隐藏的,这是很不好的编程习惯

#40


更本没必要这样。、直接跳转
 Response.Redirect("跳转的页面");

#41


在主窗口的load函数中写代码:
Form2 form2=new Form2();
form2.form1=this;
form2.show();
this.visible=false;
//
//
在登陆窗口的Button的Click事件函数中写代码:(Form2中有个类型为主窗口form1的属性)
form1.visible=true;
this.close();

#42


将form的引用放在主窗口
Form2中代码:
mainform.form3 = new Form3();
form3.show();
this.Close();

#43


我 在 winform 中 遇到 这样的问题

一个窗体上 的控件要是超过20个的话(这些控件 都有背景图片)
在首次显示时 会出现 绘制刷屏
如果在该窗体显示后再最小化再最大化后
还会出现这样的效果


然后为了减轻这样的负面效果
我试用了下面的方法


frm.RightToLeft = RightToLeft.Yes;
frm.RightToLeftLayout = true;

frm.BackgroundImage = Common.GetImageByPath(string.Format(DPPath,btn.Tag));


但是主窗体的背景图片又绘制不上去……

有没有 别的方法处理 winform 中的 刷屏现象

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
我也用了但是还是那样……

或者说

frm.RightToLeft = RightToLeft.Yes;
frm.RightToLeftLayout = true;
如此设置下 怎么么把窗体的背景图片绘制上去……

据我判断:刷屏现象是应为窗体上的图片太多 我做的这个东东类似“连连看”游戏
本来最适合用C++做,但我已经用winform做了请各位帮帮忙……ss

#44


[align=center]Form1 form = new Form1();
form.show();
this.Dispose(false);[/align]

这个可以!!!

#45


17楼方法真的不错 十分感谢

#46


form2 f2=new form2();
f2.show();
this.hide();
这个方法可以用

#47


还是不行,两个都关了啊!

#48


不能关了第一个吗??只能隐藏??

#49


把Main方法中
Application.Run(new Form1());

改为
static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 f1=new Form1();
            f1.Show();
            Application.Run();
        }

但是这样程序的Exit是个问题。

#50


this.Hide();
FromName form =new FromName();
form.ShowDialog();
this.Close(); 

先隐藏,再关闭。这样子就不会把主窗体也Close了。

#1


form2 f2=new form2();
f2.show();
this.hide();

#2


为什么不能隐藏呢。。。

#3


隐藏占用内存资源啊,所以不隐藏!

#4


引用 1 楼 mdq001 的回复:
form2 f2=new form2(); 
f2.show(); 
this.hide();

只见过隐藏的,学习~

#5


要是隐藏那问题就变得简单了,不过谢谢二位了!大家都一起学习!

#6


form2 f2=new form2(); 
f2.show(); 
this.Dispose(); 

#7


1、窗体设计成一个类。
2、主窗体隐藏并构造自己设计的 窗体对象,并将自己的窗体Show。
3、关闭窗体就是 析构窗体对象。

#8


引用 6 楼 zhaozhijun0207 的回复:
C# codeform2 f2=new form2(); 
f2.show(); 
this.Dispose(); 


这样一样会占资源的..
你FROM2是在这个窗体实例的..FORM2没销毁,WINDOWS是不中释放FORM1的..

#9


晕,楼上好快,我刚写完...

#10


还是不行,两个都关了啊!

#11


form f1=new form();
f1.f1.ShowDialog();
this.hide;

#12


学习一下!!

#13


学习一下。

#14


如果主窗体为Form1,子窗体为Form2

把Form1的属性:isMdicontainer设置为true 

给主窗体中拉进一个botton1;双击(写代码) 
如下: 
Form2 myForm2 = new Form2(); 
myForm2.MdiParent = this; 
this.close();
myForm2.Show();

#15


强调一点,就是不可能打开一个子窗体再把主窗体给关掉,效果是什么都没打开,但程序直接就关闭了~

#16


把主窗体一开始就做成隐藏的,在后台运行,并自动呼叫一个子窗体1~

把一个子窗体1做成貌似主窗体的样子~在他上边呼叫子窗体2~

这样几个子窗体之间关关开开对主窗体都不造成影响了~~

代码不会写,这是觉得应该这样去实现~·不晓得有没有参考价值~学习了。

#17


是否要做登录界面啊?下面是例子,测试通过.
新建项目添加两窗体frmLogin,frmMain,frmLogin窗体中添加两按钮,分别命名为btnOK,btnCancel,按钮代码如下:

   private void btnOK_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
        }


Main方法代码:

/// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            frmLogin login = new frmLogin();
            if (login.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new frmMain());
            }
        }

#18


frm2 fr = new frm2();
fr.show();
this.Visible = false;

#19


最好通过js实现,通过windows弹出窗体实现。Response.Write("<script>alert('" + sMessage + "');window.opener=null;window.close()</script>")

#20


引用 10 楼 guangguang465355249 的回复:
还是不行,两个都关了啊!

别析构主窗体,否则肯定要关的,主窗体隐藏,弹出子窗体,子窗体再切换的时候可以把没用的子窗体析构。

#21


不能关闭主窗体,要不然你就连进程给关了,当然就不能显示第二个窗体了

#22


主窗体是不能被关闭的,否则整个程序将结束,所以你想真正关闭主窗体而运行其他窗体无解。。。其他窗体可以用Close方法关闭,这样也只有一个窗体在运行啊,能占用多少资源??不要哪么偏激。

#23


主窗体用
f2.show(); 
this.hide();
其他子窗体用
f1.show(); 
this.Close();
就可以了

#24


哦,谢谢各位啦!要是可以的话,请帮帮忙!

#25


学习

#26


17楼正解!!!

#27


引用 8 楼 lowsong 的回复:
这样一样会占资源的.. 
你FROM2是在这个窗体实例的..FORM2没销毁,WINDOWS是不中释放FORM1的..


你迄今做的项目,(除了退出程序)有哪个窗体关闭后是完全释放资源的?

#28


把main函数改成

[STAThread]
static void Main()
{
    // 设置需要显式的调用Application.Shutdown 方法调用来停止应用程序。
     // 默认为OnMainWindowClose
    Application.ShutdownMode = ShutdownMode.OnExplicitShutdown;
    Application.Run(new FrmMain());
}

这样进程就不会随着你的主窗体的关闭而关闭了。

#29


引用 17 楼 iStarSoft 的回复:
是否要做登录界面啊?下面是例子,测试通过. 
新建项目添加两窗体frmLogin,frmMain,frmLogin窗体中添加两按钮,分别命名为btnOK,btnCancel,按钮代码如下: 

C# code
   private void btnOK_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = Dia…

正解

#30


帮17楼顶一下

#31


不是做登录界面,我做的只是普通的窗体,不过还是谢谢各位!

#32


隐藏就行了吧,我没见过做关闭的。要么你就启动的时候先启动登录窗体。

#33


17楼可以,我试了~!我之前做登陆页是用隐藏,学习了~!!

#34


16楼想法很好
有新意

#35


多线程不知是否可以

#36


学习

#37


17L,长见识了,我还没看到过这样写登陆界面的呵呵,谢谢。
form2 f2=new form2(); 
f2.show(); 
this.Close 

一般这样写的,会把整个程序关闭,原因是因为Form1拥有Main的UI线程,所以关闭导致整个程序关闭。
一般写登陆简单的是
form2 f2=new form2(); 
f2.show(); 
this.Hide();
就是把它隐藏了。但是要记住,当你MainForm关闭的时候不能this.Close()来关闭程序。
应该 Application .Exit ()来退出,因为前者没有关闭UI线程,也就是主线程。


贴出我的写法
        private void FormStart()//声明一个发开Form2的方法
        {
            Application.Run(new Form2());//运行1个新的程序窗口   

        }  
        private void button1_Click(object sender, EventArgs e)//form1的按钮点击事件
        {
            Thread thread = new Thread(new ThreadStart(FormStart));//这里可能有人看不懂,ThreadStart方法参数是上面那个方法名,对方法被作为参数了,如果你看过委托就会了,当然这里不是讨论委托。
            thread.Start();//定义1个线程;执行FormsStrat函数; 
            this.Close();
        }
用到了线程来写。添加引用using System.Threading;就这么简单。很多人不会做系统重新登陆,用这个方法也可以做的。

#38


你可以在Program.cs文檔中這樣寫
方法1:
static void main()
{
   form1 frm=new form1();
   application.run(frm);
   if(frm.DialogResult==dialogresult.ok)
       application(new form2());
}

form1中的button click 事件
{
   this.dialogresult=dialogresult.ok;
   this.close();
}
方法2:
用線程做
private void openForm()
{
   form2 frm=new form2();
   frm.showdialog();
}

form1 button click事件
{
  thread t=new thread(openform);
  t.start();
}

方法上為樓上

#39


如果做登录窗口,17楼的才是正解
application.run的才是真正的主窗口,即主消息循环,登录对话框是不应该通过application.run的方式运行然后隐藏的,这是很不好的编程习惯

#40


更本没必要这样。、直接跳转
 Response.Redirect("跳转的页面");

#41


在主窗口的load函数中写代码:
Form2 form2=new Form2();
form2.form1=this;
form2.show();
this.visible=false;
//
//
在登陆窗口的Button的Click事件函数中写代码:(Form2中有个类型为主窗口form1的属性)
form1.visible=true;
this.close();

#42


将form的引用放在主窗口
Form2中代码:
mainform.form3 = new Form3();
form3.show();
this.Close();

#43


我 在 winform 中 遇到 这样的问题

一个窗体上 的控件要是超过20个的话(这些控件 都有背景图片)
在首次显示时 会出现 绘制刷屏
如果在该窗体显示后再最小化再最大化后
还会出现这样的效果


然后为了减轻这样的负面效果
我试用了下面的方法


frm.RightToLeft = RightToLeft.Yes;
frm.RightToLeftLayout = true;

frm.BackgroundImage = Common.GetImageByPath(string.Format(DPPath,btn.Tag));


但是主窗体的背景图片又绘制不上去……

有没有 别的方法处理 winform 中的 刷屏现象

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
我也用了但是还是那样……

或者说

frm.RightToLeft = RightToLeft.Yes;
frm.RightToLeftLayout = true;
如此设置下 怎么么把窗体的背景图片绘制上去……

据我判断:刷屏现象是应为窗体上的图片太多 我做的这个东东类似“连连看”游戏
本来最适合用C++做,但我已经用winform做了请各位帮帮忙……ss

#44


[align=center]Form1 form = new Form1();
form.show();
this.Dispose(false);[/align]

这个可以!!!

#45


17楼方法真的不错 十分感谢

#46


form2 f2=new form2();
f2.show();
this.hide();
这个方法可以用

#47


还是不行,两个都关了啊!

#48


不能关了第一个吗??只能隐藏??

#49


把Main方法中
Application.Run(new Form1());

改为
static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 f1=new Form1();
            f1.Show();
            Application.Run();
        }

但是这样程序的Exit是个问题。

#50


this.Hide();
FromName form =new FromName();
form.ShowDialog();
this.Close(); 

先隐藏,再关闭。这样子就不会把主窗体也Close了。