ole-objekt
Goto Top

DataGridView Spalten sortierbar machen

Moin!

In einer von mir betreuten (aber nicht entwickelten) Anwendung wird die Variable $dbResult mittels invoke-sqlcmd gefüllt. Das ist dann wohl eine DataRowCollection? (screenshot1)

Dann wird sie dem User zur Ansicht und Auswahl dargeboten:
$oDummy = $dbResult | Out-GridViewCustom -Title $eStep.Info

Out-GridViewCustom ist eine Funktion, die ein Fenster mit Buttons, Kontextmenü usw aufbaut. Hier ist der (gekürzte) Code:

            $formMain = New-Object System.Windows.Forms.Form
            $btnOK = New-Object System.Windows.Forms.Button
            $dgv = New-Object System.Windows.Forms.DataGridView
            $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
            }
            
            $OnLoadForm_StateCorrection={#Correct the initial state of the form to prevent the .Net maximized form issue
                $formMain.WindowState = $InitialFormWindowState
            }
            
            #----------------------------------------------
            
            $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.StartPosition="CenterScreen"  
            $formMain.TopMost=$true
            $formMain.add_Load($handler_formMain_Load)
    
            $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.AllowUserToOrderColumns = $true
            $dgv.AllowUserToResizeColumns = $true
            #$dgv.AutoSizeColumnsMode = 'AllCellsExceptHeader';  
            $dgv.ReadOnly = $true
    
            #----- mein Versuch -----------------------------------------
            foreach($column in $dgv.Columns){
                $column.SortMode = 1;
            }
            #----- mein Versuch Ende-----------------------------------------

            $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
            

Mein Problem ist, dass die Spalten nicht für den Anwender sortierbar waren. Ich habe also den mit #----- mein Versuch --- eingerahmten Block eingefügt und dabei auch etliche Varianten versucht, so statt der 1 auch mit DataGridViewColumnSortMode.Automatic u.ä.
Aber das eigentliche Problem scheint zu sein, dass in der Schleife die einzelnen Spalten gar nicht durchgegangen werden. Und es gibt in $dgv überhaupt keine Spalten (screenshot2), und dennoch sieht der Anwender eine gefüllte Tabelle... Ich verstehe die Welt nicht mehr.

Hat jemand Ideen, was da los ist und wie ich die Spalten sortierbar bekomme?

Herzliche Grüße, Olaf
screenshot2
screenshot1

Content-ID: 671787

Url: https://administrator.de/forum/datagridview-spalten-sortierbar-machen-671787.html

Ausgedruckt am: 06.03.2025 um 22:03 Uhr