第二个FORM,主要是一个动态图片,显示加载中。
想要实现的结果是:点开第一个页面时,准备从数据库获取数据绑定,这时先弹出第二个FORM,显示数据加载中,然后第一个FORM在后台或者其他进程中加载数据,当DATAGRIDVIEW数据加载完成后,关闭掉第二个FORM。
求这样一个方案,最好有代码实现,感谢。
主要过程如下代码所示:
private void frm1_load(object sender, EventArgs e)
{
//弹出FORM2 ,显示加载中
Form frm2 = new Form();
frm2.ShowDialog();
//FORM1 后台进行数据加载
LoadData(frm1.dataGridView1);
//加载完成后关闭FORM2
frm2.Close();
}
7 个解决方案
#1
可以把Form2显示扔到一个线程里,然后用标志位判读是否需要关闭Form2。但Form2显示必须用show(),而不是showdialog()。
大致代码如下:
void form1_Load(xxxxx) // form1的load事件
{
bool flag = false;
Form2 frm2 = new Form2();
frm2.StartPosition = xxx.centerscreen;
Task task = Task.Factory.StartNew(() =>
{
frm2.Show();
while(!flag)
{ Thread.Sleep(100);}
frm2.Close();
frm2.Dispose();
});
LoadData(frm1.dataGridView1);
flag = true;
}
缺点是:form2不能移动操作。
大致代码如下:
void form1_Load(xxxxx) // form1的load事件
{
bool flag = false;
Form2 frm2 = new Form2();
frm2.StartPosition = xxx.centerscreen;
Task task = Task.Factory.StartNew(() =>
{
frm2.Show();
while(!flag)
{ Thread.Sleep(100);}
frm2.Close();
frm2.Dispose();
});
LoadData(frm1.dataGridView1);
flag = true;
}
缺点是:form2不能移动操作。
#2
frm2.ShowDialog();
->
frm2.Show();
主界面加载完调用Hide
->
frm2.Show();
主界面加载完调用Hide
#3
由于FORM2 里面主要是包含一张动态图,显示数据加载中,不让界面FORM1呈现假死状态,同时让用户等待后续操作。如果用SHOW的话,动图显示不出来。 我之前也是用的SHOW,就是因为显示不出来动图,才改为ShowDialog的。
#4
版主说的主界面加载完,这里如何判断的?
#5
我用你这种方法测试了,是可以实现,但是有个问题,FORM2 只是闪现就没有了,大数据加载界面也会出现假死的情况。
看来这种方法实现难度比较大。 我把FORM2 去掉,在FORM1上加一个PritureBox,放上动图。 平时隐藏,加载数据的时候显示出来,这样也可以实现。
主要代码如下:
private void tsBtnLoad_Click(object sender, EventArgs e)
{
this.pictureBox1.Visible = true;
this.dataGridView1.DataSource = null;
//建立委托
MyDelegate myDelegate = new MyDelegate(LoadData);
//异步调用委托,获取计算结果
IAsyncResult result = myDelegate.BeginInvoke(null,null);}
在数据绑定完成后,隐藏动图。
string LoadData()
{
string sql = string.Format(@"SELECT TOP (100000) id AS ID, name AS NAME, seq_no AS SEQUENCE, description, last_update_date AS L_TIME
FROM test_t ORDER BY ID ");
DataTable dt = db.GetTableInfoBySQL(sql, db.sqlDB);
if (dt != null)
{
setData(dt);
}
//数据加载完成后,隐藏动图
pictureVisible("a");
return "OK";
}
#6
你的代码执行完,在后面加上调用。
#7
这个应该对的 不管webfrom 还是winfrom 处理类似的 一般都是多线程 可以找下载进度条的实例看看
#1
可以把Form2显示扔到一个线程里,然后用标志位判读是否需要关闭Form2。但Form2显示必须用show(),而不是showdialog()。
大致代码如下:
void form1_Load(xxxxx) // form1的load事件
{
bool flag = false;
Form2 frm2 = new Form2();
frm2.StartPosition = xxx.centerscreen;
Task task = Task.Factory.StartNew(() =>
{
frm2.Show();
while(!flag)
{ Thread.Sleep(100);}
frm2.Close();
frm2.Dispose();
});
LoadData(frm1.dataGridView1);
flag = true;
}
缺点是:form2不能移动操作。
大致代码如下:
void form1_Load(xxxxx) // form1的load事件
{
bool flag = false;
Form2 frm2 = new Form2();
frm2.StartPosition = xxx.centerscreen;
Task task = Task.Factory.StartNew(() =>
{
frm2.Show();
while(!flag)
{ Thread.Sleep(100);}
frm2.Close();
frm2.Dispose();
});
LoadData(frm1.dataGridView1);
flag = true;
}
缺点是:form2不能移动操作。
#2
frm2.ShowDialog();
->
frm2.Show();
主界面加载完调用Hide
->
frm2.Show();
主界面加载完调用Hide
#3
由于FORM2 里面主要是包含一张动态图,显示数据加载中,不让界面FORM1呈现假死状态,同时让用户等待后续操作。如果用SHOW的话,动图显示不出来。 我之前也是用的SHOW,就是因为显示不出来动图,才改为ShowDialog的。
#4
版主说的主界面加载完,这里如何判断的?
#5
我用你这种方法测试了,是可以实现,但是有个问题,FORM2 只是闪现就没有了,大数据加载界面也会出现假死的情况。
看来这种方法实现难度比较大。 我把FORM2 去掉,在FORM1上加一个PritureBox,放上动图。 平时隐藏,加载数据的时候显示出来,这样也可以实现。
主要代码如下:
private void tsBtnLoad_Click(object sender, EventArgs e)
{
this.pictureBox1.Visible = true;
this.dataGridView1.DataSource = null;
//建立委托
MyDelegate myDelegate = new MyDelegate(LoadData);
//异步调用委托,获取计算结果
IAsyncResult result = myDelegate.BeginInvoke(null,null);}
在数据绑定完成后,隐藏动图。
string LoadData()
{
string sql = string.Format(@"SELECT TOP (100000) id AS ID, name AS NAME, seq_no AS SEQUENCE, description, last_update_date AS L_TIME
FROM test_t ORDER BY ID ");
DataTable dt = db.GetTableInfoBySQL(sql, db.sqlDB);
if (dt != null)
{
setData(dt);
}
//数据加载完成后,隐藏动图
pictureVisible("a");
return "OK";
}
#6
你的代码执行完,在后面加上调用。
#7
这个应该对的 不管webfrom 还是winfrom 处理类似的 一般都是多线程 可以找下载进度条的实例看看