Comment faire gridview un élément enfant d'un treeview en application wpf
Je suis en train de remplir un datagrid (ou gridview) comme un enfant elment d'un treeview à partir de la base de données. Je suis en mesure d'obtenir des données à partir de la DB dans l'arbre, cependant, il ne semble pas fonctionner pour le contrôle datagrid. Voici mon code xaml:
<Window x:Class="AttemptUsingHirarchichalData.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:data="clr-namespace:AttemptUsingHirarchichalData"
xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type data:Root}"
ItemsSource="{Binding Path=RootList}">
<TextBlock Text="{Binding RootNode}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type data:Nodes}"
ItemsSource="{Binding Path=ChildList}">
<TextBlock Text="{Binding ChildNode}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView Name="TreeView1">
<TreeViewItem ItemsSource="{Binding Path=RootList}"
Header="{Binding RootNode}"/>
<TreeViewItem ItemsSource="{Binding Path=dt_Age}"
Header="{Binding dt_Age}"/>
</TreeView>
</Grid>
Mon code est quelque chose comme ceci:
InitializeComponent();
Root obj_Root = new Root();
obj_Root.RootNode = "RootNode";
obj_Root.RootList = new List<Nodes>();
Class1 obj_Class1 = new Class1();
DataTable dt_Age = obj_Class1.GetAgeInComboBox();
for (int i = 0; i < dt_Age.Rows.Count; i++)
{
Nodes obj_AgeNode = new Nodes();
obj_AgeNode.ChildNode = dt_Age.Rows[i][0].ToString();
obj_Root.RootList.Add(obj_AgeNode);
Class1 obj_class = new Class1();
DataTable dt_name = new DataTable();
dt_name = obj_class.GetName(Convert.ToInt32(dt_Age.Rows[i][0]));
obj_AgeNode.ChildList = new List<Nodes>();
//gridv
for (int j = 0; j < dt_name.Rows.Count; j++)
{
Nodes obj_NameNode = new Nodes();
obj_NameNode.ChildNode = dt_name.Rows[j][0].ToString();
obj_AgeNode.ChildList.Add(obj_NameNode);
}
}
TreeView1.DataContext = obj_Root;
Mon fichier de Classe a de cela comme d'une partie de celui-ci:
public class Nodes
{
public string ChildNode { get; set; }
public List<Nodes> ChildList { get; set; }
}
public class Root
{
public string RootNode { get; set; }
public List<Nodes> RootList { get; set; }
}
public DataTable GetAgeInComboBox()
{
SqlDataAdapter da_Age = new SqlDataAdapter("select distinct Age from myfrstattemt", conn1);
DataTable dt_Age = new DataTable();
da_Age.Fill(dt_Age);
return dt_Age;
}
S'il vous plaît dites-moi comment faire pour la mettre en œuvre. Je suis nouveau à cela, s'il vous plaît excuser mes erreurs stupides, et s'il vous plaît essayer de l'expliquer en termes simples. Je vous remercie.
C'est ce que j'ai réellement besoin de faire
http://i31.tinypic.com/21q44p.png
OriginalL'auteur Gagan | 2009-09-06
Vous devez vous connecter pour publier un commentaire.
La bonne nouvelle, c'est que vous êtes en train de faire beaucoup plus de travail ici que vous en avez besoin, ce qui est probablement la raison pour laquelle vous avez de la difficulté.
La mauvaise nouvelle est que vous devriez vraiment étudier un peu plus à propos de WPF pour bien analyser cette et de venir avec une bonne approche c'est propre et concis. Je vais essayer et de vous diriger dans la bonne direction.
Tout d'abord, vous devez obtenir votre tête autour de ItemsControl. C'est vraiment un très puissant de la classe et de la classe de base de beaucoup de au quotidien contrôles que vous pourriez utiliser dans une application WPF. Vous devez comprendre comment la liaison de toute collecte, de toute (IEnumerable, IList, IBindingList etc) à la propriété ItemsSource de ItemsControl sera la cause de l'enfant les éléments à créer.
Vous devez alors comprendre (si vous ne l'avez pas déjà) comment les types de données sont convertis en éléments de l'INTERFACE utilisateur via DataTemplates. C'est un concept simple, mais puissant.
Alors vous devriez expérimenter avec une petite extension à la ci-dessus, à savoir HeaderedItemsControl et HierarchicalDataTemplate. Cela vous donnera tous les outils dont vous avez besoin pour utiliser le TreeView dans la façon dont vous voulez.
À aucun moment, auriez-vous besoin pour créer toute TreeViewItems dans le code C#. Si vous pouvez obtenir les données sous-jacentes des objets afin de refléter la hiérarchie que vous souhaitez afficher (indépendamment du fait que chaque nœud est une simple étiquette de texte ou une grille de données), vous pouvez alors créer hiérarchique des modèles de données pour tous les niveaux et ont WPF prendre soin de la liaison de tout et de la création de la TreeViewItems pour vous.
MODIFIER
J'ai quelques questions pour votre édité question:
Root
etNodes
?Root
etNodes
. Je vais vous donner un exemple.Supposons que vous avez
Customer
s qui placeOrder
s, et chaque ordre aItem
s.Les types ci-dessus représentent une hiérarchie. Si vous avez une structure de ce genre, alors vous pouvez le lier directement à l'INTERFACE utilisateur. Vous n'avez pas besoin d'en créer
Root
ouNode
objets. C'est le WPF 🙂(Notez que si vous n'avez pas au-dessus de la hiérarchie de classe, vous pourriez en créer un spécialement pour l'utilisation dans l'INTERFACE utilisateur. Lire plus sur le modèle MVVM si vous êtes intéressé.)
Dans votre XAML, vous permettrait de définir l'Arborescence:
Et dans le code-behind, vous feriez quelque chose comme ceci:
Salut Gagan. On dirait que vous avez fait de bons progrès. C'est assez tard ici, donc je vais jeter un oeil à cela le matin.
Hey Drew, votre commentaire me donne de la confiance et de l'espoir! Je suis vraiment compter sur vous. Aussi, je voulais vous dire, que j'ai été faire un peu de recherche, et de constater qu'il existe une classe appelée grille de données dans l'espace de noms Microsoft.De Windows.Les contrôles . Donc, ce que j'ai fait était d'en faire un objet de cette classe(DataGrid obj_dgv=nouvelle grille de données), et qui la lient avec une datatable(obj_dgv.ItemsSource=dt.DefaultView). Et puis faire de cet objet un enfant nœud de l'arbre(obj_tree.RootList.Ajouter(obj_dgv)). Mais ce retured une erreur....donc je suis de nouveau coincé avec rien. S'il vous plaît aider!!!!
Hey Drew, merci à vous tous et toutes pour cette excellente explication. J'ai essayé ce que vous m'avez dit, et il fonctionne comme il le devrait. Cependant, il était toujours très complexe pour moi (je suis très nouveau à tout cela, j'espère que vous savez). Donc, je jouais avec le peu que je sais, et quelque chose qui m'a frappé. J'ai juste fait: DataGrid dgobj=new DataGrid(); dgobj=DataTableObj.DefaultView; treeobj.Éléments.Ajouter(dgobj); et Bam! J'ai reçu la grille de données en tant qu'enfant de l'arbre!!!! 🙂 🙂
OriginalL'auteur Drew Noakes
Pourrait être utile d'avoir un coup d'oeil à ce post par Marlon Grech.
OriginalL'auteur serialhobbyist