#c# #winforms #treeview #controls
#c# #winforms #treeview #элементы управления
Вопрос:
У меня есть несколько TreeView в моем приложении winform. Я пытаюсь внести массовые изменения во все из них за один раз. Итак, я написал приведенный ниже код:
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.Формы.Кнопка»ввести» Система.Windows.Формы.TreeView’.
Ну, очевидно, у меня есть некоторые другие элементы управления, такие как кнопки и т.д… Мне интересно, что не так с моим кодом, который работает, но терпит неудачу в действии!
Ответ №1:
this.Controls
Коллекция содержит все элементы управления, а не только treeviews, и я удивлен, что не появляется ошибка компиляции или даже предупреждение. Вам нужно проверить тип каждого элемента управления, прежде чем пытаться использовать его в качестве 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. спасибо, но ваш код не компилируется. Это дает
Error 1 Cannot implicitly convert type 'System.Windows.Forms.Control' to 'System.Windows.Forms.TreeView'. An explicit conversion exists (are you missing a cast?)
2. Ошибка здесь
TreeView tv = tvc;
в tvc что-то не так: P3. Извините, как сказано в ошибке, не хватало приведения. Я добавил это сейчас.
Ответ №2:
В ваших формах также есть элементы управления, которые не имеют типа TreeView, и поэтому не могут быть приведены как один. Попробуйте это:
foreach (control c in this.Controls)
{
TreeView tr = c as TreeView;
if(tr != null)
// your logic here
}
Комментарии:
1. Это страдает от точно такой же проблемы, что и OP, в том, что он фактически не проверяет, является ЛИ элемент управления TreeView, прежде чем пытаться использовать его как таковой.
2.
as TreeView
В сочетании сtr != null
выполняет проверку.3. Я сделал это так, но по какой-то причине это ничего не делает! ` foreach (Управляйте c в этом. Элементы управления) { TreeView tr = c как TreeView; if (tr != null) { foreach (TreeNode tn в tr.Nodes) { tn.BackColor = Цвет. Белый; tn.ForeColor = Цвет. Черный; } } }`
4. Вам нужно предоставить больше информации, кроме «это ничего не делает». Например, когда вы проверяете каждый из них
c
в отладчике, каковы они?5. Извините, я не знал о таком поведении на C # > 2.0. Я удалю свой отрицательный отзыв, если ответ будет отредактирован.
Ответ №3:
Следует отметить, что это могут быть вложенные элементы управления внутри формы и вложенные узлы внутри корневых узлов 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);
}