Gag*_*gan 3 wpf treeview datagrid
我试图从数据库填充数据网格(或gridview)作为树视图的子元素.我能够从树中的数据库中获取数据,但是,它似乎不适用于数据网格.这是我的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>
Run Code Online (Sandbox Code Playgroud)
我的代码隐藏是这样的:
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;
Run Code Online (Sandbox Code Playgroud)
我的类文件将此作为其中的一部分:
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;
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何实现它.我是新手,所以请原谅我的愚蠢错误,请尝试用简单的语言解释.谢谢.
这是我实际需要做的
Dre*_*kes 11
好消息是,你在这里做的工作比你需要的多得多,这可能就是你遇到麻烦的原因.
坏消息是你应该更多地研究一下WPF,以便正确地理解这一点并提出一个干净简洁的好方法.我会试着指出你正确的方向.
首先,你应该了解ItemsControl.它是一个非常强大的类,是WPF应用程序中使用的许多日常控件的基类.您应该了解如何将任何集合(IEnumerable,IList,IBindingList等)绑定到ItemsControl的ItemsSource属性将导致创建子项.
然后,您应该了解(如果您还没有)数据类型如何通过DataTemplates转换为UI元素.这是一个简单而强大的概念.
然后你应该尝试上面的一个小扩展,即HeaderedItemsControl和HierarchicalDataTemplate.这将为您提供以您希望的方式使用TreeView所需的所有工具.
在任何时候你都不需要用C#代码创建任何TreeViewItems.如果您可以获取底层数据对象以反映您想要显示的层次结构(无论每个节点是一个简单的文本标签还是数据网格),那么您可以为所有级别创建分层数据模板,并让WPF负责绑定所有级别并为您创建TreeViewItems.
编辑
我对您编辑的问题有一些疑问:
Root和之间有什么区别Nodes?Root和的实例中Nodes.我会给你一个例子.让我们假设你有Customers放置Orders,每个订单都有Items.
public class Customer
{
public string Name { get; set; }
public IEnumerable<Order> Orders { get; set; }
}
public class Order
{
public DateTime PurchaseDate { get; set; }
public IEnumerable<OrderItem> Items { get; set; }
}
public class OrderItem
{
public string ProductName { get; set; }
public int Quantity { get; set; }
public double UnitPrice { get; set; }
public double TotalPrice { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以上类型表示层次结构.如果您有这样的结构,那么您可以将它直接绑定到UI.你并不需要创建任何Root或Node对象.这是WPF方式:)
(请注意,如果您没有上述类层次结构,则可以设置专门用于在UI中使用.如果您感兴趣,请阅读有关MVVM模式的更多信息.)
在您的XAML中,您将TreeView定义为:
<TreeView x:Name="_treeView" ItemsSource="{Binding}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type data:Customer}"
ItemsSource="{Binding Path=Orders}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type data:Order}">
<StackPanel>
<TextBlock Text="{Binding PurchaseDate}"/>
<ListView ItemsSource="{Binding Items}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding ProductName}" />
<GridViewColumn DisplayMemberBinding="{Binding Quantity}" />
<GridViewColumn DisplayMemberBinding="{Binding UnitPrice}" />
<GridViewColumn DisplayMemberBinding="{Binding TotalPrice}" />
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
在代码隐藏中,你会做这样的事情:
_treeView.DataContext = customers; // eg. IEnumerable<Customer>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11839 次 |
| 最近记录: |