Laden...

DataGrid zeigt mir die RawView an (c#, WPF und powerShell)

Erstellt von MD_Coding vor 4 Jahren Letzter Beitrag vor 4 Jahren 921 Views
M
MD_Coding Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren
DataGrid zeigt mir die RawView an (c#, WPF und powerShell)

Hallo zusammen,

dies ist mein erster Beitrag. Habt bitte etwas Nachsicht.
Zusätzlich, ist wpf und c# noch recht neu für mich. Trotzdem.. ich habe folgende Situation die ich versuche zu lösen:

Ich möchte eine .DLL erstellen die eine Methode "ShowDialogWithData" hat. Als Parameter verlangt die Methode eine List<t>. Diese Methode öffnet ein WPF Fenster und gibt die Daten an ein DataGrid weiter.

Diese Methode wird dann über ein eigenes powerShell Cmdlet aufgerufen.

Der Hintergrund:
Ich brauche ein Cmdlet welches eine Datenquelle entgegennimmt und dieses in einem Fenster mit DataGrid ausgibt (ähnlich dem Cmdlet Out-GridView).

Hier ein bisschen Code:

Mein Fenster (hat nur ein DataGrid...)

<Window
        x:Class="My.Extension.UI.GridWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"

        mc:Ignorable="d"
        Title=" Grid" Height="450" Width="800">

    <Grid >
        <DataGrid x:Name="MainGrid" x:FieldModifier="public" MaxHeight="500" AutoGenerateColumns="True"></DataGrid>
    </Grid>
</Window>

Die Klasse für das Fenster (soll nie direkt verwendet werden):

//Interaktionslogik für GridWindow
    //nicht für den öffentlichen Gebrauch über das Cmdlet bestimmt
    public partial class GridWindow : Window
    {

        public GridWindow()
        {
            InitializeComponent();
        }
    }

Nun habe ich eine "controler" Klasse. Diese soll sich um die Steuerung des Fensters kümmern (mach das Sinn?).


 public class GridWindowControler
    {
        private GridWindow _gridWindow;

        public GridWindowControler()
        {
            this._gridWindow = new GridWindow();
        }
    
        public void ShowDialogWithData(List<Object> Data)
        {
            if (Data == null)
            {
                throw new ArgumentNullException();
            }

            if (Data.Count > 0)
            {
                _gridWindow.MainGrid.ItemsSource = Data;
                _gridWindow.ShowDialog();
            }
        }
    }
}

Puh.. mein Cmdlet sieht in etwas wie folgt aus:

  [Cmdlet(VerbsCommon.Open,"GridWindow")]
    public class GridWindowCmdlet : Cmdlet
    {
        [Parameter]
        public List<Object> Data { get; set; }

        protected override void ProcessRecord()
        {
            GridWindowControler GridWindowControler = new My.Extension.UI.GridWindowControler();
            GridWindowControler.ShowDialogWithData(Data);
        }
    }

Grundsätzlich funktioniert das Ganze. Rufe ich mein cmdlet z.B. mit folgendem Code auf:


$data = Get-Process
Open-GridWindow -Data $data

Nun zum eigentlichen Problem:
Erstelle ich mir eine komplett eigene Datenquelle in powerShell (Array aus Hashtables) werden mir nicht die eigentlichen Properties sondern die RawView in meinem Grid angezeigt.

Also Code:


$data = @()
$datarow = @{"Name"="Peter";"Nachname" = "Lustig"}
$data += $datarow
$datarow = @{"Name"="Walter";"Nachname" = "White"}
$data += $datarow
$datarow = @{"Name"="Tom";"Nachname" = "Waits"}
$data += $datarow

Open-GridWindow -Data $data

Die Ausgabe sieht dann wie das Bild im Anhang aus.

Ich hoffe ihr könnt mir folgen.
Die Fragen die ich habe:
Ist das kompletter Blödsinn was ich da mache?
Und warum zeigt mein Grid mir nicht die Properties Name und Nachname an?
Ist es richtig hier List<Object> zu verwenden? Am Ende möchte ich dort alles mögliche reinstecken können. Da bin ich mir echt absolut unsicher was ich dort verwenden sollte.

Vielen Dank für eure Hilfe.

4.931 Beiträge seit 2008
vor 4 Jahren

Versuche mal einen eigenen Typ in PowerShell zu deklarieren und zu verwenden, wie in Powershell. Declare generic list with class defined using 'Add-Type'.

PS: Nimm besser IList oder IEnumerable als allgemeinen Datentyp für deine Methode (und das DataGrid).

849 Beiträge seit 2006
vor 4 Jahren

Wenn Du deinen Code über opengridwindow mit $data = [pscustomobject]$data ergänst sollte es eigentlich auch klappen.

Du solltest aber tatsächlich ein Object definieren. Am besten in deiner dll.

edit -> sorry musst natürlich für jede Zeile tun: $datarow = [pscustomobject] @{"Name"="Peter";"Nachname" = "Lustig"}

M
MD_Coding Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren

Vielen Dank das ihr euch die Zeit genommen habt meinen Beitrag zu lesen.

Jedes Hashtabe als PsCustomObject zu kennzeichnen funktioniert tatsächlich.
In der Praxis wird in meinem Grid wahrscheinlich etwas anderes ausgegeben. Ein Beispiel wäre das Ergebnis einer SQL Abfrage die über powerShell ausgeführt wurde.
Da möchte ich ungern im powerShell Script jedes Objekt zu einem PsObject machen.

Wenn ich einen eigenen Typen in meiner DLL dafür bereitstellen würde, dann müsste ich doch auch die Eigenschaften schon vorgeben, oder? Gerade das ist ja der Anteil den ich nicht vorgeben will 😉.

Das Standard Cmdlet kommt mit meiner $data Variable auch ohne die Kennzeichnung als PsCustomObject hin. Wie löst man sowas?