【问题标题】:Close a Form with a twist [duplicate]关闭一个扭曲的表格[重复]
【发布时间】:2014-07-31 19:10:40
【问题描述】:

我想要一个在某些进程运行时显示的表单,然后在完成后关闭。在我的解决方案中,当我运行 this.Close() 方法并且表单不显示时出现异常。我真的不想为此运行第二个线程。

这是我打开表单的方式:

app appFourm = new app();
appFourm.ShowDialog();

这是表格中的代码:

  namespace App
    {
        public partial class app: Form
        {
            public app()
            {

                InitializeComponent();
                // do some stuff
                this.Close();

            }...(more sudo code)

【问题讨论】:

  • 所以基本上你想要一个Splash screen
  • 在自己的构造函数中关闭表单通常不是一个好主意。如果您的示例有效,则表单将在 调用 ShowDialog 方法之前关闭。
  • 不再像一个带有 ProgressBarStyle.Marquee 的“工作”屏幕
  • 永远 - 这个。关闭在一个函数中...
  • 屏名无关,后面的主要代码都一样。

标签: c# forms


【解决方案1】:

在您的 Program.cs 中创建一个表单实例,调用 Show()。 加载主表单后,请关闭()它。

你不能从它自己的构造函数中处理一些东西,这就是你得到错误的原因。

【讨论】:

  • this.close 在它自己的方法中,但我认为规则仍然适用,因为该方法是在构造函数中调用的
【解决方案2】:

您可以使用表单的Activated 事件。我使用了一个带有标签label1 的表单form2 来显示一些进度。它的工作原理是这样的:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();

        Activated += Form2_Activated;
        label1.Text = "Initialised";
    }

    private void Form2_Activated(object sender, EventArgs e)
    {
        // Call methods to do work from here, for example:

        label1.Text = "Working ...";
        Refresh();

        System.Threading.Thread.Sleep(500);
        label1.Text = "Still Working ...";
        Refresh();

        System.Threading.Thread.Sleep(500);
        label1.Text = "Done!";
        Refresh();

        System.Threading.Thread.Sleep(500);
        this.Close();
    }
}

现在您可以调用它,它会完成工作并显示进度,然后在完成后关闭。

Form2 f = new Form2();
f.ShowDialog();

【讨论】:

  • 如果您想在最终代码中延迟线程,那么您可能需要考虑使用Task.Delay() 而不是Thread.Sleep()。查看this article 以获得更深入的解释。
猜你喜欢
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多