DataSet Daten anzeigen - XAML Code

  • WPF

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    DataSet Daten anzeigen - XAML Code

    Hallo Zusammen

    Wie im Title erwähnt, ich programmiere VB aber nutze WPF und nicht Windows Form. Weshalb mir das bereits
    mehrmals im Forum diskutierte DataBinding (Dim bs As New BindingSource) nichts nützt (BindingSource existiert nicht in WPF).

    Nun zu meiner eigentlichen Frage. Ich habe ein Dataset erstellt. Definition DataTable, MySqlDataAdapter etc. ist auch alles definiert inkl. MySqlConnection. Dies funktioniert alles; gibt keine Fehler aus. Nun meine Frage, wie sehe ich nun die Tabelle, die ich auslese? Bin zur Zeit etwas verwirrt, da es so viele Möglichkeiten gibt in Büchern und im Netz.

    Also ich erstelle in meiner WPF Applikation einen DataGrid (nicht DataGridView = WinForms) und nun muss ich diesen DataGrid ja mit der DataTable verbinden. Wie mache ich das? Das geschieht in XAML oder? Ich muss ja irgendwo dem DataGrid klar machen, dass er die Daten aus der DataTable xy oder dem DataSet xy anzeigen soll?

    VB.NET-Quellcode

    1. <Grid>
    2. <DataGrid AutoGenerateColumns="True" Height="268"
    3. HorizontalAlignment="Left" Margin="36,20,0,0" Name="DataGrid1"
    4. VerticalAlignment="Top" Width="434" ItemsSource="{Binding}"/>
    5. </Grid>


    So denke ich müsste es wohl starten aber da fehlt noch Code.
    Bin ich so auf dem richtigen weg? DataSet programmieren und im XAML dann das Binding?

    Nachtrag: Das habe ich soeben noch entdeckt
    In WPF, you cannot bind directly to a DataTable, but instead, must bind to a DataView


    Kann mir jemand weiterhelfen?
    Vielen herzlichen Dank

    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Die Fehlermeldung sagt schon alles.

    Schau mal hier: bletra.wordpress.com/2011/07/05/wpf-dataset-und-datagrid/

    Du musst DataView verwenden.
    Dazu musst du aus dem DataSet deine DataTable holen.
    Und von der bekommst du damit deine DataView. Daran bindest du dann.

    Die tables des Datasets findest du hier: msdn.microsoft.com/de-de/libra….data.dataset.tables.aspx


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    hmm unglaublich es funktioniert...

    Allderings war das Beispiel wieder für WindowsForm und nicht WPF.

    Falls das jemandem weiter hilft:
    WindowsForms:

    VB.NET-Quellcode

    1. DataGrid1.DataSource = table
    2. ....
    3. Dim gridTable As DataTable = _
    4. CType(dataGrid1.DataSource, DataTable)....


    WPF:

    VB.NET-Quellcode

    1. DataGrid1.DataContext = table
    2. ....
    3. Dim gridTable As DataTable = _
    4. CType(dataGrid1.DataContext, DataTable)....


    Aber so wird nun tatäslich etwas angezeigt im DataGrid (nicht zu vergessen unter XAML):

    VB.NET-Quellcode

    1. <DataGrid......ItemsSource="{Binding}.....


    Ich habe noch eine andere Frage. Jetzt geht es dann darum, Änderungen vorzunehmen und wieder in DB zu speichern. Aber vorerst, kann ich irgendwo überprüfen, ob das ganze wirklich in ein DataSet geladen wird? Da ich es ja manuell programmiert habe und nicht mit dem Designer erstellt habe, habe ich auch keine DataSet Datei (xsd) im Projekt. Wo sehe ich ob die Daten wirklich in das DataSet geladen werden???
    nein MVVM-Pattern sagt mir gar nichts.... Habe kurz das von Josh Smith durchgesehen. Klingt vernünftig nur scheue ich mich davor, wieder etwas neues noch zu beachten/implementieren.

    Es gibt so viele Möglichkeiten und Begriffe und schlussendlich führen verschiedene Wege nach Rom...


    Aber danke für die Hinweise...
    Arbeite mich jetzt Stück für Stück weiter... wie erwähnt, bis Änderungen im DataSet möglich sind, wieder in die DB gespeichert werden können und schlussendlich auch mit "Relations" Änderungen etc.
    Ich sags mal so: Gerade bei solchen Dingen ist MVVM eigentlich ein muss.
    Es erleichert alles um ein rießen Stück und ermöglicht einen wesentlich besseren Code.

    Es geht dabei im Prinzip einfach nur darum nicht das Codebehind sondern ViewModels zu benutzen. Diese ViewModels werden als DataContext gesetzt und via Commands,... verwendet.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    a) ist das in 100 stunden kein super buch über wpf. Ich hab während der Arbeit einmal nen ca. 1200 Seiten buch so halbwegs durchgelesen und dann noch 2 Bücher (kleinere) für spezielle themen gehabt. Da waren wenn überhaupt immer nur ca. 10-20 Zeilen über MVVM.
    b) glaubs einfach. Das wird hier sehr sehr stark eingesetzt und bevorzugt. Lies dir mal durch und du wirst es lieben. Codebehinds sind fürn arsch.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    hab mal noch ne Frage zu MVVM. Muss ich da ein Toolkit herunterladen? Es sollte auch selber programmierbar sein oder?

    Ich habe immmer Probleme, INotifyPropertyChanged zu verwenden... das müsste doch in System.ComponentModel enthalten sein,
    dass ich am Anfang via "Imports" lade...?
    Jo, man braucht 3 zusätzliche Dinge, die's Framework bis einschließlich 2010 nicht onBoard mitliefert (2012 weißichnich):
    1. eine INotifyPropertyChanged implementierende Basisklasse, dass man das nicht jedesmal neu implementieren muß
    2. ein RelayCommand, was das Command im Viewmodel verfügbar macht
    3. Eine Testmethode, mit der man checken kann, ob man sich im Designmodus oder inne Laufzeit befindet
      Weil dann kann man für die DesignZeit TestDaten bereitstellen, die bereits im Designer verfügbar sind, die aber nicht einen vollstandiigen Ladevorgang auslösen, wie er zur Laufzeit ausgeführt wird.
    Einige Zeit habich das GalaSoft-Toolkit verwendet, schlißlich habichmir selbst die 3 Sachen geschrieben - ist zB in Binding-Picking im Xaml-Editor mit drin (und noch viiel annerer Kram)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Jo, man braucht 3 Dinge, die Wpf bis 2010 nicht onBoard liefert
    also das heisst VS 2010 hat diese bereits integriert? Ich bastle mit VS 2010 und in einigen Tutorials wird auch erwähnt, dass wir uns selber das MVVM Pattern erstellen.
    Oder empfiehlst du ein Toolkit zu nutzen?

    Falls VS 2010 die 3 Dinge bereits implementiert hat (von board aus). Warum kann ich dann eine INotifyPropertyChanged Klasse nicht implementieren?

    Danke für deine Hilfestellung...
    Siehe Edit:

    ErfinderDesRades schrieb:

    Jo, man braucht 3 zusätzliche Dinge, die's Framework bis einschließlich 2010 nicht onBoard mitliefert (2012 weißichnich)


    beatles schrieb:

    Warum kann ich dann eine INotifyPropertyChanged Klasse nicht implementieren?
    Weil INotifyPropertyChanged ein Interface ist.
    Jo, Wpf ist viel schwerer als WinForms: Da muß man von Anfang an wissen, was ein Interface ist - da werden die Try-and-Error-Rumklickser ziemlich radikal ausgesiebt.

    Für so Grundlagen empfehle ich normal immer dieses Buch lesen (hingegen das Galileio-Openbook ist Mist). Aber vlt. ist msdn.microsoft.com/de-de/library/sh9ywfdk%28v=vs.100%29.aspx auch nicht verkehrt, weil das Buch fokussiert ziemlich auf WinForms, und auf MSDN kann man halt so Begriffe wie Interface ähnlich fundiert recherchieren.

    und in einigen Tutorials wird auch erwähnt, dass wir uns selber das MVVM Pattern erstellen.
    Oder empfiehlst du ein Toolkit zu nutzen?
    Einen Pattern kann man eiglich auch nicht erstellen - man programmiert etwas, was den Pattern befolgt.
    Also dir würdich nicht empfehlen, die MVVM-Infrastruktur selbst zu coden, sondern lade dir ein Toolkit, oder nimm die Helpers-Dll, die bei meine Wpf-Sachen immer dabei sind (zB hier) - kann man auch als Toolkit auffassen.
    Toolkits finde ich übertrieben. Ich programmiere schon länger und auch größere Sachen mit MVVM und hab nie nen Toolkit gebraucht. Hab zwei verschiedene Commands welche beide schnell und einfach implementiert wurden. Und das wars auch schon. Viel mehr brauchste nicht. Dann musste halt noch wissen wie MVVM funktioniert und schon kanns losgehen. Ich würde mir immer eine ViewModel-Basisklasse machen wo z.B. immer eine Property Main hat welche auf die Instanz des MainViewModel verweist usw. Da kannste recht flexibel sein. Am besten du findest für dich selbst heraus was du wirklich brauchst.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Google erstes Ergebnis: msdn.microsoft.com/en-us/magazine/dd419663.aspx
    Spoiler anzeigen

    Quellcode

    1. public class RelayCommand : ICommand{
    2. #region Fields
    3. readonly Action<object> _execute;
    4. readonly Predicate<object> _canExecute;
    5. #endregion // Fields
    6. #region Constructors
    7. public RelayCommand(Action<object> execute)
    8. : this(execute, null)
    9. {
    10. }
    11. public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    12. {
    13. if (execute == null)
    14. throw new ArgumentNullException("execute");
    15. _execute = execute;
    16. _canExecute = canExecute;
    17. }
    18. #endregion // Constructors
    19. #region ICommand Members
    20. [DebuggerStepThrough]
    21. public bool CanExecute(object parameter)
    22. {
    23. return _canExecute == null ? true : _canExecute(parameter);
    24. }
    25. public event EventHandler CanExecuteChanged
    26. {
    27. add { CommandManager.RequerySuggested += value; }
    28. remove { CommandManager.RequerySuggested -= value; }
    29. }
    30. public void Execute(object parameter)
    31. {
    32. _execute(parameter);
    33. }
    34. #endregion // ICommand Members }


    Btw. es gibt bereits Frameworkerweiterungen mit einem RelayCommand:
    msdn.microsoft.com/de-de/libra…on.mvvm.relaycommand.aspx


    Bin aber weiterhin für einfach selbst ne Klasse zu machen. Der Eventhandler CanExecuteChanged ist optional sollte jedoch drinnen sein. Dieser ist dafür zuständig, dass sich z.b. ein Button automatisch ein und ausschaltet je nach CanExecute = true oder false.
    Unten gibt es sogar noch ein Beispiel was die Verwendung angeht:
    Spoiler anzeigen

    Quellcode

    1. RelayCommand _saveCommand;public ICommand SaveCommand
    2. {
    3. get
    4. {
    5. if (_saveCommand == null)
    6. {
    7. _saveCommand = new RelayCommand(param => this.Save(),
    8. param => this.CanSave );
    9. }
    10. return _saveCommand;
    11. } }

    Hier würde ich aber das == null weglassen und das schneller machen und zwar mit dem weniger bekannten ?? operator:

    Quellcode

    1. return _saveCommand ?? (_saveCommand = new RelayCommand(p => Save(), p => CanSave()))


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.