要把树形结构的数据直观的显示出来在WPF中Treeview是最合适的了,我在最近的项目开发中就用到了Treeview。但是Treeview的搜索并且高亮显示却纠结了半天,今天把我用的方法发出来和大家分享一下。
1.Treeview的绑定方法
首先把需要绑定的数据源组合成一个具有树形结构的list<'自定义类'>
我的自定义类是这样的
public class EnterpriseList
{
public List<EnterpriseList> enterpriselist { get; set; }
public EnterpriseList()
{
enterpriselist = new List<EnterpriseList>();
Parent_Id = -1;
}
public string Mon { get; set; }
public int rowcount { get; set; }
public int Enterpris_Id { get; set; }
public string Enterpris_No { get; set; }
public string Enterpris_Name { get; set; }
public string PYShort { get; set; }
public string Remark { get; set; }
public string Address { get; set; }
public int Trade_Id { get; set; }
public int PopeDom_Id { get; set; }
public int Parent_Id { get; set; }
}
然后通过递归给树添加叶子节点treeviewitem 注意:不要直接绑定itemsource
递归方法如下:
/// <summary>
/// 递归得到树
/// </summary>
/// <param name="list"></param>
/// <param name="name"></param>
/// <param name="obj"></param>
/// <returns></returns>
private TreeViewItem TreeIn(List<EnterpriseList> list,string name,object obj,int Id,bool IsFirst=true)
{
TreeViewItem trvw = new TreeViewItem();
trvw.Header = name;
trvw.DataContext = obj;
trvw.IsExpanded = true;
trvw.Name = "Name"+Id.ToString();
trvw.ToolTip = name;
List<EnterpriseList> enter ;
if (IsFirst)
enter = list[0].enterpriselist;
else
enter = list;
foreach (EnterpriseList lst in enter)
{
if (lst.enterpriselist != null)
trvw.Items.Add(TreeIn(lst.enterpriselist, lst.Enterpris_Name, lst,lst.Enterpris_Id,false));
}
return trvw;
}
最后会返回一个Treeviewitem,把其添加到已经定义好的Treeview中就能够以树形结构显示了
树的搜索是通过在treeview上面摆放一个textbox和一个button来实现的,操作方法类似于我们开发环境里面的ctrl+f模糊查询在页面设置当前选择项以及当前数据源并且获取下一个选择项来实现
过滤数据源的方法:
public List<EnterpriseList> GetFilterResoults(string Pattern, List<EnterpriseList> list)
{
return new List<EnterpriseList>(
list.
Where((name, match) => name.Enterpris_Name.ToLower().Contains(Pattern.ToLower())));
}
递归查找树的方法
public void TreeViewFind(string Name,ItemCollection Items) {
foreach (TreeViewItem tritem in Items) {
if (tritem.Header.ToString() == Name)
{
tritem.Focus();
tritem.IsSelected = true;
break;
}
TreeViewFind(Name,tritem.Items);
}
}
获取下一个选择项的方法
private bool GetCurrentSelected() {
if (CurrentSource.Count>0 &&(CurrentSelected == null || !CurrentSource.Contains(CurrentSelected)))
{
CurrentSelected = CurrentSource == null ? CurrentSelected : CurrentSource[0];
}
else if (CurrentSource==null||CurrentSource.Count == 0)
{
MessageBox.Show("未找到与搜索项匹配的相关内容", "搜索", MessageBoxButton.OK, MessageBoxImage.Information);
return false;
}
else {
if(CurrentSource.IndexOf(CurrentSelected) + 1>=CurrentSource.Count)
{
CurrentSelected = CurrentSource[0];
MessageBox.Show("查找达到了搜索的起始点","搜索",MessageBoxButton.OK,MessageBoxImage.Information);
}
else{
CurrentSelected =CurrentSource[CurrentSource.IndexOf(CurrentSelected) + 1];
}
}
return true;
}
窗体里面定义的数据源:
#region 数据源、选择项
List<EnterpriseList> AllSource;
List<EnterpriseList> CurrentSource;
EnterpriseList CurrentSelected;
string CurrentText;
#endregion