2011-06-09 33 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 
}