关于更新WINFORM界面控件的问题

仓木泽 2006-04-13 10:37:27
更新TreeView,因为结点上万,所以使用了异步调用,代码如下:
Delegate d = new ThreadStart(this.BindTree);
tvNode.BeginInvoke(d);
BindTree是绑定树的函数。
但是我这么绑定之后界面还是处于锁死状态。
请做过的给点经验,或者解决方法。
我的主窗体是MDIFrom的父窗体。
...全文
411 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
仓木泽 2006-04-21
  • 打赏
  • 举报
回复
up
alonepb 2006-04-21
  • 打赏
  • 举报
回复
marvelstack 2006-04-21
  • 打赏
  • 举报
回复
以上矫正,楼主可以系统地看下面文章,会有所收获,
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx
marvelstack 2006-04-21
  • 打赏
  • 举报
回复
人民币大写转化函数(C#版)
http://www.cnblogs.com/esshs/archive/2005/03/30/128318.aspx
仓木泽 2006-04-20
  • 打赏
  • 举报
回复
up
-渔民- 2006-04-18
  • 打赏
  • 举报
回复
旁聽
huangguangdou 2006-04-18
  • 打赏
  • 举报
回复
study
仓木泽 2006-04-17
  • 打赏
  • 举报
回复
private void frmMain_Load(object sender, EventArgs e)
{
InitializeCommands();
Delegate d = new ThreadStart(this.BindTree);
tvNode.BeginInvoke(d);
}
以上是窗体加载的时候调用BeginInvoke
private void BindTree()
{
try
{
tvNode.BeginUpdate();
tvNode.Nodes.Clear();

SUYUAN.PBJCXT.BLL.FormMain dept = new SUYUAN.PBJCXT.BLL.FormMain();
SUYUAN.PBJCXT.Collection.S_DEPTINFO cdept = dept.GetDeptList("and BELONGDEPTID=-1");
for(int i = 0;i<cdept.Count;i++)
{
//添加顶级节点
TreeNode topNode = new TreeNode(cdept[i].DEPTNAME);
topNode.Tag = (Object)cdept[i];
//添加次级节点
SUYUAN.PBJCXT.Collection.S_DEPTINFO cdeptSub = dept.GetDeptList("and BELONGDEPTID="+cdept[i].DEPTID+"");
for(int j = 0;j<cdeptSub.Count;j++)
{
TreeNode subNode = new TreeNode(cdeptSub[j].DEPTNAME);
subNode.Tag = (Object)cdeptSub[j];
//添加变电站
SUYUAN.PBJCXT.BLL.FormMain mf = new SUYUAN.PBJCXT.BLL.FormMain();
string sqlstr = " and NodeType = 0 AND DeptId="+ cdeptSub[j].DEPTID;
SUYUAN.PBJCXT.Collection.A_DEVNODEINFO cnode = mf.GetNodeList(sqlstr);
for(int k=0;k<cnode.Count;k++)
{
TreeNode subsubNode = new TreeNode(cnode[k].NODENAME,cnode[k].NODETYPE + 1,cnode[k].NODETYPE + 1);
subsubNode.Tag = (Object)cnode[k];
GetChildNode(subsubNode);
subNode.Nodes.Add(subsubNode);
}
topNode.Nodes.Add(subNode);
}
tvNode.Nodes.Add(topNode);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
tvNode.EndUpdate();
}

}
以上是绑定树的具体代码。其中还有一个递归:
private void GetChildNode(TreeNode node)
{
SUYUAN.PBJCXT.BLL.FormMain mf = new SUYUAN.PBJCXT.BLL.FormMain();
SUYUAN.PBJCXT.Entity.A_DEVNODEINFO dev = (SUYUAN.PBJCXT.Entity.A_DEVNODEINFO)node.Tag;
string sqlstr = " and PId="+ dev.CID;
SUYUAN.PBJCXT.Collection.A_DEVNODEINFO cnode = mf.GetNodeList(sqlstr);
for(int i=0;i<cnode.Count;i++)
{
TreeNode subNode = new TreeNode(cnode[i].NODENAME,cnode[i].NODETYPE + 1,cnode[i].NODETYPE + 1);
subNode.Tag = (Object)cnode[i];
GetChildNode(subNode);
node.Nodes.Add(subNode);
}
}
Samen168 2006-04-14
  • 打赏
  • 举报
回复
非本窗口线程是不能创建新控件的
Knight94 2006-04-14
  • 打赏
  • 举报
回复
你应该用EndInvoke来进行返回

否则,直接调用Invoke即可。
wfhlxl 2006-04-14
  • 打赏
  • 举报
回复
public class AsyncMain {
// Asynchronous method puts the thread id here.
private static int threadId;

static void Main(string[] args) {
// Create an instance of the test class.
AsyncDemo ad = new AsyncDemo();

// Create the delegate.
AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);

// Initiate the asychronous call. Include an AsyncCallback
// delegate representing the callback method, and the data
// needed to call EndInvoke.
IAsyncResult ar = dlgt.BeginInvoke(3000,
out threadId,
new AsyncCallback(CallbackMethod),
dlgt );

Console.WriteLine("Press Enter to close application.");
Console.ReadLine();
}

// Callback method must have the same signature as the
// AsyncCallback delegate.
static void CallbackMethod(IAsyncResult ar) {
// Retrieve the delegate.
AsyncDelegate dlgt = (AsyncDelegate) ar.AsyncState;

// Call EndInvoke to retrieve the results.
string ret = dlgt.EndInvoke(out threadId, ar);

Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", threadId, ret);
}
}
仓木泽 2006-04-14
  • 打赏
  • 举报
回复
顶!
Knight94 2006-04-14
  • 打赏
  • 举报
回复
能否贴出你的代码
仓木泽 2006-04-14
  • 打赏
  • 举报
回复
@Knight94(愚翁)
在我的程序里面Invoke和BeginInvoke都会让界面死锁
工具箱 2006-04-13
  • 打赏
  • 举报
回复
我也来顶!!
张赐 2006-04-13
  • 打赏
  • 举报
回复
帮你顶

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧