C#高手请出招 Treeview Datagridview问题

来源:百度知道 编辑:UC知道 时间:2024/06/03 17:26:44
我想实现这样的功能:点击Treeview结点,Datagridview就会显示相应的数据。由于数据查询比较慢,大约需要6秒钟,所以点击Treeview后就出现“假死机”的情况。于是,我加了一个lable,显示"正在检索数据……"用来提示程序正在运行。但是这个lable怎么在执行数据库查询前不显示啊,Datagridview显示后lable才显示,然后又被清空。C#语句不是按顺序执行的吗?请问高手,我应该怎样实现这样的功能?
public void treeView1_AfterSelect(object sender, TreeViewEventArgs e)//选中tree结点
{
lable1.text=“正在检索数据……”;
...........
//数据库查询等
dataGridView1.DataSource = ds.Tables[0].DefaultView;
//这句几乎占用了程序执行的全部时间
.........
lable1.text="";//Datagridview显示数据后将lable清空
}
不知道大家看明白我的意思没有。请高手出招。
我也尝试过多线程,但是新线程要操作主线程中的lable1,也要用到主线程,(跨线程操作控件必须的),所以没有什么效果,和用单线程是一样的。 1号专家说的我一点都不懂,太深奥了,可不可以说的简单点啊。 我想问一下C#语句是不是逐条运行的? 请高手给两句代码提示一下。我做的是winform程序。不是web。谢谢大家。

Application.DoEvents();
因为程序虽然已经运行,但是界面并没有相应。让他相应一下就行了。
lable1.text=“正在检索数据……”;
...........

Application.DoEvents();

dataGridView1.DataSource = ds.Tables[0].DefaultView;

.........
lable1.text="";//Datagridview显示数据后将lable清空

可以试用backgroundWorker控件
在设计界面双击backgroundWorker1控件
先在Form_Load里写上
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
这句话是为了跨线程访问控件时不会报异常
双击设计界面上的backgroundWorker1会生成一个private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)方法
可以把你的查询写在这里边
然后在public void treeView1_AfterSelect(object sender, TreeViewEventArgs e)方法中写入
TreeView1.Enabled=false;
这样是为了防止反回查询前再按到节点
backgroundWorker1.RunWorkerAsync();
开始backgroundWorker1的工作
事件列表里还有RunWorkerCompleted事件
backgroundWorker1_RunWorkerCompleted方法,是在线程完成时调用的
可以在里边写入
lable1.text="";
TreeView1.Enabled=true;等

如果是数据查询比较慢,你