qq_28295689
2018-03-14 08:22
采纳率: 33.3%
浏览 1.5k

c#winfrom treeview递归问题

图片说明

我遇到了一个问题,需要将一张表里的数据,弄成treeview形式,
sql 文件是这个

https://www.wenwenlove.cn/my/script.sql ,我放到我服务器上了

这个表里目前有4级结构,分别是1,2,3,4,后面可能有5,或则。。。
能帮我解决的万分感谢

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • openpignsdn 2018-03-15 14:06
    已采纳

    TreeNode tn1 = treeView1.Nodes.Add("", "存货分类");
    DataTable dt =DBHelpr.Query("select clnvCCode,clnvCName,ilnvCGrade,blnvCend from InventoryClass");

           // cometree(tn1.Nodes, dt, "",1);
    
            DataTable dts = GetNewDataTable(dt, "ilnvCGrade=" + 1, "clnvCName asc");
            for (int i = 0; i < dts.Rows.Count; i++)
            {
                tn1.Nodes.Add(dts.Rows[i]["clnvCName"].ToString(), dts.Rows[i]["clnvCName"].ToString());
                if (dts.Rows[i]["blnvCend"].ToString()=="0")
                cometree(tn1.Nodes[i].Nodes, dt, dts.Rows[i]["clnvCCode"].ToString(), 2);
            }
    
                         public void cometree(TreeNodeCollection tn, DataTable dt, string zkey, int ilnvCGrade)
        {
            DataTable dts = GetNewDataTable(dt, "clnvCCode like'" + zkey + "%' and ilnvCGrade=" + ilnvCGrade, "clnvCName asc");
            for (int i = 0; i < dts.Rows.Count; i++)
            {
                tn.Add(dts.Rows[i]["clnvCName"].ToString(), dts.Rows[i]["clnvCName"].ToString());
                if (dts.Rows[i]["blnvCend"].ToString() == "0")
                cometree(tn[i].Nodes, dt, dts.Rows[i]["clnvCCode"].ToString(), ilnvCGrade+1);
            }
        }
    
        /// 执行DataTable中的查询返回新的DataTable
        /// </summary>
        /// <param name="dt">源数据DataTable</param>
        /// <param name="condition">查询条件</param>
        /// <returns></returns>
        private DataTable GetNewDataTable(DataTable dt, string condition, string sortstr)
        {
            DataTable newdt = new DataTable();
    
            newdt = dt.Clone();
            DataRow[] dr = dt.Select(condition, sortstr);
            for (int i = 0; i < dr.Length && i < 200; i++)
            {
                newdt.ImportRow((DataRow)dr[i]);
            }
    
            return newdt;//返回的查询结果
        }
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • CoverageFeng 2018-03-14 08:53

    这不就是编号吗?除去根节点 ,两位数字的一定在一层,四位的一定在第二层,只不过前两位是上层的编号,最后两位是本层编号,
    比如01 02 03 是第一层的编号,0101 0102 是 第一层的01 下面01号 和01层下面的02号,第三层的一定是六位 010101 =》 01-01-01 是 01下面的01 下面的01 号,
    依次类推啊,第四层是八位数 ,第五层是十位啊,。blnvEnd 代表是否是叶节点,0 没有后代节点 =》叶节点 ,1 代表还有=》非叶节点。

    评论
    解决 无用
    打赏 举报
  • Mr_yang_yy_ 2018-03-14 09:02

    你不是已经有规律了吗 一级节点cInvCCode长度是2 往后每级节点cInvCCode长度加2 直接根据cInvCCode就可以把层级关系关联出来啊
    select * from InventoryClass where cInvCCode like '__' 查一级节点

    select * from InventoryClass where cInvCCode like '01__' 查01下的二级节点

    评论
    解决 无用
    打赏 举报
  • openpignsdn 2018-03-14 09:51

    tn1=treeComboBox1.Nodes.Add("", "存货分类");
    DataTable dt = "select clnvCName,ilnvCGrade from 存货分类";

            cometree(tn1.Nodes, dt, "");  
    
    public void cometree(TreeNodeCollection tn, DataTable dt, string zkey)
        {
            DataTable dts = GetNewDataTable(dt, "ilnvCGrade='" + zkey + "'", "clnvCName asc");
            for (int i = 0; i < dts.Rows.Count; i++)
            {
                tn.Add(dts.Rows[i]["clnvCName"].ToString(), dts.Rows[i]["clnvCName"].ToString());
                cometree(tn[i].Nodes, dt, (Convert.toInt32(dts.Rows[i]["ilnvCGrade"].ToString())-1).Tostring());
            }
        }
    
        /// 执行DataTable中的查询返回新的DataTable
        /// </summary>
        /// <param name="dt">源数据DataTable</param>
        /// <param name="condition">查询条件</param>
        /// <returns></returns>
        private DataTable GetNewDataTable(DataTable dt, string condition, string sortstr)
        {
            DataTable newdt = new DataTable();
    
                newdt = dt.Clone();
                DataRow[] dr = dt.Select(condition, sortstr);
                for (int i = 0; i < dr.Length && i < 200; i++)
                {
                    newdt.ImportRow((DataRow)dr[i]);
                }
    
            return newdt;//返回的查询结果
        }
    
    评论
    解决 无用
    打赏 举报
  • qq_28295689 2018-03-14 10:53

    图片说明
    图片说明

    评论
    解决 无用
    打赏 举报
  • qq_28295689 2018-03-14 12:02
    //**
        //* 
        //* length, 起始值  0
        //* pNode,  节点
        //* code   //长度从0开始
        //*
    
        public void add(int length,TreeNode pNode,String code){
            db = DBHelper.Query("select  * from inverntoryclass where cInvCCode like  '" + code + "'+'%' and len(cInvCCode)='" + length + "'+2", "inverntoryclass");
            for (int i = 0; i < db.Rows.Count; i++)
            {
                TreeNode Node = new TreeNode();
                //如果 binCend=1表示是没有子节点
                if (db.Rows[i]["binCend"].ToString() == "1")
                {
                    //treeview添加
                    //父节点添加子节点,不用递归了
                    treeView1.Nodes.Add(Node);
                }
                else
                {
                    //有子节点
                    //treeview添加子节点 ,递归操作
                    pNode.Nodes.Add(Node);
                    add(length + 2, Node, code);
                }
            }
        }
    
        private void Form4_Load(object sender, EventArgs e)
        {
             TreeNode pNode = null;
             add(0, pNode, "0");
    
        }
    
    评论
    解决 无用
    打赏 举报
  • 红帽01 2018-03-15 08:49

    private void button1_Click(object sender, EventArgs e)
    {
    TreeNode tvroot = new TreeNode("存货分类");
    treeView1.Nodes.Add(tvroot);
    //生成第一级
    DataTable dt = GetData("SELECT * FROM dbo.InventoryClass WHERE iInvCGrade=1");
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    TreeNode t1 = new TreeNode(dt.Rows[i]["cInvCName"].ToString());
    tvroot.Nodes.Add(t1);

                if (dt.Rows[i]["bInvCEnd"].ToString() == "False")
                {
                    BuildTree(t1, dt.Rows[i]["cInvCCode"].ToString(), 2);
                }
            }
        }
    
        public void BuildTree(TreeNode tvRoot, string strType, int iLevel)
        {
            DataTable dt = GetData("SELECT * FROM dbo.InventoryClass WHERE cInvCCode LIKE '" + strType + "%' and iInvCGrade=" + iLevel.ToString());
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TreeNode t1 = new TreeNode(dt.Rows[i]["cInvCName"].ToString());
                tvRoot.Nodes.Add(t1);
    
                if (dt.Rows[i]["bInvCEnd"].ToString() == "False")
                {
                    BuildTree(t1, dt.Rows[i]["cInvCCode"].ToString(), iLevel + 1);
                }
            }
        }
    
    
        public DataTable GetData(string strSql)
        {
            string strConn = "data source=192.168.1.100;initial catalog=tempdb;user id=sa;password=123abcABC!@#;";
            Common.DbContextBase.EzagooDataBaseSingle db = new Common.DbContextBase.EzagooDataBaseSingle(strConn);
            try
            {
                db.OpenDB();
                return db.Query(strSql);
            }
            catch (System.Exception ex)
            {                
                return null;
            }
            finally
            {
                db.CloseDB();
                db = null;
            }
        }
    
    
    
    
        ![图片说明](https://img-ask.csdn.net/upload/201803/15/1521103737_959227.png)
    
        ![图片说明](https://img-ask.csdn.net/upload/201803/15/1521103746_247199.png)
    
        ![图片说明](https://img-ask.csdn.net/upload/201803/15/1521103753_324741.png)
    
    评论
    解决 无用
    打赏 举报
  • 红帽01 2018-03-15 08:49

    图片说明

    评论
    解决 无用
    打赏 举报
  • 红帽01 2018-03-15 08:49

    图片说明

    评论
    解决 无用
    打赏 举报
  • 红帽01 2018-03-15 08:49

    图片说明

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题