在对表单加载进行一些检查时,如何显示“loading ...”之类的内容?

时间:2012-01-14 19:08:32

标签: c# .net events

我对表单加载进行了一些检查,但它将表单锁定一段时间(千分之几秒)。出于这个原因,我想显示一条消息,如“正在加载应用程序..”,但我不知道我是如何做到的。我希望这清楚!非常感谢任何帮助。提前谢谢。

5 个答案:

答案 0 :(得分:10)

理想情况下,您要做的是在后台线程上执行检查,以便不阻止UI线程。看看BackgroundWorker课程。

您应该将检查挂钩到后台工作程序的DoWork事件,并从Form_Load事件中调用BackgroundWorker的RunWorkerAsync()方法以启动后台工作。

像这样的东西(注意,这是未经测试的):

BackgroundWorker bw = new BackgroundWorker();
public void Form_Load(Object sender, EventArgs e) {
    // Show the loading label before we start working...
    loadingLabel.Show();
    bw.DoWork += (s, e) => {
       // Do your checks here
    }
    bw.RunWorkerCompleted += (s, e) => { 
       // Hide the loading label when we are done...
       this.Invoke(new Action(() => { loadingLabel.Visible = false; })); 
    };
    bw.RunWorkerAsync();
}

答案 1 :(得分:2)

您可以创建另一个线程来显示加载消息。

首先你需要一个布尔。

bool loading = true;

创建一个类似的线程:

Thread myThread = new Thread(new ThreadStart(Loading));
myThread .Start();

然后有一个方法:

private void Loading()
{
    while(loading)
    {
        //Display loading message here.
    }
}

当您完成加载任何刚设置加载为false并且胎面将终止时。

答案 2 :(得分:2)

查看BackgroundWorker组件。你根本不需要任何线程知识。

答案 3 :(得分:2)

这可以通过显示在另一个线程上执行的单独表单来轻松完成。在这种形式(称为frmSplash)中,您可以放置​​动画gif或静态文本。您需要的代码如下所示:

在课后声明一些变量。

public partial class frmMain : Form
{
   public Thread th1;
   static frmSplash splash;
   const int kSplashUpdateInterval_ms = 1;

// Rest of code omitted

然后将以下方法添加到主窗体。这会启动启动画面:

static public void StartSplash()
{
    // Instance a splash form given the image names
    splash = new frmSplash(kSplashUpdateInterval_ms);

    // Run the form
    Application.Run(splash);
} 

接下来,您需要一种关闭启动画面的方法:

private void CloseSplash()
{
    if (splash == null)
        return;

    // Shut down the splash screen
    splash.Invoke(new EventHandler(splash.KillMe));
    splash.Dispose();
    splash = null;
} 

然后,在您的主要表单加载中,执行以下操作:

private void frmMain_Load(object sender, EventArgs e)
{
    try
    {
        Thread splashThread = new Thread(new ThreadStart(StartSplash));
        splashThread.Start();

        // Set the main form invisible so that only the splash form shows
        this.Visible = false;

        // Perform all long running work here. Loading of grids, checks etc.
        BindSalesPerson();
        BindCustomer();
        BindBrand();

        // Set the main form visible again
        this.Visible = true;
    }
    catch (Exception ex)
    {
        // Do some exception handling here
    }
    finally
    {
        // After all is done, close your splash. Put it here, so that if your code throws an exception, the finally will close the splash form
        CloseSplash();
    }

} 

然后,如果主窗体已关闭,请确保您的启动画面也已关闭:

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    // Make sure the splash screen is closed
    CloseSplash();
    base.OnClosing(e);
} 

Splash表单的代码(在frmSplash.cs中)如下:

public partial class frmSplash : Form
{

    System.Threading.Timer splashTimer = null;
    int curAnimCell = 0;
    int numUpdates = 0;
    int timerInterval_ms = 0;

    public frmSplash(int timerInterval)
    {
        timerInterval_ms = timerInterval;

        InitializeComponent();
    } 


    private void frmSplash_Load(object sender, EventArgs e)
    {
        this.Text = "";
        this.MaximizeBox = false;
        this.MinimizeBox = false;
        this.ControlBox = false;
        this.FormBorderStyle = FormBorderStyle.None;
        this.Menu = null;
    } 

    public int GetUpMilliseconds()
    {
        return numUpdates * timerInterval_ms;
    }

    public void KillMe(object o, EventArgs e)
    {
        //splashTimer.Dispose();

        this.Close();
    }        
}

我希望这会对你有所帮助。它可能不是有史以来最好的代码,但它对我有用。

答案 4 :(得分:0)

你需要在这里创建一个frmloading的表单..你需要创建该表单的对象并使用线程概念调用..并在FrmLoading中放置一个Picturebox并在其中设置.gif图像。

meta_value : a:1:{i:0;a:4:
 {s:11:""optionLabel"";s:7:""Address"";s:11:""optionValue"";s:21:""Dune du Pilat, 
  France"";s:9:""optionUrl"";s:0:"""";s:22:""optionlabelordernumber"";s:1:""1"";}} 

如上图所示,您需要创建PleaseWait类。

PleaseWait.cs

FrmLoading f2 = new FrmLoading();
using (new PleaseWait(this.Location, () =>MethodWithParameter())) {      f2.Show(this); }
f2.Close();