Zeigt eine Liste an, wenn eine Auswahl getroffen wurde

615
Nad

Ich versuche, ein Skript unter Windows.Form zu umgehen, und ich bin ein bisschen festgefahren.

Ich möchte, dass eine bestimmte Liste angezeigt wird, abhängig von der Auswahl aus der ersten Liste. Dies bedeutet, dass zu Beginn des Skripts nur eine Liste angezeigt werden muss und viele andere verfügbar sind, je nach Auswahl.

Hier ist das vollständige Skript als Referenz

#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. 

Wenn jemand eine Idee hat, wo ich suchen könnte, wäre das großartig.

Danke dir, Nad

0
Leider sind Programmierfragen hier nicht thematisch, aber es sieht so aus, als ob es für unsere Schwesterseite passt. Sie sollten einen Moderator bitten, Ihre Frage dort zu migrieren. Burgi vor 5 Jahren 0

1 Antwort auf die Frage

1
postanote

1. Sie haben keine Formular- / Auslöseereignisse in Ihrem Code.

2. Sie haben nicht die richtigen GUI-Objekte in Ihrem Code, um ein Listen- / Datensatzergebnis zu speichern.

Ein Formular ist nur ein Container, der Elemente enthält, bis Sie den Code dahinter hinzufügen, damit er etwas ausführt. Sie müssen über ein korrektes GUI-Objekt verfügen, an das das Ergebnis gesendet werden soll.

Ich bin nicht sicher, ob Sie dies im ISE oder VSCode oder Notepad oder was auch immer von Hand tun, aber dies ist ein guter erster Versuch. Was Sie jedoch zeigen, scheint darauf hinzudeuten, dass Sie mit der GUI-Entwicklung / allgemeinen App-Entwicklung nicht wirklich auf dem Laufenden sind, da das, was Sie tun, nicht nur für PowerShell einzigartig ist, sondern für jeden App-Entwicklungsclient oder das Web.

Verbringen Sie also einige Zeit damit, die allgemeine WPF / Winforms-Entwicklung zu studieren und zu überprüfen.

Für Ihren Anwendungsfall benötigen Sie:

  • Definieren Sie das Listen-GUI-Objekt (mehrzeilig, ListBox, ListView, Datagrid), in dem die Ergebnisse gespeichert werden sollen (durch das Kombinieren von Combox-Feldern werden Elemente bei Ereignisaktionen hinzugefügt und entfernt).
  • Definieren Sie, was diese Liste ist (Textdateien, Db-Read usw.).
  • Lesen Sie aus der Liste beim Klicken, Ändern oder einem anderen Formularereignis das GUI-Listenobjekt

Es gibt viele Beispiele dafür auf dieser Website und im gesamten Web.

Hier ein gutes Video zur GUI-Entwicklung mit PowerShell:

Powershell füllt die Combobox basierend auf dem ausgewählten Element in einer anderen Combobox auf

Aus der obigen Diskussion (nicht etwas, das Sie einfach in Ihren Code einfügen sollten, ohne zu verstehen, was und warum):

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 } } 

Zuletzt mit diesem…

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

… Würde man nicht tun, weil die Konsole nicht geöffnet wird, um diese Ergebnisse zu sehen, und Write-Host sollte vermieden werden, außer wenn nur Konsolen-Text-Kolorierungen von anderen Konsolen-Formatierungsszenarien verwendet werden. Außerdem wird der Anzeigepuffer geleert, sodass dies nicht möglich ist zu etwas anderem geschickt werden. Außerdem haben Sie an keiner Stelle des Formulars ein GUI-Objekt mit dem Namen "ComboBox", sodass es für Ihren Anwendungsfall keinen Zweck erfüllt.