做出选择时显示列表

时间:2018-11-19 12:06:27

标签: powershell list inbox

我正在尝试处理Windows.Form下的脚本,但有点卡住了。

我希望能够显示一个特定的列表,具体取决于从第一个列表中做出的选择,这意味着在脚本开始时,仅一个列表必须出现,而其他许多列表则取决于做出的选择。

这是完整的脚本供参考

#Open a Window.
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object Windows.Forms.Form
$form.text = "Contrôles"             
$form.Size = New-Object System.Drawing.Size(1000,700)

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(75,150)
$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,150)
$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)

#Create the Data table (DataTable).
$table1 = New-Object system.Data.DataTable
$table2 = New-Object system.Data.DataTable

#Define the 2 column (Name, Type).
$colonne1 = New-Object system.Data.DataColumn Choice,([string])
$colonne2 = New-Object system.Data.DataColumn Choice,([string])

#Create columns in the data table.
$table1.columns.add($colonne1)
$table2.columns.add($colonne2)

#Add the data line by line in the data table.
$ligne = $table1.NewRow()   #Creation of the new row.
$ligne.Choice = "Service"    #In the column Choice we put the value we want.
$table1.Rows.Add($ligne)    #Add a line in the data table.
$ligne = $table1.NewRow()
$ligne.Choice = "Software"
$table1.Rows.Add($ligne)
$ligne = $table1.NewRow()
$ligne.Choice = "Other"
$table1.Rows.Add($ligne)

#Add the data line by line in the data table.
$ligne = $table2.NewRow()   #Creation of the new row.
$ligne.Choice = "Service Enable"  #In the column Choice we put the value we want.   
$table2.Rows.Add($ligne)    #Add a line in the data table.
$ligne = $table2.NewRow()
$ligne.Choice = "Service Disable"
$table2.Rows.Add($ligne)
$ligne = $table2.NewRow()
$ligne.Choice = "Other"
$table2.Rows.Add($ligne)

#Create the View.
$vu1 = New-Object System.Data.DataView($table1)
$vu1.Sort="Choice ASC"   #Tri la colonne "Extension" par ordre croissant.

$vu2 = New-Object System.Data.DataView($table2)
$vu2.Sort="Choice ASC"

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(650,50)
$label.Size = New-Object System.Drawing.Size(280,35)
$label.Text = 'Please enter the information in the space below:'
$form.Controls.Add($label)

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(650,100)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox)

#Create the Drop-down list (ComboBox).
$liste1 = New-Object System.Windows.Forms.Combobox
$liste1.Location = New-Object Drawing.Point 20,50
$liste1.Size = New-Object System.Drawing.Size(150, 50)
$liste1.DropDownStyle = "DropDownList"

$liste2 = New-Object System.Windows.Forms.Combobox
$liste2.Location = New-Object Drawing.Point 350,50
$liste2.Size = New-Object System.Drawing.Size(150, 50)
$liste2.DropDownStyle = "DropDownList"

#Associate the Data to the Drop-down list
#To do so, we create a "Binding Context".
$liste1.BindingContext = New-Object System.Windows.Forms.BindingContext
$liste1.DataSource = $vu1  #Assigne the view that contains the sorted Data.
$liste1.DisplayMember = "Choice"  #Column that will be displayed (Choice).  

$liste2.BindingContext = New-Object System.Windows.Forms.BindingContext
$liste2.DataSource = $vu2   #Assigne the view that contains the sorted Data.
$liste2.DisplayMember = "Choice"    #Column that will be displayed (Choice). 

#Attach the control to the window.
$form.controls.add($liste1)
$form.controls.add($liste2)

#Show everything.
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()

#Work the code arround.
if ($liste1.DisplayMember= "Service Enable")
{set-service -name RemoteRegistry -ComputerName $textBox.Text -StartupType Automatic}

if ($liste1.DisplayMember = "Service Disable")
{set-service -name RemoteRegistry -ComputerName $textBox.Text -StartupType Automatic}
Write-Host "ComboBox = " $liste1.DisplayMember
Write-Host "ComboBox = " $liste2.selectedvalue

#Fin.

如果有人知道我可以看的地方,那就太好了。

谢谢 裸体

2 个答案:

答案 0 :(得分:2)

1. You have no form / trigger events in your code.

2. You don't have the correct GUI objects in your code to hold a list / record result.

表单只是容纳元素的容器,直到您在其后添加代码以使其执行某项操作为止。您必须具有适当的GUI对象才能将该结果发送到。

我不确定您是通过ISE还是VSCode或Notepad或其他方式手动完成所有操作,但这是一个很好的第一步。但是,您所显示的内容似乎表明您并没有真正加快GUI开发/一般应用程序开发工作的速度,因为您所做的并不是PowerShell真正的专有功能,而是任何应用程序开发客户端或Web所需的功能。

因此,实际上,花一些时间来研究/审查WPF / Winforms的一般开发,并且涵盖了表单事件。

对于您的用例,您需要:

  • 定义列表GUI对象(多行,ListBox,ListView,datagrid)以保存结果(同步combox框意味着在事件操作上添加和删除元素)
  • 定义该列表是什么(文本文件,数据库读取等)
  • 在单击,更改或其他表单事件上,从该列表中读取并填充 GUI列表对象

此站点以及整个网络上都有很多示例。

Here a good video on GUI development with PowerShell:

powershell populate combobox basing on the selected item on another combobox

通过以上讨论(不是仅添加到您的代码中而不了解其含义和原因的内容)

Use a ComboBox.SelectionChangeCommitted Event:

"Occurs when the user changes the selected item and that change is displayed in the ComboBox"
$combobox2_SelectionChangeCommitted={

  $Mailboxes = Get-Mailbox -OrganizationalUnit $ClientSelected
  foreach ($mailbox in $Mailboxes)
  {
      $CurrentMailbox = "{0} ({1})" -f $mailbox.Name, $mailbox.Alias
      Load-ComboBox $combobox2 $CurrentMailbox -Append
  }

}

Use a button: 
$button1_Click={

$Mailboxes = Get-Mailbox -OrganizationalUnit $ClientSelected
  foreach ($mailbox in $Mailboxes)
  {
      $CurrentMailbox = "{0} ({1})" -f $mailbox.Name, $mailbox.Alias
      Load-ComboBox $combobox2 $CurrentMailbox -Append
  }
}

最后,使用此…

Write-Host "ComboBox = " $liste1.DisplayMember
Write-Host "ComboBox = " $liste2.selectedvalue

…不会做,因为没有打开控制台以查看这些结果,并且应避免使用Write-Host,除非在使用仅控制台的其他控制台格式的纯文本字体时,它也会清空显示缓冲区,因此无法将其发送给其他任何人。此外,您在表单上的任何地方都没有一个名为“ ComboBox”的GUI对象,因此它对您的用例没有任何作用。

答案 1 :(得分:0)

经过一段时间的研究,我终于找到了我真正需要的东西。

这可能会帮助那些偶然发现该帖子的人,所以这里只是我发现的一小部分

function Service()
{if ($ListBox1.SelectedItem -eq 'Enable Services')
{
$form.Controls.Add($Label3)
$form.Controls.add($ListBox2)
$form.Controls.Add($Label4)
$form.Controls.Add($textBox)
$form.Controls.Add($Button2)
$form.Controls.Add($Button3)
}

我首先创建一个带有名称的函数,该函数将根据我在列表框“ ComboBox”中做出选择时想要发生的情况来计数

$button1.add_Click({ Service })

然后,我从添加的按钮中调用该函数,单击该按钮后,其他框会出现。

它与@Postanote的答案并没有很大不同,但这是我更放心的解决方案。