WPF TreeView 绑定到层次结构数据库
2009-04-17 19:43
585 查看
WPF TreeView 绑定到层次结构数据库
首先在Sql Server中建立下面的层次数据库
instance数据库,包含两个父子表
实例表i1
子实例表i2
注意这里要建立两个表的外键关系
使用Visual Studio 2008 建立一个WFP工程,命名为i12
使用Data—>Add New DataSource下的建立一个新的连接,选择Microsoft SqlServer
填写好数据库的连接信息并测试连接
选择数据表
选择完成,这时,Visual Studio 会自动生成几千行的代码。instanceDataSet.Designer.cs中。
由于这些自动生成的代码是为.net2.0的windows Form 所量身定做的。当时还没有考虑的WPF的情况。WPF中要求的对象是要由无参数构造函数完成所有构造的。而instanceDataSet类是一个DataSet类的子类,虽然它含有无参数的构造函数,但是,必须通过相应的强类型表适配器进行填充才能完成构造,因此如果直接在XAML中构造一个instanceDataSet对象由于数据集是空的,所以Treeview中什么都不会有。
解决的方法是使用ObjectDataProvider对象,ObjectDataProvider对象可以以方法或属性的方式提供一个对象,这样我们可以构造一个instanceDataSetProvider类,使它的某个方法CreateInst返回一个填充好的instanceDataSet,再将它作为Treeview的DataContent。
其代码如下:
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的另一个好处就是可以在设计时就看到绑定的效果。如下图所示:
首先在Sql Server中建立下面的层次数据库
instance数据库,包含两个父子表
实例表i1
字段 | 数据类型 | 描述 |
i1_id | int | 实例id(PK) |
i1_name | varchar(50) | 实例名称 |
字段 | 数据类型 | 描述 |
i2_id | int | 子实例id(PK) |
i1_id | int | 所属实例id(FK) |
i2_name | varchar(50) | 子实例名称 |
使用Visual Studio 2008 建立一个WFP工程,命名为i12
使用Data—>Add New DataSource下的建立一个新的连接,选择Microsoft SqlServer
填写好数据库的连接信息并测试连接
选择数据表
选择完成,这时,Visual Studio 会自动生成几千行的代码。instanceDataSet.Designer.cs中。
由于这些自动生成的代码是为.net2.0的windows Form 所量身定做的。当时还没有考虑的WPF的情况。WPF中要求的对象是要由无参数构造函数完成所有构造的。而instanceDataSet类是一个DataSet类的子类,虽然它含有无参数的构造函数,但是,必须通过相应的强类型表适配器进行填充才能完成构造,因此如果直接在XAML中构造一个instanceDataSet对象由于数据集是空的,所以Treeview中什么都不会有。
解决的方法是使用ObjectDataProvider对象,ObjectDataProvider对象可以以方法或属性的方式提供一个对象,这样我们可以构造一个instanceDataSetProvider类,使它的某个方法CreateInst返回一个填充好的instanceDataSet,再将它作为Treeview的DataContent。
其代码如下:
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的另一个好处就是可以在设计时就看到绑定的效果。如下图所示:
相关文章推荐
- WPF TreeView 绑定到层次结构数据库
- 如何实现具有层次结构的 TreeView <四> (WPF/TreeView/Style/Template)
- 解析WPF绑定层次结构数据的应用详解
- DX控件中TreeView绑定层次数据库数据
- WPF—TreeView无限极绑定集合形成树结构
- DX控件中TreeView绑定层次数据库数据
- WPF—TreeView无限极绑定集合形成树结构
- 如何让包含层次结构的datatable 直接绑定到treeview
- [No0000D1]WPF—TreeView无限极绑定集合形成树结构
- 如何实现具有层次结构的 TreeView <四> (WPF/TreeView/Style/Template)
- WPF的TreeView绑定数据库后的点击问题
- 解析WPF绑定层次结构数据的应用详解
- 如何实现具有层次结构的 TreeView <一> (WPF/TreeView/Style/Template)
- 使用WPF绑定层次结构数据
- 如何实现具有层次结构的 TreeView <二> (WPF/TreeView/Style/Template)
- WPF中Treeview绑定数据库数据
- 如何实现具有层次结构的 TreeView <三> (WPF/TreeView/Style/Template)
- WPF ComboBox下拉绑定Treeview 功能的实现
- 用于层次结构数据库批量导入(Insert)的存储过程
- 数据库绑定TreeView,使用递归(zz)