C#TreeView有时会在无效后拒绝自己绘制
我使用TreeView在两个级别中显示一些信息:
- 一个
- 乙
- 1
- d
- 1
- 2
- …
有时,存储在树视图中的信息与显示的信息不同。 这似乎是因为在Invalidates()
之后没有调用Paint()
Invalidates()
。
我已经尝试过回答这个问题: C#Treeview在移动节点后没有刷新 ,但没有成功。
树(重新)创建代码:
using System.Windows.Forms.TreeNode; using System.Windows.Forms.TreeView; [...] private void createTree() { [...]// Creation code // Check update of the treeview foreach (TreeNode n in viewDataTreeView.Nodes) { Console.WriteLine(n.Name); foreach (TreeNode child in n.Nodes) { Console.WriteLine(" " + child.Name); } } Console.WriteLine("done"); this.Invalidate(true); }
这总是输出我在树视图中的正确树。 有时,新添加的节点不会显示在屏幕上。
工作案例:
调用堆栈:
工作callstack的function:
private void toolStripDeleteTemplateButton_Click(object sender, EventArgs e) { //Some confirmation stuff [...] // Delete the template file GraphTemplateNode node = this.viewDataTreeView.SelectedNode as GraphTemplateNode; File.Delete(node.GetTemplateFilePath()); createTree(); }
不工作案例:
调用堆栈:
见Test 4
缺失。
unworking callstack的function:
//LineGraphUIControl.cs private void saveTemplateToolStripButton_Click(object sender, EventArgs e) { base.SaveGraphTemplate(lineGraphControl1.Graph); } //GraphUIControl.cs public void SaveGraphTemplate(Graph graph) { //Getting file name [...] //Creating template ViewDataSubControl.AddNewUserTemplate(tmplt); } // ViewDataSubControl.cs public void AddNewUserTemplate(GraphTemplate tmplt) { //Some string calculations [...] tmplt.SaveTemplate(fullName); createTree(); }
我试图使用方法Refresh()
, Update()
和BeginUpdate() & EndUpdate()
没有运气。 Invalidated
事件总是被触发,但我不能每次都调用Paint()
。 如果我强制调用InvokePaint(),TreeView也不会更新。
我能做些什么让它有效?
这个问题很不寻常,我怀疑渲染TreeView的逻辑是错误的。 您在评论中写道,代码很长,您没有创建它,也不想复制/粘贴它。
我理解这一点。
一般来说,有很多原因可能发生:
-
在某些时候它可能是一个缺少的
EndUpdate
。 检查删除并重新添加节点时运行的代码。 -
节点显示定制可能很麻烦。 检查可能对节点渲染产生影响的任何代码(例如,
DrawNode
事件) -
检查exception处理程序。 可能会发生exception并破坏代码流。 如果适用,删除空的
catch
部分。 -
这可能是滥用像这样的技巧,根据需要禁用Redraws来加速显示。 在最后一种情况下,缺少
ResumeDrawing
可以以相同的方式锁定它。
不幸的是,如果没有整个代码,很难猜到出了什么问题……所以我能做的最好的事情是提供一些建议来检查它是怎么回事:
-
首先,将每个
BeginUpdate
,EndUpdate
,SuspendDrawing
,ResumeDrawing
一起ResumeDrawing
,并检查发生了什么。 -
如果错误仍然存在,请通过注释与其无关的内容,使代码尽可能简单地填充TreeView,禁用用于自定义节点显示的事件,如
DrawNode
事件(如果适用)
……直到它按预期工作。
- 然后,取消注释代码段以逐个重新启用现有function,直到您遇到问题或通过查看代码注意到错误。 您将以这种方式隔离错误。
希望它至少有一点帮助。