首页 / 浏览问题 / 组件 / 问题详情
iDesktop10i .net 图层管理器刷新无效问题
hhhhhhxx  (37分)  初出茅庐
7月9日, 2021

目前有一个功能是向地图中添加大量图层,并且会调整图层的名称和顺序

如果图层管理器实时更新,所需时间大幅提升

对图层树使用BeginUpdate/EndUpdate后,图层树并没有重绘更新,需要到图层控制中点击应用后才能正确更新

图层控制中点击应用后正常显示


 功能代码段


//获取图层控制器树
IDockBar dockBar = Application.ActiveApplication.MainForm.DockBarManager[typeof(LayersControlManager)];
 LayersControlManager layersControlManager = dockBar.Control as LayersControlManager;
//图层控制器树停止刷新
 layersControlManager.LayersTree.BeginUpdate();
 try
 { 
///添加大量图层
}
 catch (Exception ex)
 {
 }
 finally
 {
//图层控制器树启动刷新
 layersControlManager.LayersTree.EndUpdate();

//刷新尝试  无效
 layersControlManager.LayersTree.Refresh();
 layersControlManager.LayersTree.Update();
 layersControlManager.LayersTree.ExpandAll();
 layersControlManager.Update();
}

想问下图层管理器该用什么方法刷新呢?

1个回答

您好,您使用的BeginUpdate、EndUpdate、Refresh等一系列方法,是微软原生Windows窗体控件 ListView 类和 TreeView 类等控件的方法,我们超图的二维图图层树是LayersTree 类,相关支持的方法属性您可以查看帮助手册的“LayersTree ”部分。

希望可以帮助到您!

执笔画月  (4,020分)  名扬四海
7月12日, 2021

BeginUpdate、EndUpdate、Refresh方法在 TreeView 控件中有,

 LayersTree 类是继承 TreeView 控件的,BeginUpdate和EndUpdate都生效了,Refresh方法未生效,

我查看帮助手册的“LayersTree ”类并没有发现相关能有效刷新树接口的方法,LayersTree.efreshNode 方法未能正常刷新

不一定就要用这些方法,只有能刷新节点的这个需求就可以了

想知道图层控制器中的应用,调用到了什么方法呢?

是的,我们产品这边支持的方法和睡醒就是我们帮助文档里写的,微软的方法的话我们超图这边没法技术支持。

刷新的话我们有节点刷新方法RefreshNode。

我发现原因了,是因为我把添加图层的方法放在异步执行了,就导致图层树不能正常显示,想问问除了取消异步执行,有方法可以让图层树在非主线程中更新吗?

 // superma 异步进度条窗体
 FormProgressAsyn<bool> frm = new FormProgressAsyn<bool>();
 frm.IsTimeMessageEnabled = false;
 frm.CanCanceTask = true;
 frm.DoWork(() =>
 {
   // 添加图层
   layer = layers.Add(dataset, theme, false);
   return true;
 });

多线程方案的话,属于您的c#开发设计问题了,超图这边layersControlManager的接口是可以正常使用的。
...