2012-11-08 71 views
0

我正在寫一個程序,可能需要相當多的加載(5-30秒)。我想要一個以選取框樣式進度條開始的表單,以便用戶知道有些事情正在完成。進度條形式不完全加載

public FrmMain() 
{ 
    var loading = new FrmLoading(); 
    loading.Show(); 

    InitializeComponent(); 

    // other start up code here 

    loading.Close() 
} 

現在,loading彈出來就好了。問題在於標籤和進度條沒有任何顯示,而且看起來好像正在崩潰。我查看了BackgroundWorker,但說實話,我並沒有完全理解如何爲我做這項工作。我試圖按照教程和例子在:

但我的頭只是沒有抓住它。有沒有其他方法可以正確加載表單?感謝任何和所有的幫助。

編輯

BackgroundWorker嘗試包括我創造它進行全在我FrmMain都做的動作的函數。所以,我有:

public FrmMain() 
{ 
    Loading = new FrmLoading(); 
    Loading.Show(); 

    backgroundWorker1.RunWorkerAsync(); 
} 

private void FormLoading() 
{ 
    // Initialize and loading elements of the form 
    InitializeComponent(); 
} 
private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e) 
{ 
    FormLoading(); 
} 

private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Loading.Close(); 
} 

但我一直在backgroundWorker1.RunWorkerAsync();

+1

這正是使用後臺工作者的情況。請說明您使用該解決方案時遇到的問題。一般的做法很簡單。構造函數顯示加載表單,啓動後臺工作,'DoWork'事件執行長時間運行的任務,並且完成的事件關閉加載表單。技術上還有其他一些方法,例如使用任務,異步/等待,直接線程訪問等,但如果您在BGW中遇到問題,那麼使用這些方法會更困難,更不容易。 – Servy

+0

問題是您正在執行主(UI)線程中的所有處理。當你這樣做時,線程沒有機會繪製控件,Windows認爲你的應用程序被卡住了。正如@Servy寫的,你應該在後臺線程(一個'BackgroundWorker'適合於這個)中進行處理,然後在完成時返回主線程。 – Groo

+0

編輯顯示'BackgroundWorker'嘗試。 – MyCodeSucks

回答

1

越來越NullReferenceException一個鮮爲人知的或經常被遺忘的框架庫是Microsoft.VisualBasic程序。您可以將它與C#應用程序一起使用。只需添加一個Reference ...和這個類。它處理所有後臺工作者線程和其他。

public class MyApplication : WindowsFormsApplicationBase 
{ 
    private static MyApplication _application; 

    public static void Run(Form form) 
    { 
     _application = new MyApplication{ MainForm = form }; 
     _application.Run(Environment.GetCommandLineArgs()); 
    } 

    protected override void OnCreateSplashScreen() 
    { 
     this.SplashScreen = new MySplashScreenForm(); 
    } 
} 

最後,改變從Program.Main下的應用程序啓動():

Application.Run(new Form1()); 

MyApplication.Run(new Form1()); 

如果你不熟悉,此類還提供了更多的功能,如單實例處理,絕對值得一看。

+0

你能詳細解釋一下嗎?我正在嘗試整合一個進度條,只是爲了顯示幾秒鐘。問題出在表單加載的時候(稱爲加載報表),它沒有關閉。它保持那樣。這個帶有進度條的表單需要在應用程序啓動時加載NOT,但是當用戶單擊特定的報表時。報告需要運行,並且在數據庫執行過程中,進度條需要顯示。謝謝! – Aqua267

+0

@Veena這個答案是特定於應用程序加載。 Google'C#進度對話框'爲您的需求提供一些很好的信息,例如:http://csharpmentor.blogspot.com/2009/05/threading-modal-progress-dialog-and.html –

0

或許這將幫助:

添加:

Shown += new EventHandler(Form1_Shown); 

InitializeComponent();後。

並添加:

void Form1_Shown(object sender, EventArgs e) 
{ 
    Refresh(); 
} 

另外,如果你沒有訂閱Designer中BackgroundWorker1DoWork事件處理程序,您必須添加:

backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); 
0

我最終什麼事做可能不夠優雅,但它完成了我所需要的。

public FrmMain() 
{  
    InitializeComponent(); 

    backgroundWorker1.RunWorkerAsync(); 

    var loading = new FrmLoading(); 
    loading.ShowDialog(); 
} 

private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e) 
{ 
    DbQuery(); 
} 

private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Loading.Close(); 
} 

這會調出我的loading表格,以便它具有焦點並完全加載。由於我在撥打ShowDialog()之前撥打了DoWorkBackgroundWorker繼續工作。一旦完成DbQuery(),它會調用BackgroundWorker1RunWorkerCompleted(),這會關閉我的FrmLoading並繼續執行我的程序。感謝所有發佈的人。