C# 按Button弹出新的窗体 Show()方法 和 ShowDialog()方法

在做串口通信程序时,有个想法,当点击串口设置按钮时,弹出一个新的窗口,可以设置串口相关信息,如何实现这一操作呢?

1 新建一个项目,窗体为form1

 2 选择项目名称,单击右键,选择【添加】→【窗体】,弹出新的界面。

3 在新的界面,选择【窗体(windows 窗体】→【添加】,生成“form2”窗体。

 4 在form1的窗口中拖入一个button按键,修改text的属性为 切换窗体2

5 双击 切换窗体2 按键,进入代码编写界面,插入代码 


        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.ShowDialog();
        }

6 运行结果

 按form1 切换窗口2按键,弹出form2,由于我们用的是 ShowDialog(); 所以此时,主窗口是form2,只能编辑form2的内容,点击 退出按键,才能回到form1编辑。

7 下面我们介绍 Show()方法 和 ShowDialog()方法 都可以弹出我们想要的窗口,但是他们的效果明显不同,可以小结概述为下面几个方面差异。

 注意:Show()和Hide() 是一对,ShowDialog()和Close()是一对。 请一一对应,不能混用的哦。

有兴趣的可以搭个程序试试

先建立两个基本窗口,如下图,(右边)是主窗口,会先启动,其次是弹出界面Dialog(左边)。

 主窗口代码:

public Form1()
{
    InitializeComponent();            
}        
//实例化主窗口类,当然也可以直接写
Dialog _dlg = new Dialog();
 
private void button_show_Click(object sender, EventArgs e)
{           
    _dlg.Show();//显示子窗口
}
 
private void button_hide_Click(object sender, EventArgs e)
{          
    _dlg.Hide();//隐藏子窗口
}
 
private void button_showDialog_Click(object sender, EventArgs e)
{
    //实例化子窗口类,一定要实例化,不然不能弹出
    Dialog _dialog = new Dialog();
    //弹出对话框
    _dialog.ShowDialog();
}

弹出窗口代码:

public Dialog()
{
    InitializeComponent();
}
 
private void button_ok_Click(object sender, EventArgs e)
{
    //指定返回结果
    this.DialogResult = DialogResult.OK;
    //关闭
    this.Close();
}
 
private void button_cancel_Click(object sender, EventArgs e)
{
    //指定返回结果
    this.DialogResult = DialogResult.Cancel;
    //关闭
    this.Close();
}
 
private void hide_Click(object sender, EventArgs e)
{
    //隐藏
    this.Hide();
}

8 打开新窗口,如果想关闭原来的界面,可以如下操作


 Form1 form1 = new Form1();//想要打开的窗体界面
 this.Hide();//隐藏当前窗体 
 form1.ShowDialog();
 Application.ExitThread(); //退出当前窗体,这一步很重要,否则最后可能无法将所有进程关闭。最好是在跳转页面后,将之前的页面退出。

  • 34
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中,在while循环中显示窗体需要考虑到线程安全的问题,因为UI线程和后台线程是分离的,不能在后台线程中直接访问UI元素。你需要使用Invoke方法来确保线程安全。以下是一个简单的示例代码: ```csharp private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(ShowForm)); thread.Start(); } private void ShowForm() { Form2 form2 = new Form2(); while (true) { if (this.IsDisposed) { break; } if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => form2.Show())); } else { form2.Show(); } Thread.Sleep(1000); } } ``` 在这个示例中,当用户单击button1按钮时,一个新的线程将启动,并在该线程中调用ShowForm方法。在ShowForm方法中,我们创建并初始化了一个新的Form2窗体,然后进入一个无限循环中。循环中检查当前窗体是否已经被释放,如果已经被释放,则跳出循环。接着,我们使用Invoke方法来将窗体显示操作转发到UI线程。在Invoke方法中,我们使用了一个Lambda表达式来在UI线程上执行窗体显示操作,这样可以避免在UI线程上执行复杂的逻辑。注意,这里使用的是`form2.Show()`而不是`form2.ShowDialog()`,因为后者是模态显示窗体,会阻止用户与其他窗体进行交互。如果你需要模态显示窗体,可以使用`form2.ShowDialog()`。最后,我们调用Thread.Sleep方法来等待一段时间后再次显示窗体
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值