zoukankan      html  css  js  c++  java
  • WPF TreeView 绑定到层次结构数据库

    WPF TreeView 绑定到层次结构数据库

    首先在Sql Server中建立下面的层次数据库

    instance数据库,包含两个父子表

    实例表i1

    字段

    数据类型

    描述

    i1_id

    int

    实例idPK

    i1_name

    varchar(50)

    实例名称

     

    子实例表i2

    字段

    数据类型

    描述

    i2_id

    int

    子实例idPK

    i1_id

    int

    所属实例idFK

    i2_name

    varchar(50)

    子实例名称

    注意这里要建立两个表的外键关系

    使用Visual Studio 2008 建立一个WFP工程,命名为i12

    使用Data—>Add New DataSource下的建立一个新的连接,选择Microsoft SqlServer 

    填写好数据库的连接信息并测试连接

     

    选择数据表

     

     

    选择完成,这时,Visual Studio 会自动生成几千行的代码。instanceDataSet.Designer.cs中。

    由于这些自动生成的代码是为.net2.0windows Form 所量身定做的。当时还没有考虑的WPF的情况。WPF中要求的对象是要由无参数构造函数完成所有构造的。而instanceDataSet类是一个DataSet类的子类,虽然它含有无参数的构造函数,但是,必须通过相应的强类型表适配器进行填充才能完成构造,因此如果直接在XAML中构造一个instanceDataSet对象由于数据集是空的,所以Treeview中什么都不会有。

    解决的方法是使用ObjectDataProvider对象,ObjectDataProvider对象可以以方法或属性的方式提供一个对象,这样我们可以构造一个instanceDataSetProvider类,使它的某个方法CreateInst返回一个填充好的instanceDataSet,再将它作为TreeviewDataContent

    其代码如下:

    namespace i12

    {

        public class instanceDataSetProvider

        {

            /// <summary>

            /// 初始化数据集

            /// </summary>

            instanceDataSet inst=new instanceDataSet();

            /// <summary>

            /// 初始化表适配器

            /// </summary>

            instanceDataSetTableAdapters.i1TableAdapter i1TA = new i12.instanceDataSetTableAdapters.i1TableAdapter();

            instanceDataSetTableAdapters.i2TableAdapter i2TA = new i12.instanceDataSetTableAdapters.i2TableAdapter();

     

            public instanceDataSet CreateInst()

            {

                ///使用表适配器填充数据集

                i1TA.Fill(inst.i1);

                i2TA.Fill(inst.i2);

                ///返回填充后的数据集

                return inst;

            }

        }

    }

    对应的XAML文件如下

    <Window x:Class="i12.Window1"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:local="clr-namespace:i12"

        Title="Window1" Height="300" Width="300">

        <Window.Resources>

            <ObjectDataProvider x:Key="inst1" ObjectType="{x:Type local:instanceDataSetProvider}" MethodName="CreateInst" />

            <DataTemplate x:Key="tmp_i2" >

                <TextBlock Text="{Binding i2_name}" />

            </DataTemplate>

            <HierarchicalDataTemplate x:Key="tmp_i1" ItemsSource="{Binding FK_i2_i1}" ItemTemplate="{StaticResource tmp_i2}" >

                <TextBlock Text="{Binding i1_name}" />

            </HierarchicalDataTemplate>

        </Window.Resources>

        <Grid DataContext="{StaticResource inst1}">

            <TreeView Margin="28,31,130,31" Name="treeView1" ItemsSource="{Binding i1}" ItemTemplate="{StaticResource tmp_i1}"  />

        </Grid>

    </Window>

    而使用ObjectDataProvider的另一个好处就是可以在设计时就看到绑定的效果。如下图所示:

  • 相关阅读:
    jvm相关参数
    fdisk磁盘分区与挂载
    解决 Redis 只读不可写的问题
    虚拟机linux系统明明已经安装了ubuntu,但是每次重新进入就又是选择安装界面
    linux下更改MySQL数据库存储路径
    消除过期的引用对象
    java避免创建不必要的对象
    Oracle minus用法详解及应用实例
    Mapreduce详解Shuffle过程
    Leet Code 7.整数反转
  • 原文地址:https://www.cnblogs.com/oyjj/p/2133011.html
Copyright © 2011-2022 走看看