none
WindowsForms Datagridview eigene Spaltenüberschrift RRS feed

  • Frage

  • Hallo zusammmen,

    hoffe es kann mir jemand bei meinem Problem helfen.

    Ein listview wird über eine xml mit Inhalt gefüllt. Hierüber wähle ich die Attribute aus, welche in der AD abgefragt werden sollen. Spalte1 ist das Attribute und in Spalte2 der Wert, der später im Datagridview angezeigt werden soll.

    Soweit funktioniert das auch alles. Hier, was ich dann als Resultat bekomme.

    Wie oben beschrieben, soll nun z.b. aus
    givenName --> Firstname
    extensionAttribute1 --> Lab

    werden.

    Hier kommt jetzt etwas Code:

    #load settings from the xml-file for the AD-Attribute (xml-file defined in the mainform)
    $Script:XMLAttributes = $XMLfile.Settings.AD.Attributes.Attribute | Select-Object ADName, displayName, Groups
    	
    #load the xml attributes from the xml-file to the listview
    $XMLAttributes | 
    		ForEach-Object {
    		Add-ListViewItem -ListView $lstviewAttribute -Items $_.ADName -SubItems $_.displayName -Group $_.Groups
    		}
    		
    #get all checked attributes from listview
    $checkedAttributes = @()
    ForEach ($item In $lstviewAttribute.CheckedItems)
    {
    	$checkedAttributes = $checkedAttributes += $item.Text
    }
    
    #get all enabled user for the choosen attributes
    $ADUsers = Get-ADUser -LDAPFilter '(!userAccountControl:1.2.840.113556.1.4.803:=2)' -Properties * -SearchBase $lblSearchbaseAttributes.Text | Select-Object $checkedAttributes
    
    #fill the datagridview
    $dtgAttributes.DataSource = ConvertTo-DataTable -InputObject $ADUsers
    Ich bekomme es einfach nicht hin, über "Calculates-Properties" diese Spalten umzubenennen.
    An welcher Stelle und wie müsste ich den Code hier anpassen?

    Gruß

    Dienstag, 19. Oktober 2021 15:54

Antworten

  • ConvertTo-DataTable erstellt ein Object vom Typ DataTable.
    DataTable hat ein Array von Columns (DataTable.Columns) und jede Column hat eine Caption-Eigenschaft.
    Diese Eigenschaft kann dann neu zugewiesen werden um sie als Überschrift anzuzeigen.

    $Table = ConvertTo-DataTable -InputObject $ADUsers
    $Table.Columns["givenName"].Caption = "Name"
    $dtgAttributes.DataSource = $Table


    Dienstag, 19. Oktober 2021 16:39
  • Du arbeitest mit der Liste und nicht mit der DataTable, die du der DataSource zuweist:

    $dtgAttributes.DataSource = ConvertTo-DataTable -InputObject $ADUsers

    Allerdings wird bereits durch die Zuweisung die Liste intern initialisiert, so dass das Ändern der DataTable-Eigenschaften nachträglich zu Fehlern führt.

    Also wie oben beschrieben:

    $Table = ConvertTo-DataTable -InputObject $ADUsers
    // hier nun die Eigenschaften setzen

    $dtgAttributes.DataSource = $Table // nun der Liste zuweisen

    Wobei mir persönlich von der Art der Objektzugriffe schwindelig wird.
    Wenn man auf die Eigenschaften durch Punkt-Notation zugreift wirds einfacher.

    Schau dir die Eigenschaften und Methoden des $XMLAttributes-Objektest an (ISE).
    Für einen dynamischen Zugriff auf eine Eigenschaft in einer Variable kann man dies verwenden:

    $Object."$Name" $Object["$Name"]
    $Object.["$Name"]

    Je nach Typ des Objekts.


    Mittwoch, 20. Oktober 2021 12:41

Alle Antworten

  • ConvertTo-DataTable erstellt ein Object vom Typ DataTable.
    DataTable hat ein Array von Columns (DataTable.Columns) und jede Column hat eine Caption-Eigenschaft.
    Diese Eigenschaft kann dann neu zugewiesen werden um sie als Überschrift anzuzeigen.

    $Table = ConvertTo-DataTable -InputObject $ADUsers
    $Table.Columns["givenName"].Caption = "Name"
    $dtgAttributes.DataSource = $Table


    Dienstag, 19. Oktober 2021 16:39
  • Hi,

    danke für die Antwort.
    Wenn man die Spalten vorher weiß, kann man es natürlich so machen. Diese werden jedoch dynamisch über das listview augewählt. Wenn also "givenName" nicht mehr ausgewählt ist, würde das nicht mehr funktionieren.
    Es müssten ja dann alle z. Z. vorhandenen Spaltennamen abgefragt werden, und durch die Namen aus der listview ersetzt werden. 

    Habe jetzt mal folgendes probiert:

    #fill the datagridview
    $dtgAttributes.DataSource = ConvertTo-DataTable -InputObject $ADUsers
    		
    For ($i = 0; $i -lt $dtgAttributes.ColumnCount;$i++)
    {
    $display = $XMLAttributes | Where-Object {$_.ADname -eq $dtgAttributes.Columns[$i].Name} | Select-Object -ExpandProperty displayName
    $dtgAttributes.Columns[$i].HeaderText = $display
    }

    Habe also das Grid wie gehabt füllen lassen und dann im Anschluss die Spalten angepasst. Das funktioniert schon mal.

    Bringt mich aber zu einem nächsten Problem. Wenn ich nun versuche diese Tabelle als csv zu exportieren, werden die alten Spaltenüberschriften exportiert:

    $dtgAttributes.Rows | Select-Object -ExpandProperty DataBoundItem | Export-Csv -Path "$ScriptDirectory\$env:USERNAME\AttributeReport.csv" -NoTypeInformation -Encoding UTF8 -Force

    Export hat bei meinen bisherigen Exports immer funktioniert, musste dort aber auch noch nie die Spaltenüberschriften ändern. Hat hier bestimmt etwas mit dem DataBoundItem zu tun????

    Ein Problem gelöst (hoffe ich) ein nächstes geschafften. Aller Anfang ist schwer, wie man sieht.
    Evtl. hast du hier auch noch einen Tipp??


    • Bearbeitet Paddy75 Dienstag, 19. Oktober 2021 20:27
    Dienstag, 19. Oktober 2021 20:23
  • Das liegt in der Natur der Sache.
    Für den CSV-Ex-/-import werden die Feldnamen verwendet.
    Da du ja die DataTable nur intern ohne Datenbank verwendest, kannst du ebenso auch die Eingeschaft "ColumnName" überschreiben.

    Auf die Eigenschaft Columns kannst du ebenso mit einem numerischen Index zugreifen:

    $Table.Columns[$i].Caption =
    $Table.Columns[$i].ColumnName =

    Was du allerdings vor der Zuweisung zur Liste tun solltest.

    Wie das DataTable-Object aufgebaut ist und welche Methoden und Eigenschaften es gibt, kannst du hier nachlesen:
    https://docs.microsoft.com/de-de/dotnet/api/system.data.datatable?view=net-5.0

    https://docs.microsoft.com/de-de/dotnet/api/system.data.datacolumn?view=net-5.0



    Mittwoch, 20. Oktober 2021 08:26
  • hmmm, stehe da etwas auf dem Schlauch.

    durch $dtgAttributes.Columns[$i].HeaderText = $display
    habe ich doch schon eine Zuweisung durchgeführt??

    Caption, ColumnName wird mir hier nicht angeboten

    Was übersehe ich daaa.

    Mittwoch, 20. Oktober 2021 10:37
  • Du arbeitest mit der Liste und nicht mit der DataTable, die du der DataSource zuweist:

    $dtgAttributes.DataSource = ConvertTo-DataTable -InputObject $ADUsers

    Allerdings wird bereits durch die Zuweisung die Liste intern initialisiert, so dass das Ändern der DataTable-Eigenschaften nachträglich zu Fehlern führt.

    Also wie oben beschrieben:

    $Table = ConvertTo-DataTable -InputObject $ADUsers
    // hier nun die Eigenschaften setzen

    $dtgAttributes.DataSource = $Table // nun der Liste zuweisen

    Wobei mir persönlich von der Art der Objektzugriffe schwindelig wird.
    Wenn man auf die Eigenschaften durch Punkt-Notation zugreift wirds einfacher.

    Schau dir die Eigenschaften und Methoden des $XMLAttributes-Objektest an (ISE).
    Für einen dynamischen Zugriff auf eine Eigenschaft in einer Variable kann man dies verwenden:

    $Object."$Name" $Object["$Name"]
    $Object.["$Name"]

    Je nach Typ des Objekts.


    Mittwoch, 20. Oktober 2021 12:41
  • Hallo

    Es gibt einen früheren Thread mit ähnlichem Verhalten, den Sie möglicherweise für die ConvertTo-DataTable überprüfen möchten:

    https://social.technet.microsoft.com/Forums/de-DE/f4dafd09-525c-41cb-82f1-ad89eb3e862e/powershell-datagridview-table-properties?forum=winserverpowershell

    Hoffe das hilft bei deiner Anfrage,
    Montag, 25. Oktober 2021 19:58