C# WPF TreeView aus Datenbank erstellen

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von shadow01.

    C# WPF TreeView aus Datenbank erstellen

    Hallo zusammen

    nach langer vb und c# Abstinenz versuche ich von Forms auf WPF umzusteigen und bin doch sehr begeistert. :D

    Ich möchte nun Notes automatisch aus einer SQL-Tabelle erstellen lassen. Die Tabelle heisst tb_contcat. Die Tabelle hat die Spalte ID und ContCat(Kontaktkategorien) mit den einträgen {Privat, Sport, Schule}
    ich habe es nun hingebrach das diese drei als Item vom Note Kontakte angezeigt wird.
    Eigentlich sollen aber die drei Contcat's als Note erstellt werden. In einem zweiten Schritt soll dann wenn z.B. das Note Sport angeklickt wurde von der Tabelle tb_Contacts mit einer WHERE Klausel abgefragt werden welcher Kontakt in der Spalte ID_ContCat mit dem selected Node übereinstimmt. Leider weiss ich nicht wie ich die ID vom Node erhalte.

    Zusammengefasst:
    Wie kann ich die Node auf der SQL-Tb tb_contcat erstellen lassen?
    Wie erhalte ich die SQL-ID des geklicken Node's?

    Mein XAML Code

    XML-Quellcode

    1. <Window x:Class="_07_WPF_CS_TreeView_DB.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:self="clr-namespace:_07_WPF_CS_TreeView_DB"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="200" Width="250">
    9. <Grid Margin="10">
    10. <TreeView Name="trvFamilies" SelectedValuePath="trv_ItemSelected" >
    11. <TreeView.Resources>
    12. <HierarchicalDataTemplate DataType="{x:Type self:Kontakte}" ItemsSource="{Binding Members}">
    13. <StackPanel Orientation="Horizontal">
    14. <Image Source="/Person-Male-Light-icon.png" Margin="0,0,5,0" />
    15. <TextBlock Text="{Binding Name}" />
    16. <TextBlock Text=" [" Foreground="Blue" />
    17. <TextBlock Text="{Binding Members.Count}" Foreground="Blue" />
    18. <TextBlock Text="]" Foreground="Blue" />
    19. </StackPanel>
    20. </HierarchicalDataTemplate>
    21. <DataTemplate DataType="{x:Type self:KontakteMember}">
    22. <StackPanel Orientation="Horizontal">
    23. <Image Source="/WpfTutorialSamples;component/Images/user.png" Margin="0,0,5,0" />
    24. <TextBlock Text="{Binding Name}" />
    25. <TextBlock Text=" (" Foreground="Green" />
    26. <TextBlock Text="{Binding Age}" Foreground="Green" />
    27. <TextBlock Text=" years)" Foreground="Green" />
    28. </StackPanel>
    29. </DataTemplate>
    30. </TreeView.Resources>
    31. </TreeView>
    32. </Grid>
    33. </Window>


    mein Code-Behind:

    C#-Quellcode

    1. using System.Collections.Generic;
    2. using System.Windows;
    3. using System.Collections.ObjectModel;
    4. using MySql.Data.MySqlClient;
    5. namespace _07_WPF_CS_TreeView_DB
    6. {
    7. /// <summary>
    8. /// Interaction logic for MainWindow.xaml
    9. /// </summary>
    10. public partial class MainWindow : Window
    11. {
    12. public MainWindow()
    13. {
    14. InitializeComponent();
    15. List<Kontakte> families = new List<Kontakte>();
    16. Kontakte family1 = new Kontakte() { Name="Kontakte" };
    17. //baum aus DB mittels Schleife erstellen
    18. using (MySqlConnection sqlConnection = new MySqlConnection("Data Source=localhost;Initial Catalog=db_verwatoo;UID=tester;pwd=test1234;SslMode=none;"))
    19. {
    20. MySqlCommand sqlCmd = new MySqlCommand("SELECT * FROM tb_contcat", sqlConnection);
    21. sqlConnection.Open();
    22. MySqlDataReader sqlReader = sqlCmd.ExecuteReader();
    23. while (sqlReader.Read())
    24. {
    25. family1.Members.Add(new KontakteMember() { Name = sqlReader["Kategorie"].ToString() });
    26. }
    27. sqlReader.Close();
    28. }
    29. families.Add(family1);
    30. trvFamilies.ItemsSource = families;
    31. }
    32. }
    33. public class Kontakte
    34. {
    35. public Kontakte()
    36. {
    37. this.Members = new ObservableCollection<KontakteMember>();
    38. }
    39. public string Name { get; set; }
    40. public ObservableCollection<KontakteMember> Members { get; set; }
    41. }
    42. public class KontakteMember
    43. {
    44. public string Name { get; set; }
    45. public int Age { get; set; }
    46. }
    47. }


    Ich danke euch für eure Hilfe und wünsche ein tolles Wochenende

    shadow01 schrieb:

    Wie kann ich die Node auf der SQL-Tb tb_contcat erstellen lassen?
    Auf der Sql-Tb (wenn ich recht verstehe, was das wohl sein soll) kannst du natürlich nur mit Sql-Commands was erstellen, vermutlich ein Insert-Command.

    shadow01 schrieb:


    Wie erhalte ich die SQL-ID des geklicken Node's?
    Du kannst im DataTemplate einen Button einbauen, dessen Command du an eine geeignete Viewmodel-Property bindest.
    Ist bei dir jetzt bischen verschwurbelt, weil du hast dein Viewmodel ins Codebehind verlegt.

    Ansonsten gibts einige Tutorials im Wpf-Tutorial-Bereich, auch zu Treeview, zu Commands und zum MVVM-Pattern ist was dabei.
    Und zur Anwendungs-Architektur, weil bei dir wie gesagt recht verschwurbelt.
    Hallo ErfinderDesRades

    Danke für deine Tipps, leider komme ich aber nicht weiter.
    Oww hab noch ein Fehler entdeck der zum Missverständniss führt: Wie kann ich die Node auf (soll aus) der SQL Tabelle erstellen lassen.

    Leider helfen mit auch die anderen Beistpiele nicht weiter.

    Gruss
    So nach einem weiteren Tag mit dem Problem konnte ich es nun Lösen.

    Hier der XAML Code

    XML-Quellcode

    1. <Window x:Class="_07_WPF_CS_TreeView_DB.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:self="clr-namespace:_07_WPF_CS_TreeView_DB"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="200" Width="250">
    9. <Grid Margin="10">
    10. <TreeView Name="trvFamilies" TreeView.SelectedItemChanged="trvFamilies_SelectedItemChanged">
    11. <TreeView.Resources>
    12. <HierarchicalDataTemplate DataType="{x:Type self:Kontakte}" ItemsSource="{Binding Members}">
    13. <StackPanel Orientation="Horizontal">
    14. <Image Source="/Person-Male-Light-icon.png" Margin="0,0,5,0" />
    15. <TextBlock Text="{Binding Name}" />
    16. <TextBlock Text=" [" Foreground="Blue" />
    17. <TextBlock Text="{Binding Members.Count}" Foreground="Blue" />
    18. <TextBlock Text="]" Foreground="Blue" />
    19. </StackPanel>
    20. </HierarchicalDataTemplate>
    21. <DataTemplate DataType="{x:Type self:KontakteMember}">
    22. <StackPanel Orientation="Horizontal">
    23. <Image Source="/WpfTutorialSamples;component/Images/user.png" Margin="0,0,5,0" />
    24. <TextBlock Text="{Binding Name}" />
    25. <TextBlock Text=" (" Foreground="Green" />
    26. <TextBlock Text="{Binding Age}" Foreground="Green" />
    27. <TextBlock Text=" years)" Foreground="Green" />
    28. </StackPanel>
    29. </DataTemplate>
    30. </TreeView.Resources>
    31. <TreeView.ItemContainerStyle>
    32. <Style TargetType="TreeViewItem">
    33. <Setter Property="IsExpanded" Value="true"/>
    34. <!--<Setter Property="IsSelected" Value="{Binding IsSelected}"/>-->
    35. </Style>
    36. </TreeView.ItemContainerStyle>
    37. </TreeView>
    38. </Grid>
    39. </Window>


    und der angepasste Code-Behinde:

    C#-Quellcode

    1. using System.Collections.Generic;
    2. using System.Windows;
    3. using System.Collections.ObjectModel;
    4. using MySql.Data.MySqlClient;
    5. using System.Windows.Controls;
    6. using System;
    7. namespace _07_WPF_CS_TreeView_DB
    8. {
    9. /// <summary>
    10. /// Interaction logic for MainWindow.xaml
    11. /// </summary>
    12. public partial class MainWindow : Window
    13. {
    14. public MainWindow()
    15. {
    16. InitializeComponent();
    17. List<Kontakte> families = new List<Kontakte>();
    18. Kontakte family1 = new Kontakte() { Name="Kontakte" };
    19. //baum aus DB mittels Schleife erstellen
    20. using (MySqlConnection sqlConnection = new MySqlConnection("Data Source=localhost;Initial Catalog=db_verwatoo;UID=adm;pwd=1234;SslMode=none;"))
    21. {
    22. MySqlCommand sqlCmd = new MySqlCommand("SELECT * FROM tb_contcat", sqlConnection);
    23. sqlConnection.Open();
    24. MySqlDataReader sqlReader = sqlCmd.ExecuteReader();
    25. while (sqlReader.Read())
    26. {
    27. family1.Members.Add(new KontakteMember() { Name = sqlReader["Kategorie"].ToString() });
    28. }
    29. sqlReader.Close();
    30. }
    31. families.Add(family1);
    32. trvFamilies.ItemsSource = families;
    33. }
    34. private void trvFamilies_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    35. {
    36. MessageBox.Show(((_07_WPF_CS_TreeView_DB.KontakteMember)((System.Windows.Controls.TreeView)sender).SelectedItem).Name);
    37. }
    38. }
    39. public class Kontakte
    40. {
    41. public Kontakte()
    42. {
    43. this.Members = new ObservableCollection<KontakteMember>();
    44. }
    45. public string Name { get; set; }
    46. public ObservableCollection<KontakteMember> Members { get; set; }
    47. }
    48. public class KontakteMember
    49. {
    50. public string Name { get; set; }
    51. public int Age { get; set; }
    52. }
    53. }


    um zu evaluieren was geklickt wurde ist im Code Behind folgendes wichtig:

    C#-Quellcode

    1. private void trvFamilies_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    2. {
    3. MessageBox.Show(((_07_WPF_CS_TreeView_DB.KontakteMember)((System.Windows.Controls.TreeView)sender).SelectedItem).Name);
    4. }


    Damit dies aber auch funktioniert muss im XAML der Eintrag TreeView.SelectedItemChanged ergänzt werden.

    XML-Quellcode

    1. <TreeView Name="trvFamilies" TreeView.SelectedItemChanged="trvFamilies_SelectedItemChanged">


    Danke für die Unterstützung!