none
SQL Abfrage in ComboBox füllen RRS feed

  • Allgemeine Diskussion

  • Hi

    Ich versuche mit Powershell ein GUI mit mehreren ComboBox und TextBox zu machen. Befüllt werden sollen sie aus einem Resultat einer SQL Abfrage ($sqlReturn). Darin sind alle Daten enthalten, die ich für die GUI benötige. Nur halt separat gefiltert, je nach Auswahl in einer ComboBox ..

    Hier ein Auszug der Abfrage, wenn ich $sqlReturn direkt auf der Konsole ausgebe:

    zNummer   zUser                 zANummer        zNachname             
    --------- --------------------- ----------      ---------             
    I19_045   (nicht zugewiesen)    XY 2019 212     Müller                 
    I14_014   (nicht zugewiesen)                    Testeintrag           
    I19_065   kurz1                 XY 2019 1172    Meier              
    I19_050   kurz1                 XY 2019 1177    Marfurt                
    I19_048   kurz3                 XY 2019 467     Müller
    I19_048   kurz3                 XY 2019 467     Peter 

    Die erste ComboBox enthält alle Namen (zUser), die in $sqlReturn vorkommen. Das klappt soweit ..

    # Aus einem INI File wird der default User ausgelesen
    $inifile = Get-IniContent "$PSScriptRoot\include\meinFile.ini"
    $USR = $inifile["User"]["user"]
    
    $sqlReturn = Get-SQLData $srv1 $srv2 $srv3 $srv4 $sqlString
    
    # erste ComboBox mit User
    $DropDownArray0 = $sqlReturn.zUser | Get-Unique
    
    #  Ab hier beginnt dann die GUI
    #  Nur ein Auszug von der ersten ComboBox
    
      $objComboBox0.Items.AddRange($DropDownArray0)
      $objForm.Controls.Add($objComboBox0)
      # ComboBox Zeiger auf default User legen
      $objComboBox0.Text = $USR

    Die zweite ComboBox soll nun, abhängig vom ausgewählten User in der ersten ComboBox, die in der SQL Abfrage vorhandenen Nummern (zNummer) ausgeben.

    Wenn in der ersten ComboBox also 'kurz1' ausgewählt wurde, soll in der zweiten ComboBox 'i19_050' und 'I19_065' zur Auswahl stehen.

    Ohne jetzt bereits schon auf den dynamischen Wechsel der Anzeige von ComboBox 2, in Abhängigkeit zu ComboBox 1 einzugehen, wollte ich erst einmal nur die gefilterten Daten für die zweite ComboBox aufbereiten. Allerdings scheitere ich an der Filterung...

    Hier mal einer meiner Versuche an ein Ergebnis zu kommen ..

    # auch hier nur ein Auszug aus der GUI ..
    #  nach Einträgen für erste ComboBox ..
    
     # gib den augewählten zUser  der ersten ComboBox zurück
      $UserName = $objComboBox0.SelectedItem
    
    # jetzt das Aufbereiten der SQL Abfrage für die zweite ComboBox
      ForEach($row1 in $script:sqlReturn) {
        $dda1 = $row1.zUser
        If ($dda1 -contains $UserName) {
          $DropDownArray1 = $row1.zNummer
        }
      }
    
      # nur einmalige zNummern zur Auswahl geben
      $DropDownArray1 = $DropDownArray1 | Get-Unique
        
      # zNummern des Users in ComboBox abfüllen
      $objComboBox1.Items.AddRange($DropDownArray1)
      
      $objForm.Controls.Add($objComboBox1)

    Wie bereits erwähnt, das liefert leider alle zNummern aus der SQL Abfrage zurück, ohne zusätzlicher Datenreduktion auf die Datensätze von UserName ..

    Vielleicht hat mir ja jemand einen Tipp dazu. Vielleicht auch gleich einen Hinweis darauf, wie ich die Abhängigkeit der ComboBoxen wärend der Laufzeit der GUI hinbekomme?



    Mittwoch, 4. Dezember 2019 15:49

Alle Antworten

  • Nur so als Tipp am Rande:
    Warum machst du dir es so schwer, mit Powershell sowohl eine GUI als auch SQL-Zugriffe zu gestalten?
    Mit VisualStudioCode oder Visual Studio Community hast du erheblich mehr und einfachere Methoden und Werkzeuge grafische Oberflächen zu bauen und den Elementen direkt SQL's zuzuordnen (Stichwort Datenbindung).
    Außerdem gibt es da eigene Foren und viele Anwendungsbeispiele in z.B. CodeProject.

    Die Powershell ist dazu eher nur rudimentär und mit großem Aufwand geeignet.

    Donnerstag, 5. Dezember 2019 09:03
  • Na ja ..

    Ich habe ein Powershell Script, das für mich auf der Konsole sehr gut funktioniert. Aber meine Kollegen hätten gerne eine GUI. Da war halt mein erster Weg zu sehen, wie ich die GUI mit Powershell erstellen kann.

    Bisher benötige ich ja nur eine einzige SQL Abfrage, und die kann ich aus Powershell sehr gut machen. Nur gestaltet sich das Befüllen der einzelnen ComboBoxen schwieriger als gedacht. Und bevor ich jetzt mit einem anderen Mittel mein Projektziel verfolge, wollte ich sehen dass ich es mit Powershell hinbekomme.

    mal abgesehen davon, für mich wäre es ein Lerneffekt .. :-)

    Donnerstag, 5. Dezember 2019 10:28
  • ... nur so'ne Idee .... beim Thema GUI bin ich raus, aber wenn ich lese ...

    Die zweite ComboBox soll nun, abhängig vom ausgewählten User in der ersten ComboBox, die in der SQL Abfrage vorhandenen Nummern (zNummer) ausgeben.

    ... klingt das für mich danach, als könnte das eventuell eine gute Gelgenheit sein, ein Gridview einzusetzen. Damit kann man strukturierte Daten (Tabellen) sehr gut und übersichtlich darstellen und filtern und man kann auch eine Auswahl treffen und das Ergebnis ausgeben bzw. weiterverarbeiten. Vielleicht genügt das ja für die "Konsolen-unwilligen" Kollegen.  ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Bearbeitet BOfH-666 Donnerstag, 5. Dezember 2019 12:45
    Donnerstag, 5. Dezember 2019 12:43
  • Alle Forms-Objekte unterstützen die Datenbindung.
    Dazu gibt es eine DataSource-Eigenschaft.
    Über die ValueField/DisplayField-Eigenschaft lassen sich entsprechende Inhalte aus der DataSource dann darstellen.

    Um also eine ComboBox zu füllen, weist man der DataSource-Eigenschaft ein Array von Werten zu.
    Dein SQL-Resultset ist ein solches Array, das man so verwenden kann.
    Wenn eine Combobox einen Wert ändert, bekommst du ein "SelectedIndexChanged"-Event, an das du dich mit einer Funktion hängen must.
    Tritt das Ereignis ein, deine Funktion wird also aufgerufen, kannst du mit der Value-Eigenschaft (oder Text) den aktuellen Wert aus der 1. Combobox auslesen, deinen SQL zurechtzimmern und das Result dann der 2. Combobox direkt zuweisen. Diese bietet das Ergebnis zum Dropdown dann an.

    Donnerstag, 5. Dezember 2019 14:39
  • So, ich hab nach einigem Üben mit der 'einzelnen' SQL Abfrage aufgegeben und mehrere gemacht. Damit klappt das Befühlen der unterschiedlichen Felder, DropDowns ..

    Und was die Abhängigkeiten der Felder, DropDowns anbelangt, der Hinweis von #der Suchende; hat mich in die korrekte Richtung geleitet. Vielen Dank!

     $objComboBox0_SelectedIndexChanged= {
        # aktuelles Item auslesen
        $script:UserName = $objComboBox0.SelectedItem
        # jetzt ComboBox1 leeren
        $objComboBox1.Items.Clear()
        # DB Abfrage für DropDownArray1 mit neuem Item ausführen
        Get-AktivCasesNr $script:UserName
        # DropDownArray1 in ComboBox2 einfüllen
        $objComboBox1.Items.AddRange($DropDownArray1)
        $objComboBox1.SelectedIndex = 0
      }

    #BOfH-666; Dein Hinweis auf den GridView konnte ich für meine Zwecke so nicht nutzen. Trotzdem Danke.


    • Bearbeitet MeHans Freitag, 31. Januar 2020 13:53
    Freitag, 31. Januar 2020 13:50
  • Nur so als Hinweis:

     $script:UserName = $objComboBox0.SelectedItem
    Get-AktivCasesNr $script:UserName
    $objComboBox1.Items.AddRange($DropDownArray1

    Ich kann nur raten: $DropdownArray1 wird in Get-AktivCasesNr befüllt? Das ist kein guter Programmierstil, das sollte so aussehen:

        $DropdownArray1 = Get-AktivCasesNr( $objComboBox0.SelectedItem )
    $objComboBox1.Items.AddRange($DropDownArray1)

    Damit ist jedem Leser sofort klar, wo das Array herkommt. Zudem vermeidest Du das Scoping von Username. Außer natürlich Du brauchst den noch an anderer Stelle - aber auch da steht er ja immer noch in $objComboBox0.SelectedItem.

    Das Präfix obj bei Variablen halte ich persönlich für grenzwertig. In Powershell ist ja alles ein Objekt :-) Wenn, dann würde ich die CB0 vmtl. $cbUserName nennen, die CB1 dann $cbUserCases. Nur so ein Gedanke.

    Ja, kch weiß daß das "pingelig" klingt, aber bei Heise war heute ein interessanter Artikel, in dem es auch um Code-Qualität geht: https://heise.de/-4647389


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq


    Freitag, 31. Januar 2020 16:01
  • #Martin Binder

    Da ich $DropdownArray1 auch noch anderweitig verwende, hatte ich das so gewählt. Aber ich versuche meinen Code mit Deinem Hinweis nochmals neu zu beurteilen.

    Beim Präfix hatte ich mich an ein Beispiel gehalten, bei dem ich den Aufbau einer GUI gesehen hatte.

    Jedenfalls Danke für Deine 'keinesfalls pingeligen' Hinweise :-)

    Donnerstag, 6. Februar 2020 10:34