У меня есть тонна узлов в TreeView, и у меня есть текстовое поле, которое фильтрует их, чтобы выделить соответствующий поиск. Тем не менее, он немного запутан, поскольку показывает все другие узлы, и после того, как я изменил свой поиск, он оставляет все узлы развернутыми.
Я пытаюсь сделать что-то вроде этого, https://www.codeproject.com/Tips/1000621/Filtering-and-Hiding-Tree-Nodes-WinForms Но я использую Windows формы / Powershell ISE и, похоже, изо всех сил пытаюсь внедрить его в свой собственный код.
Для закрытия узлов я пытался использовать вещи вдоль линии (Textbox.textlength -eq 0), чтобы вызвать функцию закрытия всех узлов, но это не сработало.
Вот то, что я хочу, чтобы это тоже выглядело. Левый - это то, что я хочу, Правый - это то, на что похожа моя.
Вот пример функции поиска, которую я использую.
Add-Type -AssemblyName System.Windows.Forms
function GetNodes([System.Windows.Forms.TreeNodeCollection] $nodes)
{
foreach ($n in $nodes) {
$n
GetNodes($n.Nodes)
}
}
$form = New-Object System.Windows.Forms.Form
$form.Text ="Test"
$form.Controls.AddRange(@(
($txt = [System.Windows.Forms.TextBox] @{
Location = [System.Drawing.Point]::new(8, 8);
Width = 100;
}),
($btn = [System.Windows.Forms.Button] @{
Location = [System.Drawing.Point]::new(120, 8);
Width = 50;
Text = "Search";
}),
($tree = [System.Windows.Forms.TreeView] @{
Location = [System.Drawing.Point]::new(8, 40);
Width = 170;
HideSelection = $false
})
))
$form.AcceptButton= $btn
$tree.Nodes.Add("A1", "A1")
$tree.Nodes.Add("A2", "A2")
$tree.Nodes[0].Nodes.Add("A11", "A11")
$tree.Nodes[0].Nodes.Add("A12", "A12")
$tree.Nodes[1].Nodes.Add("A21", "A21")
$tree.Nodes[1].Nodes.Add("A22", "A22")
$btn.Add_Click({param($sender,$e)
$nodes = GetNodes($tree.Nodes)
foreach ($node in $nodes) {
if($node.Text -like $txt.Text){
$tree.SelectedNode = $node
$node.EnsureVisible()
break
}
}
})
$form.ShowDialog() | Out-Null
$form.Dispose()