Показать список, когда выбор сделан

565
Nad

Я пытаюсь обойти сценарий под 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")   if ($liste1.DisplayMember = "Service Disable")  Write-Host "ComboBox = " $liste1.DisplayMember Write-Host "ComboBox = " $liste2.selectedvalue  #Fin. 

Если у кого-нибудь есть идея, куда я мог бы посмотреть, было бы здорово.

Спасибо тебе, Над

0
К сожалению, вопросы программирования здесь не по теме, но похоже, что это отлично подходит для нашего родственного сайта [так]. Вы должны попросить модератора перенести ваш вопрос туда. Burgi 5 лет назад 0

1 ответ на вопрос

1
postanote

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

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

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

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

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

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

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

Есть много примеров этого на этом сайте и во всем Интернете.

Вот хорошее видео по разработке GUI с PowerShell:

поле со списком PowerShell заполнить на основе выбранного элемента в другом поле со списком

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

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 = " ()" -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 = " ()" -f $mailbox.Name, $mailbox.Alias Load-ComboBox $combobox2 $CurrentMailbox -Append } } 

Наконец, используя это ...

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

… Это не то, что нужно делать, потому что консоль не открывается, чтобы увидеть эти результаты, и следует избегать Write-Host, за исключением того, что при использовании только консольной раскраски текста в других сценариях форматирования только консоли, она также очищает буфер отображения, поэтому она не может быть отправленным на что-либо еще. Кроме того, у вас нет ни одного объекта GUI с именем ComboBox в форме, поэтому он не служит какой-либо цели для вашего варианта использования.