天天看點

樹型控件的處理(完整版)

如何添加資料庫中的資訊加載到樹形控件中?如何周遊控件中的資訊?如何對控件中的資訊進行增删查改?

資料庫設計:

主界面:

代碼:

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using TreeSolution.BLL;

using TreeSolution.Model;

namespace 樹型測試

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        //當窗體加載時,加載樹形節點

        private void Form1_Load(object sender, EventArgs e)

            T_TreeBLL treeBLL = new T_TreeBLL();

            IEnumerable<T_Tree> tree = treeBLL.GetByParentId(0);

            foreach (T_Tree node in tree)

            {

                TreeNode treeNode = new TreeNode();

                treeNode.Text = node.Name;

                treeNode.Tag = node;//将每一個節點所對應的model都放到它的Tag上

                treeView1.Nodes.Add(treeNode);

                FillChildren(treeNode,(int)node.Id);

            }

        /// <summary>

        /// 把以parentId為父節點的節點都添加到parentNode下

        /// </summary>

        /// <param name="pareNode">父節點</param>

        /// <param name="parentId"></param>

        private void FillChildren(TreeNode pareNode, int parentId)

            IEnumerable<T_Tree> tree = treeBLL.GetByParentId(parentId);

                pareNode.Nodes.Add(treeNode);

                //把所有的以我parentid的都加載到我的下面

                FillChildren(treeNode, (int)node.Id);

        //點選目前節點,顯示他的文字

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)

            string s = e.Node.Text.ToString();

            MessageBox.Show(s);

        //周遊節點

        #region 周遊節點

        private void button1_Click(object sender, EventArgs e)

            foreach (TreeNode node in treeView1.Nodes)

                DisplayNode(node);

        //遞歸調用的節點

        private void DisplayNode(TreeNode node)

            textBox1.AppendText(node.Text + "\r\n");

            if (node.Nodes.Count > 0)

                foreach (TreeNode childNode in node.Nodes)

                {

                    DisplayNode(childNode);

                }

        } 

        #endregion

        /// 修改節點

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button2_Click(object sender, EventArgs e)

            T_Tree model = (T_Tree)treeView1.SelectedNode.Tag;

            EditNode form = new EditNode();

            form.NodeName = model.Name;

            form.NodeBody = model.Body;

            if (form.ShowDialog() == DialogResult.OK)

                model.Name = form.NodeName;

                model.Body = form.NodeBody;

                new T_TreeBLL().Update(model);

 /// <summary>

        /// 添加根節點

        private void btnAddRootNode_Click(object sender, EventArgs e)

            if (form.ShowDialog()!=DialogResult.OK)

                return;

            T_Tree model = new T_Tree();

            model.Name = form.NodeName;

            model.Body = form.NodeBody;

            model.ParentId = 0;

            //添加資訊并傳回新添加的Id

            int id=new T_TreeBLL().AddNew(model);

            //将新增的Id賦給對象

            model.Id = id;

            //添加節點到Treeview控件上

            TreeNode node=new TreeNode();

            node.Text=model.Name;

            node.Tag = model;

            treeView1.Nodes.Add(node);

        //增加子節點

        private void btnAddChildNode_Click(object sender, EventArgs e)

            TreeNode selectedNode = treeView1.SelectedNode;

            if (selectedNode == null)

                MessageBox.Show("沒有節點被選中");

            //獲得選中節點的(父節點的)模型對象

            T_Tree parentModel=(T_Tree)selectedNode.Tag;

            //EditNode form = new EditNode();

            model.ParentId = parentModel.Id;

            model.Id=new T_TreeBLL().AddNew(model);

            //添加節點

            TreeNode treeNode = new TreeNode();

            treeNode.Text = model.Name;

            treeNode.Tag = model;

            selectedNode.Nodes.Add(treeNode);

        //删除節點

        private void btnDelete_Click(object sender, EventArgs e)

            //選中節點

            selectedNode.Remove();

            T_Tree model = (T_Tree)selectedNode.Tag;

            new T_TreeBLL().DeleteAllNode((int)model.Id);

    }

}

修改界面:

    public partial class EditNode : Form

        public EditNode()

        public string NodeName

            get { return txtName.Text; }

            set { txtName.Text = value; }

        public string NodeBody

            get { return txtBody.Text; }

            set { txtBody.Text = value; }

            DialogResult = DialogResult.OK;

            DialogResult = DialogResult.Cancel;

 總圖:

sqlhelper:

using System.Linq;

using System.Text;

using System.Configuration;

using System.Data.SqlClient;

using System.Data;

namespace TreeSolution.DAL

    class SqlHelper

        public static readonly string connstr = 

            ConfigurationManager.ConnectionStrings["dbconnstr"].ConnectionString;

        public static int ExecuteNonQuery(string cmdText,

            params SqlParameter[] parameters)

            using (SqlConnection conn = new SqlConnection(connstr))

                conn.Open();

                using (SqlCommand cmd = conn.CreateCommand())

                    cmd.CommandText = cmdText;

                    cmd.Parameters.AddRange(parameters);

                    return cmd.ExecuteNonQuery();

        public static object ExecuteScalar(string cmdText,

                    return cmd.ExecuteScalar();

        public static DataTable ExecuteDataTable(string cmdText,

                    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))

                    {

                        DataTable dt = new DataTable();

                        adapter.Fill(dt);

                        return dt;

                    }

        public static SqlDataReader ExecuteDataReader(string cmdText,

            SqlConnection conn = new SqlConnection(connstr);

            conn.Open();

            using (SqlCommand cmd = conn.CreateCommand())

                cmd.CommandText = cmdText;

                cmd.Parameters.AddRange(parameters);

                return cmd.ExecuteReader(CommandBehavior.CloseConnection);

三層模型的代碼:

model:

namespace TreeSolution.Model

    partial class T_Tree

        public System.Int32? Id { get; set; }

        public System.Int32? ParentId { get; set; }

        public System.String Name { get; set; }

        public System.String Body { get; set; }

DAL:

    partial class T_TreeDAL

        /// 添加資料

        /// <param name="model">資料模型</param>

        /// <returns></returns>

        public int AddNew(T_Tree model)

            string sql = "insert into T_Tree(ParentId,Name,Body) output inserted.id values(@ParentId,@Name,@Body)";

            int id = (int)SqlHelper.ExecuteScalar(sql

            , new SqlParameter("ParentId", model.ParentId)

            , new SqlParameter("Name", model.Name)

            , new SqlParameter("Body", model.Body)

            );

            return id;

        /// 更新資料

        /// <param name="model">一個資料模型</param>

        public bool Update(T_Tree model)

            int rows = SqlHelper.ExecuteNonQuery(sql

            ,new SqlParameter("Id", model.Id)

            ,new SqlParameter("ParentId", model.ParentId)

            ,new SqlParameter("Name", model.Name)

            ,new SqlParameter("Body", model.Body)

            return rows > 0;

        /// 删除某一節點

        /// <param name="id">id号</param>

        public bool Delete(int id)

            new SqlParameter("id",id));

        /// 将一行資料轉化為model

        /// <param name="row"></param>

        private static T_Tree ToModel(DataRow row)

            model.Id = row.IsNull("Id")?null:(System.Int32?)row["Id"];

            model.ParentId = row.IsNull("ParentId")?null:(System.Int32?)row["ParentId"];

            model.Name = row.IsNull("Name")?null:(System.String)row["Name"];

            model.Body = row.IsNull("Body")?null:(System.String)row["Body"];

            return model;

        /// 獲得Id為多少的對象

        /// <param name="id"></param>

        public T_Tree Get(int id)

            if (dt.Rows.Count > 1)

            {throw new Exception("more than 1 row was found");}

            if (dt.Rows.Count <= 0){return null;}

            DataRow row = dt.Rows[0];

            T_Tree model = ToModel(row);

        /// 獲得幾級節點

        /// <returns>傳回集合</returns>

        public IEnumerable<T_Tree> GetByParentId(int id)

            List<T_Tree> list = new List<T_Tree>();

            new SqlParameter("parentid", id));

            foreach (DataRow row in dt.Rows)

                list.Add(ToModel(row));

            return list;

        /// 傳回所有的T_Tree對象

        /// <returns>傳回T_Tree對象的泛型集合(隻讀屬性)</returns>

        public IEnumerable<T_Tree> ListAll()

            DataTable dt = SqlHelper.ExecuteDataTable("select * from T_Tree");

            foreach (DataRow row in dt.Rows){

       //删除目前節點的所有子節點

        public void DeleteAllNode(int id)

            IEnumerable<T_Tree> children = GetByParentId(id);

            foreach (T_Tree model in children)

                DeleteAllNode((int)model.Id);

            Delete(id);

BLL:

using TreeSolution.DAL;

namespace TreeSolution.BLL

    partial class T_TreeBLL

        /// <param name="model"></param>

            return new T_TreeDAL().AddNew(model);

        /// 删除資料

            return new T_TreeDAL().Delete(id);

            return new T_TreeDAL().Update(model);

        /// 查詢某一Id的資料

            return new T_TreeDAL().Get(id);

        /// 傳回集合

            return new T_TreeDAL().GetByParentId(id);

        /// 查詢所有的資料

            return new T_TreeDAL().ListAll();

       /// <summary>

        /// 删除所有節點

            new T_TreeDAL().DeleteAllNode(id);

        }   

本文轉自蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366615,如需轉載請自行聯系原作者