如何通过单击WinForms按钮在GridView中打开联机帮助页?

时间:2016-09-09 15:15:25

标签: winforms powershell gridview scope

当我使用Powershell和WinForms单击按钮时,我正在尝试打开联机帮助页(Get-Help别名)。

我有一个允许您输入cmdlet或帮助主题的文本框,当您按下按钮时,它应该打开GridView中的联机帮助页文档。目前,它打开了GridView并抓取了正确的帮助文档,但是在此过程中出现了一些问题,我认为它与解释在传递给GridView之前有关。

这就是我所拥有的:

[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')

$form = New-Object Windows.Forms.Form

$input = New-Object Windows.Forms.TextBox
$input.Size = '100,20'
$input.Location = '10,20'

$button = New-Object Windows.Forms.Button
$button.Size = '100,20'
$button.Location = '10,60'
$button.Add_Click({
    Invoke-Expression ("man " + ($global:input.Text)) | Out-GridView
    })

$form.Controls.AddRange(@($input, $button)

$form.Add_Shown({$form.Activate()})

$form.ShowDialog()

GridView会打开,但标题会显示Invoke-Expression ("man " + ($input.Text)) | Out-GridView,内容是联机帮助页的通用默认信息。

我尝试将Invoke-Expression附加到变量,然后将变量传递给GridView。我尝试将(Get-Help ($input.Text))设置为变量,然后将其传递给GridView。我甚至试图通过将$input.Text放在$input.Text = ''属性之后来初始化$input.Location属性。

我真的认为它是Powershell引擎如何解释表达式,但我不知道如何告诉它按照我想要的方式工作。

我在这里做错了什么?

编辑:好的,我刚刚意识到了什么。我认为$ input.Text属性没有正确填充。

我所做的是在[Windows.Forms.MessageBox]::Show($input.Text)的{​​{1}}事件中添加了Click并注释了$button。它应该做的是打开一个消息框并在其中放置文本框中键入的内容(Invoke-Expression)。消息框为空白。我认为它可能与作用域有关,但$input.Text应该是$input.Text,并且可以从按钮控件项目的$global事件中访问。

在输入最后一段后我搞砸了它,我意识到Click属性已正确填充并可在$input.Text范围内访问。我所做的是在脚本的最后添加$global(在[Windows.Forms.MessageBox]::Show($input.Text)之后),它显示了我在文本框中输入的内容。

那么,为什么我看不到$form.ShowDialog()文本框属性?我没有遇到过我在Powershell中构建的其他一些WinForms应用程序的问题。

感谢您的见解。

1 个答案:

答案 0 :(得分:0)

$input是Powershell管道上下文中使用的自动变量,这就是它为空的原因。 Powershell会自行填充它,因此会覆盖您放入其中的任何内容。将$input重命名为任何其他可用名称,它应该有效。

E.g:

[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')

$form = New-Object Windows.Forms.Form

$box = New-Object Windows.Forms.TextBox
$box.Size = '100,20'
$box.Location = '10,20'

$button = New-Object Windows.Forms.Button
$button.Size = '100,20'
$button.Location = '10,60'
$button.Add_Click({
    [Windows.Forms.MessageBox]::Show($box.Text)
    Invoke-Expression ("man " + ($box.Text)) | Out-GridView
    })

$form.Controls.AddRange(@($box, $button))

$form.Add_Shown({$form.Activate()})

$form.ShowDialog()