Показать список, когда выбор сделан - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь обойти скрипт В Windows.Form, и я немного застрял.

Я бы хотел, чтобы в зависимости от выбора, сделанного с первого раза, появился конкретный списокlist, что означает, что в начале скрипта должен появиться только один список и множество других доступных в зависимости от сделанного выбора.

Вот полный скрипт для справки

#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 голосов
/ 04 марта 2019

После некоторого времени и исследований мне удалось найти именно то, что мне нужно.

Это может помочь людям, которые наткнулись на пост, поэтому здесь небольшая часть того, что я нашел

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, но с этим решением мне было легче.

0 голосов
/ 20 ноября 2018

1.В вашем коде нет форм / событий триггеров.

2.В вашем коде нет нужных объектов графического интерфейса для хранения результатов списка / записи.

Форма - это просто контейнер для хранения элементов, пока вы не добавите код, чтобы заставить его что-то делать.У вас должен быть правильный объект GUI для отправки этого результата.

Я не уверен, что вы делаете это все вручную в ISE, или VSCode, или в Блокноте, или где-то еще, но это хорошая первая попытка.Однако то, что вы показываете, по-видимому, указывает на то, что вы не совсем разбираетесь в разработке GUI / общей разработке приложений, так как то, что вы делаете, на самом деле не уникально для PowerShell, а то, что требуется для любого клиента или приложения для разработки приложений.

Так что, действительно, потратьте некоторое время на изучение / обзор общей разработки WPF / Winforms, и этот материал для событий формы будет рассмотрен.

Что касается вашего варианта использования, вам необходимо:

  • Определить объект графического интерфейса списка (многострочный, ListBox, ListView, datagrid) для хранения результатов (синхронизация полей со списками означает добавление и удаление элементов в действиях по событию)
  • Определение того, что представляет собой этот список (текстовые файлы,чтение базы данных и т. д.)
  • В событии щелчка, изменения или другой формы прочитайте этот список и заполните объект списка GUI

Существует множество примеров этого на этом сайте и всечерез Интернет.

Вот хорошее видео о разработке графического интерфейса с помощью PowerShell:

комбинированный список заполняемых PowerShell на основе selecэлемент ted в другом комбинированном списке

Из вышеприведенного обсуждения (не то, что нужно просто добавить в свой код, не понимая, что и зачем):

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 в форме, поэтому он не служит никакой цели для вашего варианта использования.

...