首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

数据库连接取数据有关问题

2013-01-25 
数据库连接取数据问题 下面的数据是自动生成的,生成树形菜单,如果我要在数据库读取数据,ID,parentID,Name,

数据库连接取数据问题
 下面的数据是自动生成的,生成树形菜单,如果我要在数据库读取数据,ID,parentID,Name,该怎么改呢?

private DataTable GetAllDatas()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("ParentID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns[0].AutoIncrement = true;
            dt.Columns[0].AutoIncrementSeed = 1;

            CreateChild(dt, 0, 2);

            return dt;
        }

        /// <summary>
        /// 生成节点的子孙节点
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="parentId"></param>
        /// <param name="curLevel"></param>
        private void CreateChild(DataTable dt, int parentId, int curLevel)
        {
            curLevel--;
            if (curLevel >= 0)
            {
                for (int i = 0; i < 4; i++)
                {
                    DataRow dr = dt.NewRow();                    
                    dr[1] = parentId;
                    dr[2] = String.Format("Tree Item_{0}", dt.Rows.Count);
                    dt.Rows.Add(dr);

                    CreateChild(dt, dt.Rows.Count, curLevel);
                } 
            }
        }
[解决办法]

TreeView控件可以通过递归方式绑定数据库数据,代码如下:
    void Page_Load()
    {
        if (!Page.IsPostBack)


            PopulateTreeView();
    }
    private void PopulateTreeView()
    {
        DataTable treeViewData = http://www.cnblogs.com/zhouhb/archive/2012/02/11/GetTreeViewData();
        AddTopTreeViewNodes(treeViewData);  //绑定父节点
    }
    private DataTable GetTreeViewData()    //获取数据
    {
        string selectCommand = "SELECT MessageId,ParentId,Subject FROM Discuss";
        string conString = WebConfigurationManager.ConnectionStrings["Discuss"].ConnectionString;
        SqlDataAdapter dad = new SqlDataAdapter(selectCommand, conString);
        DataTable dtblDiscuss = new DataTable();
        dad.Fill(dtblDiscuss);
        return dtblDiscuss;
    }
    private void AddTopTreeViewNodes(DataTable treeViewData)
    {
        DataView view = new DataView(treeViewData);
        view.RowFilter = "ParentID IS NULL";
        foreach (DataRowView row in view)
        {
            TreeNode newNode = new TreeNode(row["Subject"].ToString(), row["MessageId"].ToString());
            TreeView1.Nodes.Add(newNode);
            AddChildTreeViewNodes(treeViewData, newNode);//绑定子节点
        }
    }
    private void AddChildTreeViewNodes(DataTable treeViewData, TreeNode parentTreeViewNode)
    {
        DataView view = new DataView(treeViewData);
        view.RowFilter = "ParentID=" + parentTreeViewNode.Value;
        foreach (DataRowView row in view)
        {
            TreeNode newNode = new TreeNode(row["Subject"].ToString(), row["MessageId"].ToString());
            parentTreeViewNode.ChildNodes.Add(newNode);
            AddChildTreeViewNodes(treeViewData, newNode);//递归,绑定子节点
        }
    }


数据表中记录通过ParentId字段指定父节点。
详细介绍可以参考:《ASP.NET2.0揭秘卷1》
 树节点TreeNode的重要属性:
Text:节点显示内容
Value:节点对应值
NavigateUrl:导航页面Url
Target:目标框架
ImageUrl:节点图像

页面扔一个treeview控件
[解决办法]
如果你还是想按照你给出代码的逻辑 做出树数据 而不是直接采用控件(或者第三方控件) 那么你肯定得改。
比如:
首先定义个所有树数据的dt(id name parentid);
首先获取所有的父节点(select * from table where parentid=0)=>dtFirst,


再foreach(dtFirst),填充到dt,调用getChildsByLevel(parentid,level)也填充到dt
getChildsByLevel(parentid,level)这是个递归方法即里面会循环递归调用自己获得数据 返回dt
这样就会得到所有的数据已树的形式.

当然也你可以直接考虑直接写一个递归方法 然后返回数据

其实没必要自己去写这种拉 还是使用treeview控件 或者第三方控件比如(zTree) 只要给他id parentid他则会自己给你生成树.

热点排行