填充TreeView时“Out of Memory”

时间:2014-02-13 13:00:47

标签: c# windows

当我使用XML填充TreeView层次结构时,我面临“Out of Memory”问题。我们的XML结构非常复杂,并且不是修复格式。有多个级别的子节点。我正在使用递归来迭代XML并填充TreeView结构。我试着打电话给GC.Collect。清除内存,但它仍然抛出相同的错误。 我正在使用.NET Framework 3.5的C#进行开发。

如果您能帮助我找到解决方案,我将不胜感激。

我正在提供代码,我正在使用它来填充树视图,在

下面
private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
{
    string attribute = "";

    treeView1.ImageList = imageList1;
    treeViewResponse.ImageList = imageList1;
    XmlNode xNode;
    TreeNode tNode;
    XmlNodeList xNodeList;
    foo.MoveToFollowing(XPathNodeType.Element);
    namespaces1 = foo.GetNamespacesInScope(XmlNamespaceScope.All);
    if (xmlNode.HasChildNodes)
    {

        treeNode.ImageIndex = 0;
        treeNode.SelectedImageIndex = 0;
        xNodeList = xmlNode.ChildNodes;
        for (int x = 0; x <= xNodeList.Count - 1; x++)
        {
            xNode = xmlNode.ChildNodes[x];
            treeNode.Nodes.Add(new TreeNode(xNode.Name));
            tNode = treeNode.Nodes[x];
            //treeNode.Nodes[x].ImageIndex = -1;
            addTreeNode(xNode, tNode);
        }
    }
    else
    {
        treeNode.ImageIndex = 1;
        treeNode.NodeFont = new Font("Arial", 8, FontStyle.Bold);
        treeNode.SelectedImageIndex = 1;
        treeNode.Text = xmlNode.OuterXml.Trim();
    }
}

1 个答案:

答案 0 :(得分:4)

正如Raymond建议的那样,你应该构造一次字体并重复使用它。我注意到即使你这样做,更改节点字体会立即重新生成控件,这会导致TreeView除了提供内部字体之外还构建内部字体。我见过这种情况会导致字体句柄使用率上升得非常快,以至于垃圾收集器不能足够快地释放它们。我认为这是TreeView中的一个错误,它不是很可重复但有时会发生。使用所有应用程序的GDI句柄保护自己免受Treeview攻击的方法是在TreeView.BeginUpdate()和TreeView.EndUpdate()调用中包装一组节点添加或字体更改。

m_treeView.BeginUpdate();
try
{
    // TreeNode adds changes here
}
finally
{
    m_treeView.EndUpdate();
}

即使您添加或更改了多个节点,也只会进行一次重绘。

史蒂夫