moses-ms
Goto Top

Mehrere ComboBoxen in Powershell "verknüpfen"

Moin zusammen,

ich habe ein "Problem" bei der Nutzung von ComboBoxen in einer PowerShell Form. Eigentlich ist es kein Problem sondern eine Herausforderung, die ich aber nicht gelöst bekomme.
Ich schreibe (nutze diese auch schon) eine Form zur Nutzung der Zeit Kontierung, mittels Klick auf einen Button wird die aktuelle Zeit in eine csv-Datei einträgt etc. Nun besteht die Möglichkeit, über eine ComboBox (angezeigt im Button), die zu bebuchende "Stelle" zu wechseln. Ich habe davon 7 Stück erstellt, da es vorkommt, dass man mal eben etwas für eine andere "Stelle" macht und die Zeiten da auch gebucht werden sollten.
Nun die Herausforderung:
Besteht die Möglichkeit die ComboBoxen so zu verbinden, dass, wenn ich in der ersten ComboBox Stelle1 ausgewählt habe dies in den anderen ComboBoxen nicht mehr möglich ist?
Ich könnte mir auch vorstellen die Einträge auszulesen und auf Dopplung zu prüfen und dann eine Warnung / Hinweis auszugeben.

Dann eine weitere Frage, kann ich eigentlich ForEach für ComboBoxen nutzen wenn ja wie bzw. wo könnte ich dazu etwas nachlesen? Ja, Google ist Dein bester Freund aber hier "Die Suche ist gut, die Finde ist sch..." face-wink

Dane im Voraus
Mike

Content-ID: 3811413306

Url: https://administrator.de/forum/mehrere-comboboxen-in-powershell-verknuepfen-3811413306.html

Ausgedruckt am: 20.04.2025 um 21:04 Uhr

chkdsk
chkdsk 01.09.2022 um 11:36:56 Uhr
Goto Top
Ja, das geht selbstverständlich. Zeig doch mal was du bisher hast.
Grüße
3803037559
Lösung 3803037559 01.09.2022 aktualisiert um 12:07:38 Uhr
Goto Top
Besteht die Möglichkeit die ComboBoxen so zu verbinden, dass, wenn ich in der ersten ComboBox Stelle1 ausgewählt habe dies in den anderen ComboBoxen nicht mehr möglich ist?

$combobox.add_SelectedIndexChanged({
    $form.Controls | ?{$_.GetType().Name -eq 'ComboBox' -and $_.Name -ne $this.Name} | %{  
         $_.Items.Remove($this.SelectedItem)
   }
})

kann ich eigentlich ForEach für ComboBoxen nutzen
$form.Controls | ?{$_.GetType().Name -eq 'ComboBox'} | foreach{}  
Cheers
certguy
manuel-r
Lösung manuel-r 01.09.2022 um 12:03:28 Uhr
Goto Top
Besteht die Möglichkeit die ComboBoxen so zu verbinden, dass, wenn ich in der ersten ComboBox Stelle1 ausgewählt habe dies in den anderen ComboBoxen nicht mehr möglich ist?

Klar geht das. Und wie meist führen viele Wege nach Rom.

Wenn du willst, dass der Eintrag der in Combo A schon ausgewählt wurde gar nicht mehr in Combo B als Auswahl vorhanden ist, dann brauchst du bei A ein SelectedIndexChanged-Event. Wenn das auslöst lädst du in Combo B alle möglichen Auswahlen neu rein außer die, die in A schon ausgewählt ist.

Wenn der Eintrag zwar vorhanden sein soll, aber eine Warnung auslösen soll brauchst du bei B ebenfalls ein SelectedIndexChanged-Event. Nur diesmal prüfst du, ob das was ausgewählt wurde identisch ist mit dem was in A schon ausgewählt wurde. Falls ja gibts du eine MessageBox aus und setzt die Auswahl zurück.

Das mal als grober Anriss wie es lösbar ist.

Manuel
Moses-ms
Moses-ms 01.09.2022 um 17:12:01 Uhr
Goto Top
Danke erst einmal!
So schnell hätte ich nicht mit einer Antwort gerechnet. Kann erst heute Abend / Morgen früh Feedback geben, ob ich die Hinweise erfolgreich umsetzen konnte.
Moses-ms
Moses-ms 01.09.2022 um 21:50:14 Uhr
Goto Top
Ich noch einmal.
"ForEach" erfolgreich umgesetzt.

DANKE

Das "SelectedIndexChanged-Event" werde ich morgen in Angriff nehmen.

Und nochmal Danke
Moses-ms
Moses-ms 02.09.2022 um 14:36:19 Uhr
Goto Top
Moin,

ich noch einmal.
Leider hab ich mich zu früh gefreut. Mit dem ".add_SelectedIndexChanged" ist wohl doch nicht so einfach und ich bräuchte noch einmal eure Hilfe. Folgenden Code habe ich im Script

$4_WBS = New-Object System.Windows.Forms.Button
$4_WBS.Location = New-Object System.Drawing.Point(5, 155)
$4_WBS.Size = New-Object System.Drawing.Size(170, 40)

$cmbBox4 = New-Object System.Windows.Forms.ComboBox
$cmbBox4.Location = New-Object System.Drawing.Point(10,165)
$cmbBox4.Size = New-Object System.Drawing.Size(160)
$cmbBox4.Font = New-Object System.Drawing.Font("Georgia", 9, [System.Drawing.FontStyle]::Bold)  

$cmbBox4.add_SelectedIndexChanged({
    $groupbox.Controls | ?{$_.GetType().Name -eq 'ComboBox' -and $_.Name -ne $this.Name} | %{  
         $_.Items.Remove($this.SelectedItem)
   }
})  
Der Eintrag in der ItemList wird nicht gelöscht face-sad

Nach mehreren Stunden und immer wieder grübeln über "-and $_.Name -ne $this.Name" bin ich darauf gekommen, die ComboBoxen zu benennen und siehe da es funktioniert.

Gibt es noch weitere Gründe warum eine ComboBox einen Namen erhalten sollte? Das Script lief auch ohne "Namen" ganz gut face-wink
3803037559
Lösung 3803037559 02.09.2022 um 14:47:19 Uhr
Goto Top
Du kannst es auch ohne Namen machen dann muss der Vergleich nur
 -and $_ -ne $this
lauten
Moses-ms
Moses-ms 22.09.2022 um 17:16:34 Uhr
Goto Top
Moin noch einmal,

Ich hab das Tool fast fertig und hab beim testen festgestellt, dass das Removen des Items aus der Liste doch nicht so schön ist und ich würde die Option mit der Message bevorzugen.
Aber wie bekomme ich es hin, dass das Tool den alten Eintrag behält also keine Änderungen macht?
Liste komplett löschen, kein Problem
Index des gewählten Eintrages auslesen, kein Problem

Wie komme ich aber an den Vorher gewählten Wert ran? Quasi ein "SelectedIndexChanged_before" oder etwas vergleichbares.
manuel-r
manuel-r 22.09.2022 um 17:48:40 Uhr
Goto Top
Wie komme ich aber an den Vorher gewählten Wert ran? Quasi ein "SelectedIndexChanged_before" oder etwas vergleichbares.

Das musst du dir dann vorher in eine Variable speichern. Einen anderen Weg wüsste ich jetzt nicht.

Manuel
3803037559
3803037559 22.09.2022 aktualisiert um 21:15:49 Uhr
Goto Top
Moses-ms
Moses-ms 23.09.2022 aktualisiert um 09:54:08 Uhr
Goto Top
Moin,
Danke für das FeedBack.
Den vorherigen Eintrag in eine Variable speichern ist genau mein Problem. Geht beim Start, wenn ich mich aber "verklickt" habe, hab ich nur den aktuellen Wert. Ich hab keine Möglichkeit gefunden den vorherigen Wert während der Laufzeit zu speichern. Vielleicht bin ich einfach zu dumm.. face-sad

Das Validating Event wird wohl die Lösung sein. Wieder was gelernt oder auch noch nicht.