此代码允许在加载数据之前加载表单,但表单上的某些组件(如按钮和datagridview本身)在加载数据之前是“不可见的”。
如何解决此问题?
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(delegate()
{
this.Invoke(new MyDelegate(delegate()
{
ReadXml(path);
Bind();
}));
}));
t.Start();
}
private void Bind()
{
dataGridView1.DataSource = table;
}
我还有其他更好的代码,但要求我使用2个新线程。这不是最好的方法,可以吗?
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(delegate()
{
this.Invoke(new InvokeDelegate(delegate()
{
Thread t2 = new Thread(new ThreadStart(delegate()
{
ReadXml(path);
}));
t2.Start();
t2.Join();
Bind();
}));
}));
t.Start();
}
答案 0 :(得分:2)
表单计时器(不是系统计时器)将在触发之前让所有其他消息进行处理。
给它一个100-250毫秒的间隔; 在设计器中将其设置为enabled = false; 在form_load事件中将其设置为enabled = true。 在timer_tick事件中,使第一行timer.enabled = false。 之后(仍然在tick事件中)加载你的网格。
答案 1 :(得分:1)
如果使用BeginInvoke()而不是Invoke(),则委托中的代码将在当前UI线程上执行,但直到所有当前UI工作挂起完成后才会发生(如当前的Form1_Load调用)。 Invoke是一个同步调用,这就是你需要线程的原因。
void Form1_Load(object sender, EventArgs e)
{
this.BeginInvoke(new MyDelegate(delegate()
{
ReadXml(path);
Bind();
}));
}