如何在表单中存在的所有TreeView中进行更改

时间:2011-11-10 14:46:38

标签: c# winforms treeview controls

我的winform应用程序中有一些TreeView。我试图一次性改变所有这些。所以我写了下面的代码:

private void ResetTreeViewColors()
{
    foreach (TreeView tv in this.Controls)
    {
        foreach(TreeNode tn in tv.Nodes)
        {
            tn.BackColor = Color.White;
            tn.ForeColor = Color.Black;
        }
    }
}

它编译,但是当我调用这个方法时,我收到一个错误,上面写着:

  

无法将'System.Windows.Forms.Button'类型的对象强制转换为'System.Windows.Forms.TreeView'。

很明显,我还有其他一些控件,比如按钮等...我想知道我的代码出现了什么问题,但是操作失败了!

3 个答案:

答案 0 :(得分:3)

this.Controls集合包含所有控件,而不仅仅是树视图,我很惊讶没有出现编译错误甚至是警告。 在尝试将其用作TreeView之前,您需要检查每个控件的类型:

private void ResetTreeViewColors() { 
    foreach (Control tvc in this.Controls) { 
        if (tvc is TreeView) {
            TreeView tv = (TreeView)tvc;
            foreach(TreeNode tn in tv.Nodes) { 
                tn.BackColor = Color.White; 
                tn.ForeColor = Color.Black; 
            }
        } 
    } 
} 

答案 1 :(得分:1)

您的表单中还有一些不属于TreeView类型的控件,因此无法将其转换为一个控件。试试这个:

foreach (control c in this.Controls)
{
  TreeView tr = c as TreeView;
  if(tr != null)
    // your logic here
}

答案 2 :(得分:0)

您应该注意,它可以是表单中的嵌套控件和treeView根节点中的嵌套节点。所以最终的代码应该是这样的:

ResetChildTreeViews(this); // reset all treeviews within a form
//...
static void ResetChildTreeViews(Control container) {
    foreach(Control ctrl in container.Controls) {
        if(ctrl is TreeView)
            ResetTreeViewColors(ctrl as TreeView);
        else ResetChildTreeViews(ctrl);
    }
}
static void ResetTreeViewColors(TreeView treeView) {
    foreach(TreeNode node in treeView.Nodes)
        ResetTreeNodeColors(node);
}
static void ResetTreeNodeColors(TreeNode node) {
    node.BackColor = Color.White;
    node.ForeColor = Color.Black;
    foreach(TreeNode childNode in node.Nodes) 
        ResetTreeNodeColors(childNode);
}