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