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可以以相同的方式锁定它。

不幸的是,如果没有整个代码,很难猜到出了什么问题……所以我能做的最好的事情是提供一些建议来检查它是怎么回事:

  • 首先,将每个BeginUpdateEndUpdateSuspendDrawingResumeDrawing一起ResumeDrawing ,并检查发生了什么。

  • 如果错误仍然存​​在,请通过注释与其无关的内容,使代码尽可能简单地填充TreeView,禁用用于自定义节点显示的事件,如DrawNode事件(如果适用)

……直到它按预期工作。

  • 然后,取消注释代码段以逐个重新启用现有function,直到您遇到问题或通过查看代码注意到错误。 您将以这种方式隔离错误。

希望它至少有一点帮助。