WinForm控件之【TreeView】


基本介紹

標簽項的分層集合控件(樹形控件),節點可加載圖片顯示。

常設置屬性

CheckBoxes:樹節點旁是否顯示復選框;

FullRowSelect:指示突出顯示是否跨越樹視圖控件的整個寬度;

Indent:每個子樹節點級別的縮進距離;

ItemHeight:樹視圖控件中每個樹節點的高度;

LabelEdit:指示是否可以編輯樹節點的標簽文本;

Scrollable:指示樹視圖控件是否在需要時顯示滾動條;

ShowPlusMinus:指示是否在包含子樹節點的樹節點旁邊顯示加/減按鈕;

ShowRootLines:指示是否在樹視圖根處的樹節點之間顯示連線;

Name:指示代碼中用來標識該對象的名稱;

 

事例舉例

 

 

相關代碼

        private void btn_LoadData_Click(object sender, EventArgs e)
        {
            //設置樹形組件的基礎屬性
            treeView1.CheckBoxes = true;
            treeView1.FullRowSelect = true;
            treeView1.Indent = 20;
            treeView1.ItemHeight = 20;
            treeView1.LabelEdit = false;
            treeView1.Scrollable = true;
            treeView1.ShowPlusMinus = true;
            treeView1.ShowRootLines = true;


            //需要加載樹形的源數據
            string[] strData = { "1;內地;柳岩",
                                 "2;內地;楊冪",
                                 "3;歐美;卡戴珊",
                                 "4;日韓;李成敏",
                                 "5;日韓;宇都宮紫苑"};

            //解析到DataTable數據集
            DataTable dtData = new DataTable();
            dtData.Columns.Add("ID");
            dtData.Columns.Add("GROUP");
            dtData.Columns.Add("NAME");

            foreach (string item in strData)
            {
                string[] values = item.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                if (values.Length == 3)
                {
                    DataRow row = dtData.NewRow();
                    row["ID"] = values[0];
                    row["GROUP"] = values[1];
                    row["NAME"] = values[2];
                    dtData.Rows.Add(row);
                }
            }


            TreeNode tn = new TreeNode();
            tn.Name = "全部";
            tn.Text = "全部";


            //將數據集加載到樹形控件當中
            foreach (DataRow row in dtData.Rows)
            {
                string strValue = row["GROUP"].ToString();
                if (tn.Nodes.Count > 0)
                {
                    if (!tn.Nodes.ContainsKey(strValue))
                    {
                        BindTreeData(tn, dtData, strValue);
                    }
                }
                else
                {
                    BindTreeData(tn, dtData, strValue);
                }
            }

            treeView1.Nodes.Add(tn);
            treeView1.ExpandAll();
        }

        private void BindTreeData(TreeNode tn, DataTable dtData, string strValue)
        {
            TreeNode tn1 = new TreeNode();
            tn1.Name = strValue;
            tn1.Text = strValue;
            tn.Nodes.Add(tn1);

            DataRow[] rows = dtData.Select(string.Format("GROUP='{0}'", strValue));
            if (rows.Length > 0)
            {
                foreach (DataRow dr in rows)
                {
                    TreeNode tn2 = new TreeNode();
                    tn2.Name = dr["GROUP"].ToString();
                    tn2.Text = dr["NAME"].ToString();
                    tn1.Nodes.Add(tn2);
                }
            }
        }

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            //鼠標勾選樹節點時需要使樹節點為選中狀態,反之忽略
            if (isMouseClick)
            {
                treeView1.SelectedNode = e.Node;
            }

            //獲取勾選項名稱
            StringBuilder sb = new StringBuilder();
            GetTreeNodesCheckName(sb, treeView1.Nodes);
            txt_CheckValue.Text = sb.ToString().Trim(';');
        }

        private void GetTreeNodesCheckName(StringBuilder sb, TreeNodeCollection tnc)
        {
            foreach (TreeNode item in tnc)
            {
                if (item.Checked) { sb.AppendFormat("{0};", item.Text); }

                GetTreeNodesCheckName(sb, item.Nodes);
            }
        }

        bool isMouseClick = true;
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            //選中或勾選樹節點時觸發子樹節點或父樹節點的邏輯操作
            isMouseClick = false;

            SetCheckedChildNodes(e.Node, e.Node.Checked);

            SetCheckedParentNodes(e.Node, e.Node.Checked);

            isMouseClick = true;
        }

        //樹節點的父樹節點邏輯操作
        private static void SetCheckedParentNodes(TreeNode tn, bool CheckState)
        {
            if (tn.Parent != null)
            {
                //當選中樹節點勾選后同級所有樹節點都勾選時,父樹節點為勾選狀態;
                //當選中樹節點中的同級樹節點其中有一個樹節點未勾選則父樹節點為未勾選狀態;
                bool b = false;
                for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                {
                    bool state = tn.Parent.Nodes[i].Checked;
                    if (!state.Equals(CheckState))
                    {
                        b = !b;
                        break;
                    }
                }
                tn.Parent.Checked = b ? (Boolean)false : CheckState;

                SetCheckedParentNodes(tn.Parent, CheckState);
            }
        }

        //樹節點的子樹節點邏輯操作
        private static void SetCheckedChildNodes(TreeNode tn, bool CheckState)
        {
            if (tn.Nodes.Count > 0)
            {
                //當前樹節點狀態變更,子樹節點同步狀態
                foreach (TreeNode tn1 in tn.Nodes)
                {
                    tn1.Checked = CheckState;

                    SetCheckedChildNodes(tn1, CheckState);
                }
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM