在DevExpress程式中使用TeeList控制項以及節點查詢的處理

来源:http://www.cnblogs.com/wuhuacong/archive/2016/12/25/6219964.html
-Advertisement-
Play Games

在很多情況下,我們需要通過樹列表進行數據的展示,如一些有層次關係的數據,通過有層級的展示,能夠使用戶更加直觀查看和管理相關的數據。在一般Winform開發的情況下,可以使用微軟的TreeView控制項,也可以使用DevExpress的TreeList控制項進行數據的展示,本篇隨筆主要介紹基於DevExp... ...


在很多情況下,我們需要通過樹列表進行數據的展示,如一些有層次關係的數據,通過有層級的展示,能夠使用戶更加直觀查看和管理相關的數據。在一般Winform開發的情況下,可以使用微軟的TreeView控制項,也可以使用DevExpress的TreeList控制項進行數據的展示,本篇隨筆主要介紹基於DevExpress的TreeList控制項使用以及使用SearchControl對節點進行查詢的操作。

1、 使用微軟的TreeView控制項的實現效果和思路

在很多情況下,我們也傾向於使用TreeView控制項作為數據的展示,相對於TreeList控制項,這種控制項的處理,需要自己管理樹節點的層次關係,不過使用也比較簡單,呈現的效果兩者都差別不大。

如在我開發框架中,在字典管理模塊裡面,就是採用這個控制項進行數據的展示的,整體效果也還不錯。

在樹形列表裡面,我們獲取數據後,統一根據層級的關係構建樹節點即可,如下代碼所示。

/// <summary>
/// 初始化樹信息
/// </summary>
private void InitTreeView()
{
    this.treeView1.Nodes.Clear();
    this.treeView1.BeginUpdate();
    List<DictTypeNodeInfo> typeNodeList = BLLFactory<DictType>.Instance.GetTree();
    foreach (DictTypeNodeInfo info in typeNodeList)
    {
        AddTree(null, info);
    }
    this.treeView1.EndUpdate();
    this.treeView1.ExpandAll();
}

/// <summary>
/// 根據節點數據,遞歸構建該層級以下的樹節點
/// </summary>
/// <param name="pNode">父樹節點</param>
/// <param name="info">字典類型數據</param>
private void AddTree(TreeNode pNode, DictTypeNodeInfo info)
{
    TreeNode node = null;
    if (info.PID == "-1")
    {
        node = new TreeNode(info.Name, 0, 0);
        node.Tag = info.ID;
        this.treeView1.Nodes.Add(node);
    }
    else
    {
        node = new TreeNode(info.Name, 1, 1);
        node.Tag = info.ID;
        pNode.Nodes.Add(node);
    }

    foreach (DictTypeNodeInfo subInfo in info.Children)
    {
        AddTree(node, subInfo);
    }
}

還有我們在滑鼠選擇某個節點的時候,觸發AfterSelect事件,這樣我們就可以處理滑鼠節點的事件了

/// <summary>
/// 單擊節點事件處理
/// </summary>
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    if (e.Node.Tag != null)
    {
        this.lblDictType.Text = e.Node.Text;
        this.lblDictType.Tag = e.Node.Tag;

        BindData();
    }
}

以上就是使用TreeView控制項來處理數據的展示,從上面代碼可以看到,整體的內容,主要是通過遞歸的關係來構建TreeNode的處理,但是使用的代碼也不算複雜,因此大多數可以採用這種方式來自定義樹形節點的展示。

 

2、使用DevExpress的TreeList控制項的效果和實現代碼

而使用DevExpress的TeeList控制項,可以通過KeyFieldName和ParentFieldName指定他們的層級關係,使用就更加簡單化,提供的數據源會自動進行層次的關係處理,非常方便。

我們先來看看通過DevExpress的TreeList控制項展示的字典類型和字典數據的界面效果。

 

 這裡面的效果是如何通過代碼實現的呢?

首先我們使用代碼獲取字典類型數據併進行樹列表控制項的初始化操作,如下所示。

//添加顯示列
this.tree.Columns.Add(new TreeListColumn{ FieldName= "Name", Caption= "字典類型名稱", Width=160, VisibleIndex =0});
//設置樹控制項的層次關係及屬性
tree.KeyFieldName = "ID";
tree.ParentFieldName = "PID";
this.tree.OptionsBehavior.Editable = false;
this.tree.OptionsView.EnableAppearanceOddRow = true;
this.tree.OptionsView.EnableAppearanceEvenRow = true;

上面的代碼我們還可以通過擴展函數對樹列表的處理進行封裝,已達到簡化代碼的目的,如下是處理後的實現代碼:

//控制項擴展函數封裝處理
this.tree.CreateColumn("Name", "字典類型名稱", 160, true);
this.tree.InitTree("ID", "PID", "-1", false, false);

 

通過添加TreeListColumn對象給TreeList控制項就可以實現欄位列的顯示了,同時指定數據源裡面的KeyFieldName和ParentFieldName來設定層級關係即可,非常簡單。

而綁定數據源,則可以通過一個函數進行處理,如下所示。

/// <summary>
/// 綁定樹的數據源
/// </summary>
private void BindTree()
{
    this.tree.DataSource = BLLFactory<DictType>.Instance.GetAll();
    this.tree.ExpandAll();
}

從上面代碼我們可以看到,我們返回的數據源,不需要在實體類對象層級具有上下級的關係,如通過TreeView實現的時候,我們使用了DictTypeNodeInfo 對象是具有上下層級關係的。

這裡只需要使用普通的DictTypeInfo 對象集合即可,通過KeyFieldName和ParentFieldName來設定層級關係即可。

為了指定樹形節點的圖標,我們可以通過代碼進行自定義圖標的處理,如下代碼所示,這樣每個層級的圖標都不一樣,自動實現獲取設置的處理。

//設置樹的圖標集合及逐級圖標
this.tree.SelectImageList = this.imageCollection1;
this.tree.CustomDrawNodeImages += (object sender, CustomDrawNodeImagesEventArgs e)=>
{
    int maxCount = this.imageCollection1.Images.Count;
    var index = e.Node.Level < maxCount ? e.Node.Level : 0;
    e.SelectImageIndex = index;
};

實現樹節點選中的事件處理,則需要實現FocusedNodeChanged事件即可。

    //初始化樹節點選擇事件
    this.tree.FocusedNodeChanged += delegate(object sender, FocusedNodeChangedEventArgs e)
    {
        this.FocusedNodeChanged();
    };
}
private void FocusedNodeChanged()
{
    if (this.tree.FocusedNode != null)
    {
        var PID = string.Concat(this.tree.FocusedNode.GetValue("ID"));
        treeConditionSql = string.Format("DictType_ID = '{0}'", PID);
    }
    else
    {
        treeConditionSql = "";
    }
    BindData();
}

最後初始化樹列表的代碼如下所示。

private void InitTree()
{
    this.tree.Columns.Clear();

    //控制項擴展函數封裝處理
    this.tree.CreateColumn("Name", "字典類型名稱", 160, true);
    this.tree.InitTree("ID", "PID", "-1", false, false);
    
    //設置樹的圖標集合及逐級圖標
    this.tree.SelectImageList = this.imageCollection1;
    this.tree.CustomDrawNodeImages += (object sender, CustomDrawNodeImagesEventArgs e)=>
    {
        int maxCount = this.imageCollection1.Images.Count;
        var index = e.Node.Level < maxCount ? e.Node.Level : 0;
        e.SelectImageIndex = index;
    };
}

 

3、基於SearchControl控制項對節點進行查詢的操作

上面的處理就是樹列表的一般性展示,如果需要在樹節點上面增加一個查詢過濾的操作,那麼可以使用SearchControl控制項進行過濾處理,只需要設置SearchControl控制項的Client屬性,以及實現樹控制項的FilterNode事件即可。

/// <summary>
/// 實現樹節點的過濾查詢
/// </summary>
private void InitSearchControl()
{
    this.searchControl1.Client = this.tree;
    this.tree.FilterNode += (object sender, DevExpress.XtraTreeList.FilterNodeEventArgs e) =>
    {
        if (tree.DataSource == null)
            return;

        string nodeText = e.Node.GetDisplayText("Name");//參數填寫FieldName  
        if (string.IsNullOrWhiteSpace(nodeText))
            return;

        bool isExist = nodeText.IndexOf(searchControl1.Text, StringComparison.OrdinalIgnoreCase) >= 0;
        if (isExist)
        {
            var node = e.Node.ParentNode;
            while (node != null)
            {
                if (!node.Visible)
                {
                    node.Visible = true;
                    node = node.ParentNode;
                }
                else
                    break;
            }
        }
        e.Node.Visible = isExist;
        e.Handled = true;
    };
}

實現效果如下所示, 對於符合記錄的查詢,那麼會有高亮的顏色進行重點標註。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 既然瞭解了IL的介面和動態類之間的知識,何不使用進來項目實驗一下呢?而第一反應就是想到了平時經常說的IOC容器,在園子里搜索了一下也有這類型的文章http://www.cnblogs.com/kklldog/p/3395641.html,借鑒一下前人的知識就來實現一下吧。IOC的概念就不介紹了,想了 ...
  • 一.前言 許可權驗證在開發中是經常遇到的,通常也是封裝好的模塊,如果我們是使用者,通常指需要一個標記特性或者配置一下就可以完成,但實際裡面還是有許多東西值得我們去探究。有時候我們也會用一些開源的許可權驗證框架,不過能自己實現一遍就更好,自己開發的東西成就感(逼格)會更高一些。進入主題,本篇主要是介紹介面 ...
  • 一、24點游戲玩法規則效果展示 1、初始化界面 2、開始游戲界面 3、游戲超時界面 4、查看答案界面 5、答對界面 6、答錯界面 7、計算表達式的驗證界面 8、一副牌算完開始新一副牌界面 到這裡24點演算法基本操作圖就結束了,下麵來看看示例代碼吧。 二、完整代碼演示 關於代碼解釋,為了方便讀者瀏覽時更 ...
  • 登錄成功後寫入cookie的代碼 Response.Cookies["account"].Value = account;//"管理員" Response.Cookies["account"].Expires = DateTime.Now.AddDays(14); Response.Cookies[ ...
  • 回眸 C# 的前世今生 - 見證 C# 6.0 的新語法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本為 Visual Studio 2017 RC,兩者都尚未進入正式階段。C# 6.0 雖說出了一段時間,但是似乎有許多園友對這一塊知識並不瞭解,如拼接字元串的 $ 符號,在此,小人特地獻 ...
  • private void btnSave_Click(object sender, EventArgs e) //文件複製、保存方法 { #region 靜態複製文件(寫死) string desPath = @"c:\1\1.chm"; if (File.Exists(desPath)) ... ...
  • private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) //退出菜單方法 { //this.Close(); Application.Exit();//建議使用該關閉語句 } private void timer1... ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...