2011-06-09 36 views
1

你好的人IM填充數據網格當的形式加載事件是這樣的:要顯示的動畫,同時datagridview的與數據填充

private void Inventory_Load(object sender, EventArgs e) 
    { 

     AcidDBDataContext db = new AcidDBDataContext(); 

     BindingSource bs = new BindingSource(); 
     bs.DataSource = db.GetProducts.ToList(); 

     dgvInventory.DataSource = bs; 
     ProductBindingNavigator.BindingSource = bs; 

     ShowtoolStripButton2.Visible = false; 

     foreach (DataGridViewColumn c in dgvInventory.Columns) 
     { 
      c.DefaultCellStyle.Font = new Font("Arial", 12.0F, GraphicsUnit.Pixel); 
     } 

    } 

其工作正常,但有一個問題我需要幾秒鐘,我的形式被凍結。如何,而我的DataGrid是填補顯示加載動畫我可以做的,當電網將使用C#的WinForms充滿隱藏動畫

林。 謝謝了很多

+0

什麼需要大部分時間,從數據庫中提取結果或顯示它們? – stuartd 2011-06-09 14:27:01

+0

是的。執行查詢。我有本地數據庫呢 – 2011-06-09 14:38:35

回答

3

你可以看看BackgroundWorkerThreads。

http://www.albahari.com/threading/part3.aspx

我用他們相當多的同時檢索數據。我會顯示一個等待欄,調用將數據檢索到數據集中的DoWork事件(對於我們來說,這通常需要比將附加數據添加到網格更長的時間),然後在RunWorkerCompleted事件中,我將數據附加到網格並隱藏等待吧。該應用程序仍然凍結了幾秒鐘,但沒有那麼長。

下面是一些示例代碼。基本上,鎖定字段可能會導致RefreshInventory再次被調用(但是因爲您在啓動時加載可能不適用於您)。然後檢索線程中的數據並在線程完成時附加它。

public void RefreshInventory() 
{ 
    // Lock any fields you want to lock during the update process 
    // Display some kind of waiting or progress bar 
    if (!bkgdWrkInventory.IsBusy) 
     bkgdWrkInventory.RunWorkerAsync(); 
} 

private void bkgdWrkInventory_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var db = new AcidDBDataContext(); 
    e.Result = db.GetProducts.ToList(); 
} 

private void bkgdWrkInventory_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error == null) // Check for errors 
    { 
     dgvInventory.DataSource = (List<Product>)e.Result; 
    } 
    else 
    { 
     // Show the error to the user 
    } 

    // Hide the waiting indicator 
    // Unlock the fields 
}