Devexpress Treelist 的过滤行添加后,发现,只有父节点有这种信息,子节点才会显示。
可以毫不犹豫地说,这是一个bug.
但带来的影响还是很严重。
我用的版本是11.2
然后,到网上,找了一会。
果然许多老外也遇到这个问题。
其中,这几个链接:
http://www.devexpress.com/Support/Center/Question/Details/S139453
内容最多。
其中,有句:
TreeListOptionsFilter.FilterMode property to theFilterMode.Smart value
这个例子就是如此实现,http://www.devexpress.com/Support/Center/Question/Details/B212393
private void Form1_Load(object sender, EventArgs e) { treeList1.OptionsBehavior.EnableFiltering = true; treeList1.OptionsView.ShowAutoFilterRow = true; treeList1.OptionsFilter.FilterMode = FilterMode.Smart; CreateTreeList(); }
然而,同样是11.2,我所用的没有这个特性。
我看了13.2的,的确有这个特性:
所以,还是希望找到一个简单的办法,
http://www.devexpress.com/Support/Center/Example/Details/E3072
这个链接事实上是上面那个给出来的
原文如下:
private void Form1_Load(object sender, EventArgs e) { treeList1.DataSource = FillDataTable(); treeList1.ExpandAll(); } private void applyFilterButton_Click(object sender, EventArgs e) { FilterNodeOperation operation = new FilterNodeOperation(textEdit1.EditValue != null ? textEdit1.EditValue.ToString() : ""); treeList1.NodesIterator.DoOperation(operation); } class FilterNodeOperation : TreeListOperation { string pattern; public FilterNodeOperation(string _pattern) { pattern = _pattern; } public override void Execute(TreeListNode node) { if (NodeContainsPattern(node, pattern)) { node.Visible = true; if (node.ParentNode != null) node.ParentNode.Visible = true; } else node.Visible = false; } bool NodeContainsPattern(TreeListNode node, string pattern) { foreach (TreeListColumn col in node.TreeList.Columns) if (node.GetValue(col).ToString().Contains(pattern)) return true; return false; } }
我改了改:
private void treeList1_ColumnFilterChanged(object sender, EventArgs e) { //DevExpress.XtraTreeList.Nodes.TreeListNode fNode = treeList1.FocusedNode; //DevExpress.XtraTreeList.Columns.TreeListColumn fColumn = treeList1.FocusedColumn; if (treeList1.ActiveEditor != null) { string newKey = treeList1.ActiveEditor.EditValue.ToString(); FilterNodeOperation operation = new FilterNodeOperation((!System.String.IsNullOrEmpty(newKey))?newKey : ""); treeList1.NodesIterator.DoOperation(operation); } }
终于可以了。
对了,原始代码,有这几句话:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraTreeList.Nodes.Operations;
using DevExpress.XtraTreeList.Columns;
using DevExpress.XtraTreeList.Nodes;