Cancel form load

2020-03-24 06:24发布

I have the following code :

This call the second form

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

This is the constructor

    public Update()
    {
        InitializeComponent();
    }

This is the load

    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();
        }
    }

My problem is, that when the function result is 2 or 3 the form show up for millisecond and then close (flashing). I want the form to not flash. Is it possible?

I tried to use this.Hide(), this.Visible = False but nothing helped.

EDIT: I put the original code EDIT2: Put more code

6条回答
做自己的国王
2楼-- · 2020-03-24 06:55

You can hide the form before loading and then set it back to visible in your if else conditions. e.g:

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

And then:

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();
        }
查看更多
小情绪 Triste *
3楼-- · 2020-03-24 06:59

You should probably do whatever check you're performing before you choose to open the form in the first place.

So something like:

if(funct() == "1")
{
    var form = new Form();
    form.ShowDialog();
}
查看更多
够拽才男人
4楼-- · 2020-03-24 07:07

Maybe hide it first, then only show it if funct() == "1":

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

    if (funct() == "1")
        MessageBox.Show("Something");
}
查看更多
放我归山
5楼-- · 2020-03-24 07:09

try this

private void Form_Load(object sender, EventArgs e) 
{ 
   switch(funct())
   {
      case 2:
         this.Close();
          break;
      case 3:
          this.Close();
           break; 
     default:
           MessageBox.Show("Something");
   }   
}
查看更多
三岁会撩人
6楼-- · 2020-03-24 07:13

The best way to do so :

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");
   }   
}
查看更多
手持菜刀,她持情操
7楼-- · 2020-03-24 07:14

I assume Update_Load is your FormLoad Handler? That is called after your form has been displayed. If you don't want to display it, that's too late. Change your updateToolStripMenuItem_Click to this:

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.");
}

And change your Update_Load to:

WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync(new Uri(dlUrl), "");
查看更多
登录 后发表回答