2011-10-04 62 views
0

我需要在treelist中實現增量搜索。標準是節點的名稱包含特定的字符串。我發現這個建議「你應該覆蓋 XtraTreeList.Handler.TreeListHandler.IncrementalSearchState類的FindNode方法」從這裏http://community.devexpress.com/forums/t/15735.aspx。但我不明白如何實現這一點。DevExpress TreeList增量搜索

+0

導線使用或者[深度優先(http://en.wikipedia.org/wiki/Depth-first_search)廣度優先搜索算法樹節點或並根據您的標準匹配節點名稱。 –

回答

2

一個簡單的遞歸應該給出遍歷整個樹的解決方案。

private TreeListNode GetNodeByName(TreeListNodes prmNodes, String prmName) 
{ 
    foreach (TreeListNode node in prmNodes) 
    { 
     // Assume the data is present in column 0. 
     if (node[0].ToString().Contains(prmName, StringComparison.CurrentCultureIgnoreCase)) 
     return node; 

     TreeListNode foundNode = GetNodeByName(node.Nodes, prmName); 

     if (foundNode != null) 
     return foundNode; 
    } 
    return null; 
} 
//--------------------------------------------------------------------------- 

現在,如果你做一個簡單的調用,比如:

TreeListNode node = GetNodeByName (treeList.Nodes, "MyNodeName"); 

你會得到你想要的節點。

0

我認爲這是這樣的:

public class MyTreeList : DevExpress.XtraTreeList.TreeList 
{ 

    protected override DevExpress.XtraTreeList.Handler.TreeListHandler CreateHandler() 
    { 
     return new MyHandler(this); 
    } 

    internal DevExpress.XtraTreeList.Handler.TreeListHandler GetHandler() { return this.Handler; } 
} 

public class MyHandler : DevExpress.XtraTreeList.Handler.TreeListHandler 
{ 
    public MyHandler(TreeList tree) : base(tree) { } 

    protected override TreeListControlState CreateState(TreeListState state) 
    { 
     if (state == TreeListState.IncrementalSearch && this.TreeList is MyTreeList) 
      return new MyFinder((this.TreeList as MyTreeList).GetHandler()); 
     return base.CreateState(state); 
    } 
} 

public class MyFinder : DevExpress.XtraTreeList.Handler.TreeListHandler.IncrementalSearchState 
{ 
    public MyFinder(DevExpress.XtraTreeList.Handler.TreeListHandler handler) : base(handler) { } 
    protected override TreeListNode FindNode(FindNodeArgs e) 
    { 
     //////////////////////////////////// 
     //////////////////////////////////// 
     //////////////////////////////////// 
     return base.FindNode(e); 
    } 
}