leex01
Goto Top

Powershell Out-Gridview bestimtme Column

Hallo,

ich finde leider nichts brauchbares in der MS Doku. Ich habe ein Object mit vielen Properties und möchte die an Out-Gridview weitergeben. Die meisten Spalten werden jedoch meistens nicht gebraucht und sollen ausgeblendet sein. Ich habe noch keine Möglichkiet gefunden das zu realisieren. Wenn ich über Selct * alles an das Gridview weitergebe werden mir auch alle Spalten angezeigt was sehr unübersichtlich ist. Dann müsste ich die anderen Spalten jedesmal per Hand ausblenden. Wenn ich über Select -property nur die wichtigsten properties weitergebe stimmt die Anzeige zwar, aber natürlich fehlen die anderen Spalten dann und lassen sich auch nicht nachträglich einblenden.

Hat das schon mal jemand lösen können?

Vielen Dank im Voraus

Content-ID: 450420

Url: https://administrator.de/contentid/450420

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

139708
139708 11.05.2019 aktualisiert um 16:37:25 Uhr
Goto Top
Moin.
Da wirst du dir eine eigene Powershell-WinForm oder WPF mit einem DataGridView bauen müssen. Out-Gridview unterstützt eben nur die Objekte die du ihm auch übergibst, Optionen zum initialen ausblenden hat es nicht.

Gruß wireguard
LeeX01
LeeX01 11.05.2019 um 16:50:24 Uhr
Goto Top
Hi Wireguard,

sowas habe ich noch nicht gemacht, glaube auch da reichen meine Programmierkenntnisse nicht ganz.

Wie würde man das machen?

Beste Grüße
139708
139708 11.05.2019 aktualisiert um 16:55:41 Uhr
Goto Top
Das baut dir jeder x beliebige Powershell Forms Editor zusammen

Beispiel wie man ein DataGridView einsetzt gibt es hier viele im Forum schau sie dir einfach mal an:


Am einfachsten lernt man das wenn man mal mit Visual Studio eine Form zusammengebaut hat, die Properties und Ereignisse sind nämlich die selben wie in Powershell, da beide die selben Objekte nutzen.
colinardo
Lösung colinardo 11.05.2019, aktualisiert am 18.05.2019 um 18:17:38 Uhr
Goto Top
Servus @LeeX01 ,
Zitat von @LeeX01:
Wie würde man das machen?
z.B. so (schnell mal zusammen gescriptet)
Hat auf die Schnelle natürlich keine Ansprüche auf Vollständigkeit, soll dir nur verdeutlichen was du alles mit den Forms machen kannst. Du kannst es ja als Basis-Gerüst für deine eigenen Anpassungen hernehmen und z.B. selbst das einzelne Ein- und Ausblenden der Spalten einbauen, den Spaß wollte ich dir jetzt nicht auch noch nehmen face-wink.
function Out-GridViewCustom {
param(
    [parameter(mandatory=$false,ValueFromPipeline=$true)]$data,
    [parameter(mandatory=$false)][string[]]$showColumns,
    [parameter(mandatory=$false)][string]$title,
    [parameter(mandatory=$false)][ValidateSet("Multiple","Single")]$OutputMode = "Multiple"  
)
    begin{
        
        #region Import the Assemblies
        [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
        [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
        #endregion
        $script:selectedData = $null
        $script:hiddenColumns = $null
        $all = @()
    }
    process{
        if ($data -ne $null){
            $all += $data
        }
    }

    end{
        $formMain = New-Object System.Windows.Forms.Form
        $btnOK = New-Object System.Windows.Forms.Button
        $dgv = New-Object System.Windows.Forms.DataGridView
        $btnHiddenColumns = New-Object System.Windows.Forms.Button
        $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState

        #----------------------------------------------
        # Event Script Blocks
        #----------------------------------------------
        $handler_btnOK_Click= 
        {
            if ($dgv.SelectedRows.Count -gt 0){
                $script:selectedData = $dgv.SelectedRows.DataBoundItem
            }
            $formMain.Close()
        }

        $handler_formMain_Load= 
        {
            if($title){
                $formMain.Text = $title
            }
            if ($all.Count -eq 0){
                $btnHiddenColumns.Enabled = $false
                return
            }
            $arrList = New-Object System.Collections.ArrayList
            $arrList.AddRange(@($all))
            $dgv.DataSource = $arrList

            if ($showColumns.Count -gt 0){
                $colIndex = 0
                $cols = $all | gm -MemberType Properties| select -Expand Name
                $showColumns | ?{$_ -in $cols} | %{
                    $dgv.Columns[$_].DisplayIndex = $colIndex
                    $colIndex++
                }
                
                $script:hiddenColumns = $dgv.Columns.Name | ?{$_ -notin $showColumns} 
                $script:hiddenColumns | %{$dgv.Columns[$_].Visible = $false}
                if ($script:hiddenColumns.count -eq 0){
                    $btnHiddenColumns.Enabled = $false
                }
            }else{
                $btnHiddenColumns.Enabled = $false
            }
        }
        $handler_btnHiddenColumns_Click= 
        {
            if ([System.Windows.Forms.MessageBox]::Show("Folgende Spalten sind ausgeblendet:`n`n- $($script:hiddenColumns -join "`n- ")`n`nMöchten Sie sie jetzt einblenden?","Spalten einblenden",4,32) -eq 6){  
                $script:hiddenColumns | %{$dgv.Columns[$_].Visible = $true}
                $btnHiddenColumns.Enabled = $false
            }
        }
        $OnLoadForm_StateCorrection=
        {#Correct the initial state of the form to prevent the .Net maximized form issue
	        $formMain.WindowState = $InitialFormWindowState
        }

        #----------------------------------------------
        #region Generated Form Code
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Height = 452
        $System_Drawing_Size.Width = 632
        $formMain.ClientSize = $System_Drawing_Size
        $formMain.DataBindings.DefaultDataSourceUpdateMode = 0
        $formMain.Name = "formMain"  
        $formMain.Text = "DataGrid"  
        $formMain.add_Load($handler_formMain_Load)

        $btnHiddenColumns.Anchor = 6
        $btnHiddenColumns.DataBindings.DefaultDataSourceUpdateMode = 0
        $System_Drawing_Point = New-Object System.Drawing.Point
        $System_Drawing_Point.X = 12
        $System_Drawing_Point.Y = 417
        $btnHiddenColumns.Location = $System_Drawing_Point
        $btnHiddenColumns.Name = "btnHiddenColumns"  
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Height = 23
        $System_Drawing_Size.Width = 113
        $btnHiddenColumns.Size = $System_Drawing_Size
        $btnHiddenColumns.TabIndex = 2
        $btnHiddenColumns.Text = "Spalten einblenden"  
        $btnHiddenColumns.UseVisualStyleBackColor = $True
        $btnHiddenColumns.add_Click($handler_btnHiddenColumns_Click)
        $formMain.Controls.Add($btnHiddenColumns)


        $btnOK.Anchor = 10
        $btnOK.DataBindings.DefaultDataSourceUpdateMode = 0
        $System_Drawing_Point = New-Object System.Drawing.Point
        $System_Drawing_Point.X = 545
        $System_Drawing_Point.Y = 417
        $btnOK.Location = $System_Drawing_Point
        $btnOK.Name = "btnOK"  
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Height = 23
        $System_Drawing_Size.Width = 75
        $btnOK.Size = $System_Drawing_Size
        $btnOK.TabIndex = 1
        $btnOK.Text = "OK"  
        $btnOK.UseVisualStyleBackColor = $True
        $btnOK.add_Click($handler_btnOK_Click)
        $formMain.Controls.Add($btnOK)

        $dgv.Anchor = 15
        $dgv.DataBindings.DefaultDataSourceUpdateMode = 0
        $System_Drawing_Point = New-Object System.Drawing.Point
        $System_Drawing_Point.X = 12
        $System_Drawing_Point.Y = 12
        $dgv.Location = $System_Drawing_Point
        $dgv.Name = "dgv"  
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Height = 399
        $System_Drawing_Size.Width = 608
        $dgv.Size = $System_Drawing_Size
        $dgv.TabIndex = 0
        $dgv.SelectionMode = 1
        $dgv.MultiSelect = $OutputMode -eq "Multiple"  
        $dgv.AllowUserToAddRows = $false
        $dgv.AllowUserToResizeRows = $false
        $dgv.AllowUserToDeleteRows = $false
        $dgv.ReadOnly = $true

        $formMain.Controls.Add($dgv)

        #Save the initial state of the form
        $InitialFormWindowState = $formMain.WindowState
        #Init the OnLoad event to correct the initial state of the form
        $formMain.add_Load($OnLoadForm_StateCorrection)
        #Show the Form
        $formMain.ShowDialog()| Out-Null
        # return selected data
        return $script:selectedData
    }
} #End Function

# testdaten erzeugen 
$mydata = get-service
# ... und mit custom gridview anzeigen lassen
$mydata | Out-GridViewCustom -showColumns Status,Name,DisplayName -title "Das ist ein Titel"  
Als Beispieldaten dienen hier die Dienste. Es können aber alle anderen Custom-Object(Arrays) als Datenquelle dienen.

Viel Spaß.
Grüße Uwe

p.s. Den Faux-Pas im Titel bitte noch korrigieren, Merci.
LeeX01
LeeX01 13.05.2019 um 15:45:27 Uhr
Goto Top
Hi Uwe,

vielen Dank dafür, ich werde es ausprobieren.

Beste Grüße
LeeX01
LeeX01 16.05.2019 um 18:30:17 Uhr
Goto Top
Hi Uwe,

habe deinen Code gerade getestet und eingebaut, funktioniert super.

Vielen Dank nochmal dafür!!!
Beste Grüße
colinardo
colinardo 16.05.2019 aktualisiert um 18:43:03 Uhr
Goto Top
Keine Ursache, freut mich wenn's hilft.

Schönen Abend.

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
LeeX01
LeeX01 18.05.2019 um 13:24:28 Uhr
Goto Top
Hallo Uwe,

vielleicht kannst du mir doch nochmal helfen? Ich habe gerade noch zwei Probleme mit dem CustomGrid.

Es wirft Fehlermeldungen wenn keine Daten übergeben werden und die Spalten werden nicht in der Reihenfolge angezeigt in der ich sie angegeben habe.

Meinst du das lässt sich einfach fixen?

Viele Grüße
139708
139708 18.05.2019 aktualisiert um 14:54:09 Uhr
Goto Top
Zitat von @LeeX01:
Es wirft Fehlermeldungen wenn keine Daten übergeben werden
Wundert nicht denn das validiert doch die Funktion mit
[ValidateNotNullOrEmpty()]
face-wink ist also kein Fehler ansich, der Fehler ist das du keine Daten anlieferst was soll dir Form also darstellen?! Unsichtbare Geister face-wink
LeeX01
LeeX01 18.05.2019 um 15:01:59 Uhr
Goto Top
Zitat von @139708:

Zitat von @LeeX01:
Es wirft Fehlermeldungen wenn keine Daten übergeben werden
Wundert nicht denn das validiert doch die Funktion mit
[ValidateNotNullOrEmpty()]
face-wink ist also kein Fehler ansich, der Fehler ist das du keine Daten anlieferst was soll dir Form also darstellen?! Unsichtbare Geister face-wink

Es könnte wie beim standardgrid einfach ein leeres Grid anzeigen. Das macht es auch aber zeigt eben die Fehlermeldung was unschön ist.
OK dann fang ich das vorher ab. muss ich mir nur überlegen wie ich das anzeige wenn das grid nicht gezeigt wird um ein Feedback zu geben.

viel störender ist aber das die Spalten nicht in der angebenen Reihenfolge stehen und die wichtigsten Spalten irgendwo mitten drin stehen.
colinardo
colinardo 18.05.2019 aktualisiert um 15:43:56 Uhr
Goto Top
Servus,
@139708 hat recht, das war so vorgesehen das die Funktion zwingend Daten anfordert, lässt sich aber problemlos anpassen. Hatte ja geschrieben das es nicht 1:1 das GridView abbildet face-wink.
Habe dir aber beide Wünsche oben eingebaut. Schönes Wochenende.

Grüße Uwe
colinardo
colinardo 18.05.2019 aktualisiert um 16:00:21 Uhr
Goto Top
p.s. Hatte ich zwar schon erwähnt, hast du aber wohl übersehen:
Den Faux-Pas "bestimtme" im Titel bitte noch korrigieren, Merci.
LeeX01
LeeX01 18.05.2019 um 16:29:50 Uhr
Goto Top
fast perfekt, merci!

Habe den Code noch ergänzt im OK Button Click event, da sonst bei leerem Grid oder keiner Auswahl der Fehler
"Die Eigenschaft "DataBoundItem" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass die Eigenschaft vorhanden ist."
geworfen wird. Falls das mal noch wer benutzen will.

if($dgv.SelectedRows.Count -gt 0){$script:selectedData = $dgv.SelectedRows.DataBoundItem}
colinardo
colinardo 18.05.2019 aktualisiert um 18:31:44 Uhr
Goto Top
Ja, die Zeile war beim Update abhanden gekommen, ist ergänzt.

Die Benachrichtigungsmails hier scheinen momentan nicht richtig zu funktionieren, deswegen etwas verzögerte Antworten.