权限树节点的定义
data:[{
 id:"node1", //node id
 text:"node 1", //node text for display.
 value:"1", //node value
 showcheck:false, //whether to show checkbox
 checkstate:0, //Checkbox checking state. 0 for unchecked, 1 for partial checked, 2 for checked.
 hasChildren:true, //If hasChildren and complete set to true, and ChildNodes is empty, tree will request server to get sub node.
 isexpand:false, //Expand or collapse.
 complete:false, //See hasChildren.
 ChildNodes:[] // child nodes
 }]
创建节点
function createNode(id,text) {
            var node = {
                "id": id,
                "text": text,
                "value": id,
                "showcheck": true,
                complete: true,
                "isexpand": true,
                "checkstate": 0,
                "hasChildren": true
            };
             return node;
           }        function createLeafNode(id,text) {
            var leaf = {
                "id": id,
                "text": text,
                "value": id,
                "showcheck": true,
                complete: true,
                "isexpand": true,
                "checkstate": 0,
                "hasChildren": false
            };
            return leaf;
           }
数据库的设计
权限表Mission
字段名称  数据类型           约束条件            说明
MenuId  CHAR(20), 主键,NOT NULL 菜单ID
MenuTitle CHAR(20) NOT  NULL 菜单标题
ParmenuId CHAR(20), NOT  NULL 父菜单ID
我想的是递归调用,生成树,遇到的问题是没有办法建立子节点和父节点之间的联系
有解决的办法吗?或者别的思路?

解决方案 »

  1.   

     <script language="JavaScript">   
        var objdbConn = new ActiveXObject("ADODB.Connection");   
        var strdsn = "Driver={SQL Server};SERVER=localhost;UID=sa;PWD=;DATABASE=yuanWang";   
        objdbConn.Open(strdsn);   
        var objrs = objdbConn.Execute("Select * from [User]");   
         
        var fdCount = objrs.Fields.Count - 1;   
        if (!objrs.EOF){   
         document.write("<table border=1><tr>");   
         for (var i=0; i <= fdCount; i++)   
          document.write("<td><b>" + objrs.Fields(i).Name + "</b></td>");   
         document.write("</tr>");   
         while (!objrs.EOF){   
          document.write("<tr>");   
          for (i=0; i <= fdCount; i++)   
           document.write("<td valign='top'>" + objrs.Fields(i).Value + "</td>");   
          document.write("</tr>");   
          objrs.moveNext(); // 移到下一个记录点  
         }   
         
         document.write("</table>");   
        }   
        else   
         document.write("数据库内没有记录!<br>");   
        objrs.Close(); // 关闭记录集和   
        objdbConn.Close(); // 关闭数据库链接  
      

  2.   

    照你的方法写的差不多了,用html可以显示出来了
    可用javascript好像不安全吧
    另外转到vs中的asp中提示数据不安全,显示不出来·
      

  3.   

    我感觉还是在后台做好这些逻辑之后,直接用Literal写HTML比较好,因为你的信息全是从数据库取出来的.
      

  4.   

    我也是,不过用带的带checkbox的权限树使用的是前面的大神已经写好的javascript代码,怎样在后台生成节点
    没法写,不会!!!
      

  5.   

    我感觉你应该是用这个控件吧
    http://www.cnblogs.com/xuanye/archive/2009/10/26/1590250.html
    用ajax来取数据
    针对这个控件,我在服务器端写了个它的节点类,你可以用下看
    public class JsonTreeNode
    {
    private int m_intCheckState = 0; public string ID { get; set; }
    public string Text { get; set; }
    public string Value { get; set; }
    public bool ShowCheck { get; set; }
    public int CheckState
    {
    get
    {
    return m_intCheckState;
    }
    set
    {
    m_intCheckState = value;
    if(value != 0)
    {
    UpdateCheckState();
    }
    }
    }
    public bool IsExpand { get; set; } private JsonTreeNode m_Parent = null; public void SetParent(JsonTreeNode paramParent)
    {
    m_Parent = paramParent;
    } private void SetCheckState()
    {
    if(m_Parent.CheckState == 0)
    {
    m_Parent.CheckState = 2;
    }
    } public void UpdateCheckState()
    {
    if(m_Parent != null)
    {
    SetCheckState();
    }
    } public List<JsonTreeNode> Children = new List<JsonTreeNode>(); //public JsonTreeNode()
    //{
    //    ID = string.Empty;
    //    Text = string.Empty;
    //    Value = string.Empty;
    //    ShowCheck = true;
    //    IsExpand = false;
    //} public JsonTreeNode(JsonTreeNode paramParent)
    {
    ID = string.Empty;
    Text = string.Empty;
    Value = string.Empty;
    ShowCheck = true;
    IsExpand = false;
    m_Parent = paramParent;
    } public override string ToString()
    {
    if(ID.Length == 0)
    {
    ID = Value;
    }
    if(CheckState == 2)
    {
    IsExpand = true;
    }
    StringBuilder sb = new StringBuilder();
    sb.Append("{\"id\":\"");
    sb.Append(ID);
    sb.Append("\",\"text\":\"");
    sb.Append(Text);
    sb.Append("\",\"value\":\"");
    sb.Append(Value);
    sb.Append("\",\"showcheck\":");
    sb.Append(ShowCheck ? "true" : "false");
    sb.Append(",\"complete\":true,\"checkstate\":");
    sb.Append(CheckState);
    if(Children.Count > 0)
    {
    sb.Append(",\"isexpand\":");
    sb.Append(IsExpand ? "true" : "false");
    sb.Append(",\"hasChildren\":true,\"ChildNodes\":[");
    for(int i = 0; i <= Children.Count - 1; i++)
    {
    if(i > 0)
    {
    sb.Append(",");
    }
    sb.Append(Children[i]);
    }
    sb.Append("]}");
    }
    else
    {
    sb.Append(",\"hasChildren\":false,\"ChildNodes\":null}");
    }
    return sb.ToString();
    } public static string GetJsonData(List<JsonTreeNode> paramLst)
    {
    string strResult = string.Empty;
    for(int i = 0; i <= paramLst.Count - 1; i++)
    {
    if(i > 0)
    {
    strResult += ",";
    }
    strResult += paramLst[i];
    }
    return strResult;
    }
    }使用(部分代码):private List<JsonTreeNode> m_lstJsonTreeNode = new List<JsonTreeNode>();#region private List<JsonTreeNode> GetChildList(JsonTreeNode paramParentNode)
    /// <summary>
    /// 取得List<JsonTreeNode>
    /// </summary>
    /// <param name="paramParentNode"></param>
    /// <returns></returns>
    private List<JsonTreeNode> GetChildList(JsonTreeNode paramParentNode)
    {
    if(paramParentNode == null)
    {
    return m_lstJsonTreeNode;
    }
    else
    {
    return paramParentNode.Children;
    }
    }
    #endregion #region private void ProcessDataTable(JsonTreeNode paramParentNode, DataTable paramDtAll, string paramName, int paramLen) /// <summary>
    ///  /// </summary>
    /// <param name="paramParentNode"></param>
    /// <param name="paramDtAll"></param>
    /// <param name="paramName"></param>
    /// <param name="paramLen"></param>
    private void ProcessDataTable(JsonTreeNode paramParentNode, DataTable paramDtAll, string paramName, int paramLen)
    {
    if(paramLen == 0)
    {
    JsonTreeNode myJsonTreeNode = new JsonTreeNode(paramParentNode) { Text = "档案", Value = "0", CheckState = GetCheckState("0") };
    GetChildList(paramParentNode).Add(myJsonTreeNode);
    ProcessDataTable(myJsonTreeNode, paramDtAll, string.Empty, paramLen + 2);
    return;
    }
    DataRow[] drs = paramDtAll.Select(m_strCode + " LIKE '" + paramName + "%' AND LEN(" + m_strCode + ") = " + paramLen);
    foreach(DataRow drItem in drs)
    {
    JsonTreeNode myJsonTreeNode = new JsonTreeNode(paramParentNode) { Text = paramDtAll.Select(m_strCode + " = '" + drItem[m_strCode].ToString() + "'")[0][m_strName].ToString(), Value = drItem[m_strID].ToString(), ShowCheck = true, CheckState = GetCheckState(drItem[m_strID].ToString()) };
    GetChildList(paramParentNode).Add(myJsonTreeNode);
    ProcessDataTable(myJsonTreeNode, paramDtAll, drItem[m_strCode].ToString(), paramLen + 2);
    }
    }
    #endregion
      

  6.   

    你的表结构:
    MenuId  CHAR(20), 主键,NOT NULL 菜单ID
    MenuTitle CHAR(20) NOT  NULL 菜单标题
    ParmenuId CHAR(20), NOT  NULL 父菜单ID你可以用这段:#region private void ProcessDataTable(JsonTreeNode paramParentNode, DataTable paramDtAll, string paramParmenuId)
    /// <summary>
    ///
    /// </summary>
    /// <param name="paramParentNode"></param>
    /// <param name="paramDtAll"></param>
    /// <param name="paramParmenuId"></param>
    private void ProcessDataTable(JsonTreeNode paramParentNode, DataTable paramDtAll, string paramParmenuId)
    {
    #region 如果你希望最上面有个根节点“档案”的话就加上这段
    if(paramParentNode == null)
    {
    JsonTreeNode myJsonTreeNode = new JsonTreeNode(paramParentNode) { Text = "档案", Value = "0", CheckState = GetCheckState("0") };
    GetChildList(paramParentNode).Add(myJsonTreeNode);
    ProcessDataTable(myJsonTreeNode, paramDtAll, string.Empty); 
    return;
    }
    #endregion DataRow[] drs;
    if(paramParmenuId.Length == 0)
    {
    // ParmenuId CHAR(20), NOT  NULL 父菜单ID  最上层节点的这个列是不是空字符呢?
    drs = paramDtAll.Select("Len(ParmenuId) = 0");//这里我按空字符来处理,我觉得你的这个字段用varchar更好点
    }
    else
    {
    // 如果最上层节点的ParmenuId这个列是空字符,其实上面的那个也可以用这句,那就不用判断了
    drs = paramDtAll.Select("ParmenuId = '" + paramParmenuId + "'");
    }
    foreach(DataRow drItem in drs)
    {
    JsonTreeNode myJsonTreeNode = new JsonTreeNode(paramParentNode) { Text = drItem["MenuTitle"].ToString(), Value = drItem["MenuId"].ToString(), ShowCheck = true, CheckState = false };
    GetChildList(paramParentNode).Add(myJsonTreeNode);
    ProcessDataTable(myJsonTreeNode, paramDtAll, drItem["MenuTitle"].ToString());
    }
    }
    #endregionJson数据页面调用:
    Response.Cache.SetNoStore();
    Response.ContentType = "application/json";
    从数据库中取得数据,存入m_dsMain
    ProcessDataTable(null, m_dsMain.Tables[0], string.Empty);
    string strResult = string.Empty;
    strResult += "{\"AllData\":[";
    strResult += JsonTreeNode.GetJsonData(m_lstJsonTreeNode);
    strResult += "]}";
    Response.Write(strJsonResult);
    Response.Flush();
    UI页面:
      

  7.   

    不小心点到提交回复了,继续:
    $.ajax({type: "POST",dataType: "json",url: "你的json数据页面?rand=" + Math.random(),
    success: function (data) {
    var o1 = { showcheck: true };
    o1.data = data.AllData;
    $("#divTvMain").treeview(o1);
    },error: function(XMLHttpRequest, textStatus, errorThrown) { alert(textStatus);}
    });
    这里的rand=" + Math.random()为了不让页面缓存