myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und Silverlight » DataGrid zeigt mir die RawView an (c#, WPF und powerShell)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
MD_Coding
myCSharp.de-Mitglied

Dabei seit: 16.05.2019
Beiträge: 2


MD_Coding ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...)

XML-Code:
<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):

C#-Code:
//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?).

C#-Code:
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:

C#-Code:
  [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:

Code:
1:
2:
$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:

Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
$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.

MD_Coding hat dieses Bild (verkleinerte Version) angehängt:
Grid.png
Volle Bildgröße

16.05.2019 13:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.334
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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).
16.05.2019 14:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
unconnected unconnected ist männlich
myCSharp.de-Mitglied

avatar-3200.jpg


Dabei seit: 13.08.2006
Beiträge: 849
Entwicklungsumgebung: VS2017 Enterprise,VS Code
Herkunft: Oerlinghausen/NRW


unconnected ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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"}

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von unconnected am 16.05.2019 14:37.

16.05.2019 14:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MD_Coding
myCSharp.de-Mitglied

Dabei seit: 16.05.2019
Beiträge: 2

Themenstarter Thema begonnen von MD_Coding

MD_Coding ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
16.05.2019 14:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Monate.
Der letzte Beitrag ist älter als 4 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 22.09.2019 02:16