Hello People在表单加载事件时填充datagrid:
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);
}
}
它的工作正常,但有一个问题,我需要几秒钟,我的形式是冻结。当我的数据网格填充显示加载动画时以及当网格将被填充隐藏动画时,我该怎么做
我正在使用C#winForms。 谢谢了很多
答案 0 :(得分: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
}