我的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'。
很明显,我还有其他一些控件,比如按钮等...我想知道我的代码出现了什么问题,但是操作失败了!
答案 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);
}