在 PowerShell 中过滤 TreeView 节点

2024-06-19

我的 TreeView 中有大量节点,并且有一个文本框可以过滤它们以突出显示匹配的搜索。然而,它有点混乱,因为它显示了所有其他节点,并且在我更改搜索后,它使所有节点都展开。

我正在尝试做这样的事情,https://www.codeproject.com/Tips/1000621/Filtering-and-Hiding-Tree-Nodes-WinForms https://www.codeproject.com/Tips/1000621/Filtering-and-Hiding-Tree-Nodes-WinForms但我正在使用 Windows 表单/Powershell ISE,并且似乎很难将其实现到我自己的代码中。

对于关闭节点,我尝试使用 (Textbox.textlength -eq 0) 的方式来触发关闭所有节点功能,但这不起作用。

Here is what I want it too look like. Left is what I want, Right is what mine looks like. enter image description here

这是我正在使用的搜索功能的示例。

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()

假设您正在搜索文件夹结构等数据源,这就是我要做的:

  • 创建一个函数以将所有目录的列表递归地获取到列表中
  • 创建一个函数来过滤目录列表并返回名称中包含特定文本的目录列表。
  • 创建一个函数来填充树视图
  • 创建一个函数来突出显示包含特定文本的树节点

然后在文本框的文本更改事件中,我将过滤并突出显示树:

这是代码:

Add-Type -AssemblyName System.Windows.Forms

function GetPaths($root)
{
    Get-ChildItem $root -Recurse -Directory | % {
        $_.FullName.Replace($root, "").Trim("\")} 
}

function FilterPaths($paths, $like)
{
    $paths | ? {$_ -like "*$like*"} | % {
        $i = $_.LastIndexOf("$like", [System.Globalization.CompareOptions]::IgnoreCase)
        if($i -gt -1) {
            $j = $_.IndexOf("\", $i, [System.Globalization.CompareOptions]::IgnoreCase)
            if($j -gt -1) {
                $_.SubString(0,$j)
            } else {
                $_
            }
        }
    } 
}

function GetNodes($nodes)
{
     foreach ($n in $nodes) {
        $n
        GetNodes($n.Nodes)
     }
}

function HighlightNodes($nodes, $like)
{
    if(!$like){ return }
    $nodes | ? {$_ -like "*$like*"} | % {
            $_.BackColor = "Yellow"
    }
}

function PopulateTree($treeView, $paths)
{
    $treeView.Nodes.Clear()
    foreach ($path in $paths)
    {
        $lastNode = $null
        $subPathAgg = ""
        foreach ($subPath in ($path -split '\\'))
        {
            $subPathAgg += ($subPath + '\')
            $nodes = $treeView.Nodes.Find($subPathAgg, $true)
            if ($nodes.Length -eq 0) {
                if ($lastNode -eq $null) {
                    $lastNode = $treeView.Nodes.Add($subPathAgg, $subPath)
                } else {
                    $lastNode = $lastNode.Nodes.Add($subPathAgg, $subPath)
                }
            } else {
                $lastNode = $nodes[0]
            }
        }
    }
}

$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 = $form.ClientSize.Width - 16;
        Anchor = [System.Windows.Forms.AnchorStyles]13
    }),
    ($tree = [System.Windows.Forms.TreeView] @{
        Location = [System.Drawing.Point]::new(8, 40);
        Width = $form.ClientSize.Width - 16;
        Anchor = [System.Windows.Forms.AnchorStyles]15
        Height = 200;
        HideSelection = $false
    })
))
$form.AcceptButton= $btn
$root = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTemplates\CSharp"
$paths = GetPaths $root
PopulateTree $tree $paths
$tree.ExpandAll()

$txt.Add_TextChanged({param($sender,$e)
    $tree.BeginUpdate()
    $like = $txt.Text
    $filtered = FilterPaths $paths $like
    PopulateTree $tree $filtered
    HighlightNodes (GetNodes $tree.Nodes) $like
    $tree.ExpandAll()
    $tree.TopNode = $tree.Nodes[0]
    $tree.EndUpdate()
})
$form.ShowDialog() | Out-Null
$form.Dispose()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PowerShell 中过滤 TreeView 节点 的相关文章

随机推荐

  • 如何根据条件表达式从 pandas DataFrame 中删除行[重复]

    这个问题在这里已经有答案了 我有一个 pandas DataFrame 我想从中删除特定列中字符串长度大于 2 的行 我希望能够做到这一点 每这个答案 https stackoverflow com questions 11881165 s
  • 如何使用 c++11 CAS 实现 ABA 计数器?

    我正在基于此实现一个无锁队列算法 http www cs rochester edu research synchronization pseudocode queues html 它使用计数器来解决 ABA 问题 但我不知道如何用c 11
  • 如何从我的班级访问活动 UI?

    我有一个活动创建我的类的对象实例 file MyActivity java public class MyActivity extends Activity TextView myView TextView findViewById R i
  • Sinon 存根抛出“TypeError:无法重新定义属性”

    我正在使用 NPM 包Jose https github com panva jose 版本 v1 28 0 在我的一个 NodeJS 应用程序中 最近我的更新机器人尝试将其更新到下一个主要版本 2 0 2 可悲的是我的单元测试Sinon
  • 非泛型类型 Type 不需要类型参数

    我正在创建一个简单的测试类型提供程序 我想提供一个字符串 并返回一个类型名称等于所提供的字符串的类型 但结果不行 说BasicProvider是非泛型类型 Error 非泛型类型 SimpleStringProvider BasicProv
  • 服务器作为 WebRTC 数据通道对等点

    目前是否有解决方案可以让您的服务器充当 WebRTC 连接的对等端 我对 WebRTC 感兴趣的原因不是它的点对点部分 而是因为它使您能够使用 UDP 您可以让玩家参与像 雷神之锤 这样的快节奏游戏 而无需任何插件 看来本质上是同一个问题之
  • 从 Rails 3.1.3 升级到 Rails 3.2.1。资产错误

    我尝试将应用程序从 Rails 3 1 3 升级到 Rails 3 2 1 但资产出现问题 我有这样的错误 ActionController RoutingError No route matches GET assets logos op
  • JQuery 事件处理程序未触发

    请看我的代码 Html table tr td valign top style padding top 10px Body br br a href expand a td td td tr table
  • Pyinstaller:如何包含 importlib_resources 使用的包中的资源

    我有以下项目结构 package1 init py some py package2 init py some py static data init py file1 txt file2 txt my script py my scrip
  • 占据花车的地板

    我发现了两种在 Python 中占据发言权的方法 3 1415 1 and import math math floor 3 1415 第一种方法的问题是它返回一个浮点数 即3 0 第二种方法感觉很笨拙而且太长 在 Python 中是否有替
  • WCF 5.0 和 oData 3.0 API 不适用于 Azure 表存储

    在我迁移 WCF5 0 应用程序以与 azure 集成后 我无法将 oData 3 api 与 azure 表存储一起使用 我收到这个错误 定义了类型 System Data Services Client DataServiceRespo
  • JavaScript WebSocket.send 方法会阻塞吗?

    如果我要发送大量Blob or ArrayBuffer通过 JavaScriptWebSocket通过其send方法 是否send方法调用会阻塞 直到发送数据为止 还是会复制数据以异步发送 以便调用可以立即返回 一个相关的 未回答的 问题是
  • Qt 相当于 .NET 数据绑定吗?

    Qt 中是否有相当于 NET 数据绑定的功能 我想使用引用数据库中特定实体的 QString 填充一些组合框和其他小部件 但是 如果我可以将数据绑定到这些字符串 而不是基于新的组合框选择再次查询数据库 或者基于构建我自己的将使用 QStri
  • aiohttp 线程缓慢

    我复制了代码如何在线程中运行 aiohttp 服务器 https stackoverflow com questions 51610074 how to run an aiohttp server in a thread 它运行良好 所以我
  • Haskell 中的多态函数作为参数

    我有一个带有两个构造函数的 ADT 一个包裹着一个Double和一个包裹着Integer 我想创建一个函数 它采用一元函数Numtypeclass 并返回一个函数 该函数将该一元函数应用于我的 ADT 的内容 我试过这个 data X Y
  • 删除克隆元素上的淘汰赛 js 绑定

    我正在使用 knockout js 模板绑定功能将项目集合渲染到元素
  • 使用 DFT 的一维热方程产生不正确的结果 (FFTW)

    我正在尝试使用复数到复数 IDFT 求解一维热方程 问题在于单个时间步后的输出似乎不正确 我在下面提供了一个简单的示例来说明该问题 I initialize the temperature state as follows 频域中的初始模式
  • orchard cms路由问题

    我创建了一些自定义内容类型 其中包括路线部分 以便我的内容管理员可以编辑项目的别名 我没有运气配置一条路线 使我自己的控制器能够为这些项目的请求提供服务 核心 Routable 模块中到 ItemController 的路径的路由优先级为
  • 以编程方式将 MenuItem 添加到菜单的特定位置或组

    我有一个
  • 在 PowerShell 中过滤 TreeView 节点

    我的 TreeView 中有大量节点 并且有一个文本框可以过滤它们以突出显示匹配的搜索 然而 它有点混乱 因为它显示了所有其他节点 并且在我更改搜索后 它使所有节点都展开 我正在尝试做这样的事情 https www codeproject