我正在使用WeifenLuo dockpanel-suit。
我需要在SQL完成加载数据之前显示某种启动表单或加载消息。
我尝试过的工作
public partial class frmPostventa : DockContent
{
private void frmPostventa_Load(object sender, EventArgs e)
{
bool done = false;
ThreadPool.QueueUserWorkItem((x) =>
{
using (var splashForm = new SplashForm())
{
splashForm.Show();
while (!done)
Application.DoEvents();
splashForm.Close();
}
});
//Database task heavy load
cargarDatos();
done = true;
}
public void cargarDatos()
{
string strSQL = "exec SAI_ALGO.spPostventa";
SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQL, strCon);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
// Populate a new data table and bind it to the BindingSource.
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);
bindingSource1.DataSource = table;
}
}
编辑:添加了CargarDatos()
答案 0 :(得分:0)
DoEvents()
几乎总会导致一个非常糟糕的地方,并且几乎总是应该避免。这个特定实现的问题在于,长时间运行的进程(cargarDatos()
)将阻塞UI线程直到它完成,因此DoEvents()
将不起作用;它不会在执行时中断一个方法(假设cargarDatos()
不在内部做一些会产生线程的东西)。此外,从某个后台线程创建UI控件并与之交互在此处无效。
您应该使用BackgroundWorker
执行长时间运行操作并向UI提升状态更新:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx