как внести изменения во все TreeView, которые существуют в форме - PullRequest
1 голос
/ 10 ноября 2011

В моем приложении 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 ]

3 голосов
/ 10 ноября 2011

Коллекция 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 голос
/ 10 ноября 2011

В ваших формах также есть элементы управления, не относящиеся к типу TreeView, и поэтому их нельзя привести как единое целое.Попробуйте это:

foreach (control c in this.Controls)
{
  TreeView tr = c as TreeView;
  if(tr != null)
    // your logic here
}
0 голосов
/ 10 ноября 2011

Следует отметить, что это могут быть вложенные элементы управления в форме и вложенные узлы в корневых узлах 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);
}
...