取消表单加载

6
我有以下代码:

这里调用了第二个表格

private void updateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Update fm = new Update();
            fm.ShowDialog();
        }

这是构造函数。
    public Update()
    {
        InitializeComponent();
    }

这是负载。
    private void Update_Load(object sender, EventArgs e)
    {
        String ver = checkver();
        if (ver == "update")
        {
            if (RemoteFileExists(dlUrl) == true)
            {
                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                webClient.DownloadFileAsync(new Uri(dlUrl), "");
            }
            else
                MessageBox.Show("An error occurred. Please try later.");
        }
        else if (ver == "newest")
        {
            MessageBox.Show("You are currently using the newest version.");
            this.Close();
        }
        else
        {
            this.Close();
        }
    }

我的问题是,当函数结果为2或3时,表单会闪现一下就关闭。我希望表单不要闪现。这可能吗?
我尝试使用this.Hide()、this.Visible = False,但都没有帮助。
编辑:我放了原始代码 编辑2:放了更多代码

哈哈,发生了什么?为什么我不能写“大家好”? :) - a1204773
把代码放在窗体构造函数中怎么样?这个函数会在窗体加载事件发生之前被调用(具体取决于 funct() 函数的操作... 如果它依赖于尚未初始化的组件,则此方法将无法正常工作)。 - Jason Down
你应该只调用一次 funct() 函数,这样你要切换的值就保证是相同的,除非你特别想让它有可能改变。 - 3Pi
1
@Loclip 为什么我不能写“Hello guys”?-> http://meta.stackexchange.com/a/93989/147640 - GSerg
你能把 checkver 移到类外面,这样在显示表单之前就可以检查它吗?听起来这个逻辑不应该放在表单内部。 - Jason Down
显示剩余3条评论
6个回答

10

你可以在加载之前隐藏表单,然后在你的if else条件中将其重新设置为可见。例如:

            MyForm myForm = new MyForm();
            myForm.Opacity = 0;
            myForm.Show();

然后:

if (ver == "update")
        {
            if (RemoteFileExists(dlUrl) == true)
            {
               myForm.Opacity = 100;
               ...

            }
            else
                MessageBox.Show("An error occurred. Please try later.");
        }
        else if (ver == "newest")
        {
            MessageBox.Show("You are currently using the newest version.");
            this.Close();
        }
        else
        {
            this.Close();
        }

3
虽然这种解决方法可行,但你真的不应该在表单内调用 checkver 函数。这个逻辑应该属于一个单独的类,在决定是否显示表单之前应该进行检查。将表单的不透明度设置为0是一个不太好的解决方法。 - Jason Down
但没关系...隐藏做同样的事情 - a1204773
@Loclip:有很多种方式可以解决问题,但如果你希望未来少些维护上的麻烦并且更符合面向对象的设计原则,那么最好将其移出表单。当然,这是你的选择 ;) - Jason Down
1
你不会先开车去加油站,再检查是否需要加油。先检查,如果需要加油再去。只是说一下 :) - Jason Down

4

实现这一目标的最佳方式:

private void Form_Load(object sender, EventArgs e) 
{ 
   switch(funct())
   {
      case 2:
         this.BeginInvoke(new MethodInvoker(this.Close));
          break;
      case 3:
         this.BeginInvoke(new MethodInvoker(this.Close));
           break; 
     default:
           MessageBox.Show("Something");
   }   
}

2

在首次打开表单之前,您应该先进行任何检查。

可以这样做:

if(funct() == "1")
{
    var form = new Form();
    form.ShowDialog();
}

1
我猜测Update_Load是你的FormLoad处理程序?这个程序会在你的窗体显示之后被调用。如果你不想显示它,那就太晚了。请将你的updateToolStripMenuItem_Click更改为以下内容:
String ver = checkver();
if (ver == "update")
{
    if (RemoteFileExists(dlUrl))
    {
        Update fm = new Update();
        fm.ShowDialog();
    }
    else
        MessageBox.Show("An error occurred. Please try later.");
}
else if (ver == "newest")
{
    MessageBox.Show("You are currently using the newest version.");
}

并将您的Update_Load更改为:

WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync(new Uri(dlUrl), "");

0

先隐藏它,然后只有在 funct() == "1" 的情况下才显示:

private void Form_Load(object sender, EventArgs e)
{
    this.Close();

    if (funct() == "1")
        MessageBox.Show("Something");
}

0

试一下这个

private void Form_Load(object sender, EventArgs e) 
{ 
   switch(funct())
   {
      case 2:
         this.Close();
          break;
      case 3:
          this.Close();
           break; 
     default:
           MessageBox.Show("Something");
   }   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接