none
Powershell - Problem mit Formular und DropDown Menue RRS feed

  • Frage

  • Hallo,

    ich habe hier ein Formular erstellt, mit dem in der AD nach
    Benutzern gesucht werden soll. Die gefundenen Namen sollen
    dann in einem Dropdown-Menü auszuwählen sein. Soweit klappt
    das auch ganz gut. Allerdings wird der ausgewählte Name aus
    dem Dropdown-Menü nicht in die Funktion "Return-DropDown"
    übernommen und ich finde das Problem bzw. die Lösung nicht.

    Jemand eine Idee / einen Tipp für mich?

    Vielen Dank.

    Gruß

    yelw0rc

     

    ### powershell script execution policy Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Undefined #Set-ExecutionPolicy Unrestricted # Load ActiveDirectory module Import-Module ActiveDirectory # .NET-Extensions (sog. Assemblies) [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [array]$script:DropDownArray_Temp = $null [array]$script:DropDownArray = $null ### function MakeNewForm function MakeNewForm { $Form.Close() $Form.Dispose() MakeForm } ### this function returns the selected value and their actions function Return-DropDown { Write-Host "HIER !"

    $Auswahl = $DropDown.SelectedItem.ToString() Write-Host "Auswahl: $Auswahl" } ### function MakeForm function MakeForm{ $Form = New-Object System.Windows.Forms.Form $Form.Backcolor=“white“ $Form.StartPosition = "CenterScreen" $Form.width = 800 $Form.height = 550 $Form.Text = "User Info" ### search for lastname $Label1 = New-Object System.Windows.Forms.Label $Label1.Location = New-Object System.Drawing.Size(10,10) $Label1.Text = "Search for lastname:" $Label1.AutoSize = $True $Form.Controls.Add($Label1) $FormTextBox1 = New-Object System.Windows.Forms.TextBox $FormTextBox1.Location = New-Object System.Drawing.Size(10,30) $FormTextBox1.Size = New-Object System.Drawing.Size(125,50) $Form.Controls.Add($FormTextBox1) $FormButton0 = New-Object System.Windows.Forms.Button $FormButton0.Location = New-Object System.Drawing.Size(10,90) $FormButton0.Size = New-Object System.Drawing.Size(125,25) $FormButton0.Text = "Reload Form" $FormButton0.Add_Click({MakeNewForm}) $FormButton1 = New-Object System.Windows.Forms.Button $FormButton1.Location = New-Object System.Drawing.Size(10,60) $FormButton1.Size = New-Object System.Drawing.Size(125,25) $FormButton1.Text = "Search" $FormButton1.Add_Click({ ### search for lastname $searchname = $FormTextBox1.Text ### if input is empty if ($searchname -eq $null -or $searchname -eq ""){ $Label2 = New-Object System.Windows.Forms.Label $Label2.Location = New-Object System.Drawing.Size(10,130) $Label2.Size = New-Object System.Drawing.Size(200,20) $Label2.Text = "Please enter lastname!" $Form.Controls.Add($Label2) Start-Sleep 2 MakeNewForm }else{ ### found users # $aduser = Get-ADUser -Filter "Surname -like '$searchname*'" # $aduser = $aduser.Name # Write-Host "User: $aduser.Name" [array]$DropDownArray_Temp = Get-ADUser -Filter "Surname -like '$searchname*'" foreach ($i in $DropDownArray_Temp){ $aduser = $i.Name Write-Host "aduser1: $aduser" # [array]$DropDownArray += "`"$aduser`"" # [array]$DropDownArray += $aduser | out-null [array]$DropDownArray += $aduser #| out-null } } $DropDown = new-object System.Windows.Forms.ComboBox $DropDown.Location = new-object System.Drawing.Size(160,30) $DropDown.Size = new-object System.Drawing.Size(200,20) ### add users to DropDown $count = 0 foreach ($Item in $DropDownArray){ Write-Host "$count`: $Item" $DropDown.Items.Add($Item) $count++ } $Form.Controls.Add($DropDown) $DropDownLabel = new-object System.Windows.Forms.Label $DropDownLabel.Location = new-object System.Drawing.Size(160,10) $DropDownLabel.size = new-object System.Drawing.Size(200,20) $DropDownLabel.Text = "Choose user please:" $Form.Controls.Add($DropDownLabel) ### OK Button $ButtonOK = new-object System.Windows.Forms.Button $ButtonOK.Location = new-object System.Drawing.Size(160,60) $ButtonOK.Size = new-object System.Drawing.Size(100,20) $ButtonOK.Text = "OK" $ButtonOK.Add_Click({Return-DropDown}) $Form.Controls.Add($ButtonOK) ### Cancel Button $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Size(260,60) $CancelButton.Size = New-Object System.Drawing.Size(100,20) $CancelButton.Text = "Cancel" $CancelButton.Name = "Cancel" $CancelButton.DialogResult = "Cancel" $CancelButton.Add_Click({$Form.Close()}) $Form.Controls.Add($CancelButton) }) $Form.Add_Shown({$Form.Activate()}) $Form.Controls.Add($FormButton0) $Form.Controls.Add($FormButton1) ### show form on the screen $Form.ShowDialog() } Makeform



    • Bearbeitet yelw0rc Mittwoch, 5. Juni 2019 08:18
    Mittwoch, 5. Juni 2019 07:38

Antworten

  • Hallo und willkommen im Forum.
    Das liegt daran das du die Erstellung der Form und seiner Objekte in eine Funktion gepackt hast. Das hat zur Folge das dass deine Dropdown-Liste nur innerhalb dieser Funktion und davon aufgerufen Unterfunktionen existiert (Siehe: Scopes ). Das ist besonders bei einer GUI etwas irritierend, denn sie ist ja noch sichtbar "da", du kannst halt nur nicht mehr drauf zugreifen.

    Also in dem Moment wo duReturn-DropDown aufrufst ist $DropDown nicht mehr zugänglich und daher kommt ein Fehler beim Aufruf der Methode. Du könntest das mit scriptweiten Variablen umgehen, aber es gibt grundsätzlich keinen (guten :-) ) Grund die Form nicht im Root zu erstellen. Dein (mutmaßlicher) Grund, die Form immer wieder neu erstellen zu können, ist einfach lazy programming und führt zu diversen Problemen (wie du siehst).

    Lösche deine Controls bei Bedarf, dann gibt es auch keinen Grund die Form mehr als einmal zu erstellen.

    Grüße, Denniver


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 5. Juni 2019 13:59
    Moderator