gpt4 book ai didi

wpf - 如何使gridview成为wpf应用程序中treeview的子元素

转载 作者:行者123 更新时间:2023-12-01 08:20:24 26 4
gpt4 key购买 nike

我正在尝试将数据网格(或 GridView )填充为数据库中 TreeView 的子元素。我能够从树中的数据库中获取数据,但是,它似乎不适用于数据网格。这是我的 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>

我的代码隐藏是这样的:
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;
我的类文件有这个作为它的一部分:
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;
}
请告诉我如何实现它。我是新手,所以请原谅我的愚蠢错误,并请尝试用简单的术语来解释。谢谢你。
这是我真正需要做的

最佳答案

好消息是你在这里做的工作比你需要做的多得多,这可能就是你遇到麻烦的原因。

坏消息是,您应该真正了解更多关于 WPF 的知识,以正确理解这一点,并提出一种简洁明了的好方法。我会尽力为您指明正确的方向。

首先,您应该了解 ItemsControl。它是一个非常强大的类,并且是您将在 WPF 应用程序中使用的许多日常控件的基类。您应该了解将任何集合(IEnumerable、IList、IBindingList 等)绑定(bind)到 ItemsControl 的 ItemsSource 属性将如何导致创建子项。

然后,您应该了解(如果您还没有)如何通过 DataTemplates 将数据类型转换为 UI 元素。这是一个简单但强大的概念。

然后,您应该尝试对上述内容进行小扩展,即 HeaderedItemsControl 和 HierarchicalDataTemplate。这将为您提供以您想要的方式使用 TreeView 所需的所有工具。

您在任何时候都不需要在 C# 代码中创建任何 TreeViewItems。如果您可以获得底层数据对象以反射(reflect)您想要显示的层次结构(无论每个节点是简单的文本标签还是数据网格),那么您可以为所有级别创建分层数据模板并让 WPF 负责绑定(bind)所有内容并为您创建 TreeViewItems。

编辑

我对您编辑的问题有一些疑问:

  • Root 和有什么区别和 Nodes ?
  • 你有一个类层次结构来模拟节点之间的关系吗?如果是这样,就使用它而不是将对象复制到 Root 的实例中。和 Nodes .我给你一个虚构的例子。

  • 假设您有 Customer放置 Order的人s,每个订单都有 Item s。
    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; }
    }

    上述类型表示层次结构。如果你有这样的结构,那么你可以直接将它绑定(bind)到 UI。您无需创建任何 RootNode对象。这是 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>

    在代码隐藏中,你会做这样的事情:
     _treeView.DataContext = customers; // eg. IEnumerable<Customer>

    关于wpf - 如何使gridview成为wpf应用程序中treeview的子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1385372/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com