问题
I am struggling here. i cannot figure out how to make the button functions read the $listbox1.selectedItems and $listbox2.selectedItem whats wrong here? if i try to look at the $listbox items after the OK button been pressed it will show me but not if i call the function button, ive deleted some unneccesery code parts.
$form = New-Object System.Windows.Forms.Form
$form.StartPosition = 'CenterScreen'
$button1 = New-Object System.Windows.Forms.Button
$button1.Text = 'Link'
$button2 = New-Object System.Windows.Forms.Button
$button2.Text = 'UnLink'
$button3 = New-Object System.Windows.Forms.Button
$button3.Text = 'ShowGPOlink'
$button4 = New-Object System.Windows.Forms.Button
$button4.Text = 'ShowOUlink'
#OK Button
$button5 = New-Object System.Windows.Forms.Button
$button5.Text = 'Done'
$button5.DialogResult = [System.Windows.Forms.DialogResult]::OK
$listBox1 = New-Object System.Windows.Forms.ListBox
$listbox1.SelectionMode = 'MultiExtended'
$listBox2 = New-Object System.Windows.Forms.ListBox
[void] $listBox1.Items.addRange($GPOLIST)
[void] $listBox2.Items.Addrange($OUHOLDER.CanonicalName)
$form.Controls.Add(...)
$form.AcceptButton = $button5
$button1.Add_Click({ LinkFn })
$button2.Add_Click({ UnLinkFn })
$button3.Add_Click({ ShowGPO })
$button4.Add_Click({ ShowOU })
function LinkFn {
#for some reason it returns nothing
$listBox1.selecteditems
$listbox2.SelectedItem
Write-Host "function link"
}
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK){
$listBox1.selecteditems
$listbox2.SelectedItem }
回答1:
Why are you not leveraging the provided PowerShell docs examples and tweaking as needed:
Selecting Items from a List Box
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Select a Computer'
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = 'CenterScreen'
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,120)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,120)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Please select a computer:'
$form.Controls.Add($label)
$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,40)
$listBox.Size = New-Object System.Drawing.Size(260,20)
$listBox.Height = 80
[void] $listBox.Items.Add('atl-dc-001')
[void] $listBox.Items.Add('atl-dc-002')
[void] $listBox.Items.Add('atl-dc-003')
[void] $listBox.Items.Add('atl-dc-004')
[void] $listBox.Items.Add('atl-dc-005')
[void] $listBox.Items.Add('atl-dc-006')
[void] $listBox.Items.Add('atl-dc-007')
$form.Controls.Add($listBox)
$form.Topmost = $true
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $listBox.SelectedItem
$x
}
If you have the Multiselect defined, then change the block to this...
$listBox.SelectionMode = 'MultiExtended'
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
ForEach ($ListItem in $listBox.SelectedItems)
{$ListItem}
}
So, as I said, this required me to physically re-write what you have here to explain and show you what you would be looking at. This will show the formatted GUI, with a prepopulated list, that when you single or multi-select and item from listbox1, and click the Link button, which fires the function LinkFn, it will copy that selection to Listbox2 and will not close the form.
The below code is not doing anything differently than what is shown in the PS help other than sending the results to another GUI element, and not closing the form via the default OK return. All of which is a common thing in GUI design.
#region Begin environment initialization
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
#endregion Begin environment initialization
#region Begin functions and code behind
function DoneFn { }
function ShowModuleFn { }
function ShowProcessFn { }
function UnLinkFn { }
function LinkFn
{
$listBox1.selecteditems
# $listbox2.SelectedItems
[void] $listBox2.Items.Addrange($listBox1.selecteditems)
}
$List1 = (Get-Process).Name
# $List2 = (Get-Module).Name
#endregion End functions and code behind
#region Begin GUI code
$Form = New-Object system.Windows.Forms.Form
$Form.ClientSize = '634,339'
$Form.text = 'Form'
$Form.TopMost = $false
$ListBox1 = New-Object system.Windows.Forms.ListBox
$ListBox1.text = 'listBox1'
$listBox1.SelectionMode = 'MultiExtended'
$ListBox1.width = 269
$ListBox1.height = 176
$ListBox1.location = New-Object System.Drawing.Point(17,21)
$ListBox2 = New-Object system.Windows.Forms.ListBox
$ListBox2.text = 'listBox2'
$listBox2.SelectionMode = 'MultiExtended'
$ListBox2.width = 300
$ListBox2.height = 175
$ListBox2.location = New-Object System.Drawing.Point(318,21)
$Button1 = New-Object system.Windows.Forms.Button
$Button1.text = 'Link'
$Button1.width = 60
$Button1.height = 30
$Button1.location = New-Object System.Drawing.Point(20,238)
$Button1.Font = 'Microsoft Sans Serif,10'
$Button2 = New-Object system.Windows.Forms.Button
$Button2.text = 'Unlink'
$Button2.width = 60
$Button2.height = 30
$Button2.location = New-Object System.Drawing.Point(127,241)
$Button2.Font = 'Microsoft Sans Serif,10'
$Button3 = New-Object system.Windows.Forms.Button
$Button3.text = 'ShowProcess'
$Button3.width = 88
$Button3.height = 30
$Button3.location = New-Object System.Drawing.Point(20,297)
$Button3.Font = 'Microsoft Sans Serif,10'
$Button4 = New-Object system.Windows.Forms.Button
$Button4.text = 'ShowModules'
$Button4.width = 105
$Button4.height = 30
$Button4.location = New-Object System.Drawing.Point(127,297)
$Button4.Font = 'Microsoft Sans Serif,10'
$Button5 = New-Object system.Windows.Forms.Button
$Button5.text = 'Done'
$Button5.width = 60
$Button5.height = 30
$Button5.location = New-Object System.Drawing.Point(556,298)
$Button5.Font = 'Microsoft Sans Serif,10'
$Form.controls.AddRange(@(
$ListBox1,
$ListBox2,
$Button1,
$Button2,
$Button3,
$Button4,
$Button5
))
$Button1.Add_Click({ LinkFn })
$Button2.Add_Click({ UnLinkFn })
$Button3.Add_Click({ ShowProcessFn })
$Button4.Add_Click({ ShowModuleFn })
$Button5.Add_Click({ DondFn })
[void] $listBox1.Items.addRange($List1)
# [void] $listBox2.Items.Addrange($List2)
#endregion End GUI code
# Call the GUI
[void]$Form.ShowDialog()
来源:https://stackoverflow.com/questions/61802960/im-having-promlen-with-button-functions-in-gui-powershell