qq_28295689
qq_28295689
采纳率33.3%
2018-03-14 08:22

c#winfrom treeview递归问题

160

图片说明

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

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

10条回答

  • openpignsdn openpignsdn 3年前

    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;//返回的查询结果
        }
    
    点赞 评论 复制链接分享
  • cxfidc01 红帽01 3年前

    图片说明

    点赞 评论 复制链接分享
  • cxfidc01 红帽01 3年前

    图片说明

    点赞 评论 复制链接分享
  • cxfidc01 红帽01 3年前

    图片说明

    点赞 1 评论 复制链接分享
  • cxfidc01 红帽01 3年前

    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)
    
    点赞 1 评论 复制链接分享
  • qq_28295689 qq_28295689 3年前
    //**
        //* 
        //* 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");
    
        }
    
    点赞 评论 复制链接分享
  • qq_28295689 qq_28295689 3年前

    图片说明
    图片说明

    点赞 评论 复制链接分享
  • openpignsdn openpignsdn 3年前

    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;//返回的查询结果
        }
    
    点赞 评论 复制链接分享
  • Mr_yang_yy_ Mr_yang_yy_ 3年前

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

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

    点赞 评论 复制链接分享
  • sky__f CoverageFeng 3年前

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

    点赞 评论 复制链接分享

为你推荐