gpt4 book ai didi

winforms - Powershell将文本框作为函数参数传递

转载 作者:行者123 更新时间:2023-12-03 00:42:30 25 4
gpt4 key购买 nike

我正在使用带有 System.Windows.Forms 的 PowerShell 制作一个简单的 GUI 表单.

pic

对于每个文本框-按钮对,我希望按钮打开文件浏览器,并且一旦选择了文件,文件路径应该写在相应的文本框中。

在下面的代码中,New-TextBox创建一个标签和一个文本框,然后 New-Button创建一个按钮。

使用这些功能创建了 3 个带有 3 个按钮的文本框。

然后我创建了函数 Set-FileDialogButton .它需要一个按钮和文本框作为参数,并且应该创建一个打开文件浏览器的按钮单击事件,获取选定的文件路径并将其从参数写入文本框。

点击事件和文件浏览器工作。但是,选择文件后,我得到

The property 'Text' cannot be found on this object. Verify that the property exists and can b
e set.
At D:\...\test.ps1:62 char:5
+ $inputTextBox.Text = $FileBrowser.FileName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound

所以我假设在函数中传递文本框时我做错了什么。如果我不将 click 事件包装在函数中,我的代码就可以正常工作。

编码:
Add-Type -assembly System.Windows.Forms
$main_form = New-Object System.Windows.Forms.Form
$main_form.Text ='AP209 Converter GUI'

$main_form.Width = 300
$main_form.Height = 200
$main_form.AutoSize = $true

#Creates a label and text box:
function New-TextBox($labelText, $x, $y, $w){
$label = New-Object System.Windows.Forms.Label
$label.Text = $labelText
$label.Location = New-Object System.Drawing.Point($x, $y)
$label.AutoSize = $true
$main_form.Controls.Add($label)

$textbox = New-Object system.Windows.Forms.TextBox
$textbox.multiline = $false
$textbox.width = $w
$textbox.height = 20
$textbox.location = New-Object System.Drawing.Point(($x + 50), $y)
$main_form.Controls.Add($textbox)

return $textbox
}
#Creates a button with $text as label:
function New-Button($text, $x, $y, $w, $h){
$button = New-Object System.Windows.Forms.Button
$button.Location = New-Object System.Drawing.Size($x, $y)
$button.Size = New-Object System.Drawing.Size($w, $h)
$button.Text = $text
$main_form.Controls.Add($button)
return $button
}

$textBoxW = 100
$labelX = 0
$buttonX = $x + 155

$y = 10
$dy = 30

$buttonW = 25
$buttonH = 20

#Create 3 text boxes and buttons:
$textbox1 = New-TextBox "File 1" $labelX $y $textBoxW
$button1 = New-Button "..." $buttonX $y $buttonW $buttonH
$y = $y + $dy
$textbox2 = New-TextBox "File 2" $labelX $y $textBoxW
$button2 = New-Button "..." $buttonX $y $buttonW $buttonH
$y = $y + $dy
$textbox3 = New-TextBox "File 3" $labelX $y $textBoxW
$button3 = New-Button "..." $buttonX $y $buttonW $buttonH


#Set click event to button:
function Set-FileDialogButton($button, $inputTextBox){
$button.Add_Click(
{
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{ InitialDirectory = $loadpath}
$fileBrowserReturned = $FileBrowser.ShowDialog()
if($fileBrowserReturned -eq "OK"){
$inputTextBox.Text = $FileBrowser.FileName
$inputTextBox.SelectionStart = $inputTextBox.Text.Length;
}
}
)
}
Set-FileDialogButton $button1 $textbox1
Set-FileDialogButton $button2 $textbox2
Set-FileDialogButton $button3 $textbox3



$main_form.ShowDialog()

最佳答案

您需要在定义时捕获变量引用并将它们绑定(bind)到事件处理程序的本地范围。您可以使用 GetNewClosure() :

#Set click event to button:
function Set-FileDialogButton($button, $inputTextBox){
$button.Add_Click(
{
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{ InitialDirectory = $loadpath}
$fileBrowserReturned = $FileBrowser.ShowDialog()
if($fileBrowserReturned -eq "OK"){
$inputTextBox.Text = $FileBrowser.FileName
$inputTextBox.SelectionStart = $inputTextBox.Text.Length;
}
}.GetNewClosure()
)
}

使用您当前的代码,您的变量在事件处理程序执行之前不会被绑定(bind)。因此 inputTextBox 为空。

关于winforms - Powershell将文本框作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57671147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com