一,项目需求。
在一些项目中,需要用到树形控件。一些项目中有商品的分类选择,有商品是属于电子产品,有些商品则属于服装,这时候就可以用到树形控件(Tree View),如下图:
二,开始构建Tree View
1. xaml页面中声明一个Tree View:
2. xaml.cs页面中:
?(1)构建实体
/// <summary>
/// 1、构建实体
/// </summary>
public class ProjectModule
{
public int ID { get; set; }
public string menuName { get; set; }
public string menucode { get; set; }
public string menuicon { get; set; }
public int ParentId { get; set; }
public List<ProjectModule> Nodes { get; set; }
public ProjectModule()
{
//创建当前节点
this.Nodes = new List<ProjectModule>();
//当前父级ID为零
this.ParentId = 0;//主节点的父id默认为0
}
}
(2)绑定数据:这里的数据通过DataTable获取数据库的数据,声明dt通过for循环绑定数据的每一条数据。
/// <summary>
/// 2、绑定数据
/// </summary>
/// <returns></returns>
public List<ProjectModule> GetProject()
{
//获取操作模块列表
DataTable dt = myClient.TreeViewClient().Tables[0];
List<ProjectModule> dplst = new List<ProjectModule>();
//循环差集生成菜单
for (int i = 0; i < dt.Rows.Count; i++)
{
ProjectModule addProjectModule = new ProjectModule();
addProjectModule.ID = Convert.ToInt32(dt.Rows[i]["clientClassID"]);
addProjectModule.menuName = dt.Rows[i]["name"].ToString().Trim();
addProjectModule.menucode = dt.Rows[i]["code"].ToString().Trim();
addProjectModule.menuicon = dt.Rows[i]["icon"].ToString().Trim();
addProjectModule.ParentId = Convert.ToInt32(dt.Rows[i]["f_id"]);
if (Convert.ToInt32(dt.Rows[i]["f_id"]) == 0 && dt.Rows[i]["icon"] == null)
{
//一级
addProjectModule.menuicon = "/Images/png-1692.ico";
}
else
{
//二级菜单
addProjectModule.menuicon = "/Images/png-1674.ico";
}
//把实体添加到列表中
dplst.Add(addProjectModule);
}
return dplst;
}
?(3)递归生成树形数据:这一步操作决定了数据作为菜单时是几级菜单
/// <summary>
/// 3、递归生成树形数据
/// </summary>
/// <param name="modularID"></param>
/// <param name="Nodes"></param>
/// <returns></returns>
public List<ProjectModule> GetTrees(int ID, List<ProjectModule> Nodes)
{
//实例化一个主节点,并且进行linq条件查询,为tolist列表形式。
List<ProjectModule> MainNodes = Nodes.Where(x => x.ParentId == ID).ToList<ProjectModule>();
//实例化一个其他节点,并且进行linq条件查询,为tolist列表形式。
List<ProjectModule> OtherNodes = Nodes.Where(x => x.ParentId != ID).ToList<ProjectModule>();
foreach (ProjectModule pro in MainNodes)
{
//GetTrees递归赋值
pro.Nodes = GetTrees(pro.ID, OtherNodes);
}
//返回主节点,跳出递归
return MainNodes;
}
(4)最后把数据绑定到树形控件Tree View,因为要一打开页面就显示树形控件的数据,所以在页面加载时就要绑定数据。
/// <summary>
/// 页面加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
this.NavigationTree.ItemsSource = GetTrees(0, GetProject());
}
(5)在数据库中的查询语句:通过父ID(f_ID)来判断查询
--树形控件(数据生成)
IF(@type='UserControl_Loaded_TreeViewCommodity')
BEGIN
SELECT modularID,
RTRIM(modularName) AS name,
RTRIM(modularCode) AS code,
RTRIM(modularIcon) AS icon,
f_ID
FROM S_Modular
WHERE f_ID>0
UNION
SELECT modularID,
RTRIM(modularName) AS name,
RTRIM(modularCode) AS code,
RTRIM(modularIcon) AS icon,
f_ID
FROM S_Modular
WHERE modularID NOT IN(SELECT modularID
FROM S_Modular
WHERE f_ID>0)
END
?三,点击树形菜单筛选查询。功能:当就想看电子产品分类有多少商品时,通过点击电子产品的菜单栏筛选表格,只显示属于电子产品分类的产品。
?
通过事件MouseLeftButtonDown(鼠标左键按下事件)实现:?
/// <summary>
/// 鼠标左键按下事件(Image,TextBlock)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TextBlock_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
try
{
//获取当前TextBlock
TextBlock txtText = sender as TextBlock;
strText = txtText.Text;
if (strText != "客户分类")
{
int intclientClassID = (int)txtText.Tag;
DataTable dtCo = myClient.TVWDClient(intclientClassID).Tables[0];
//把获取到的数据绑定到表格
dgClient.ItemsSource = dtCo.DefaultView;
ConsumptionPager.ShowPages(dgClient, dtCo);
}
else
{
GetData();
}
}
catch (System.Exception)
{
return;
}
}
声明一个TextBlock,获取点击的菜单栏是不是“客户分类”来进行判断,因为客户分类是不用进行筛选查询的,若点击的不是“客户分类”,就把获取到商品分类ID(clientClassID)作为条件进行筛选查询。?
|