本次封装采用的是JQuery 中的comboTree控件.在我接触的项目中,或多或少都用到了这个控件,所以就直接拿来封装下吧.具体的生成界面如下:

可以实现多选,并且可以实现获取多选的值.这样一来,在项目中,就可以不用使用大量的listbox或者是checkboxlist来进行绑定了.

具体的公共页面代码(comboTree.ashx)如下:

<%@ WebHandler Language="C#" Class="ComboTree" %>

using System;
using System.Web;
using System.Collections.Generic;

public class ComboTree : IHttpHandler {

public void ProcessRequest (HttpContext context) {
context.Response.ContentType
= "text/plain";
context.Response.Write(GetJson());
}


public static string GetJson()
{
string json = "[";
IList
<Tree> t = DB.returnParentTree();
foreach (Tree model in t)
{
if (model != t[t.Count - 1])
{
json
+= GetJsonByModel(model) + ",";
}
else
{
json
+= GetJsonByModel(model);
}
}
json
+= "]";
json
= json.Replace("'", "\"");
return json;
}

public static string GetJsonByModel(Tree t)
{
string json = "";
bool flag = DB.isHaveChild(t.ModuleID);

json
= "{"
+ "'id':'" + t.ModuleID + "',"
+ "'text':'" + t.ModuleName + "',"
+"'iconCls':'ok',"
+ "'children':";
if (!flag)
{
json
+= "null}";
}
else
{
json
+= "[";
IList
<Tree> list = DB.getChild(t.ModuleID);
foreach (Tree tree in list)
{
if (tree != list[list.Count - 1])
{
json
+= GetJsonByModel(tree) + ",";
}
else
{
json
+= GetJsonByModel(tree);
}
}
json
+= "]}";
}
return json;
}


public bool IsReusable {
get {
return false;
}
}

}

Tree类的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
///Tree 的摘要说明
/// </summary>
public class Tree
{
public int ModuleID { get; set; }

public int ParentID { get; set; }

public string ModulePath { get; set; }

public string ModuleName { get; set; }

}

数据操作类代码如下:

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;

/// <summary>
///DB 的摘要说明
/// </summary>
public class DB
{
public static readonly string connStr = System.Configuration.ConfigurationManager.AppSettings["connStr"];

public static SqlConnection GetConn()
{
SqlConnection conn
= new SqlConnection(connStr);
conn.Open();
return conn;
}

public static DataTable GetDT(string sql)
{
DataTable dt
= new DataTable();
using (SqlConnection conn = DB.GetConn())
{
SqlDataAdapter sda
= new SqlDataAdapter(sql, conn);
sda.Fill(dt);
}
return dt;
}

public static IList<Tree> returnParentTree()
{
IList
<Tree> t = new List<Tree>();
string sql = "select * from Models where [ParentModuleID]=0 order by OrderBy asc";
DataTable dt
= GetDT(sql);
foreach (DataRow dr in dt.Rows)
{
Tree tParent
= new Tree();
tParent.ModuleID
= Int32.Parse(dr["ID"].ToString());
tParent.ModuleName
= dr["ModuleName"].ToString();
tParent.ModulePath
= dr["MenuPath"].ToString();
tParent.ParentID
= Int32.Parse(dr["ParentModuleID"].ToString());
t.Add(tParent);
}
return t;
}

public static bool isHaveChild(int id)
{
bool flag = false;
string sql = "select ID from Models where ParentModuleID=" + id + "";
DataTable dt
= GetDT(sql);
if (dt.Rows.Count > 0)
{
flag
= true;
}
return flag;

}
public static IList<Tree> getChild(int id)
{
IList
<Tree> t = new List<Tree>();
string sql = "select * from Models where ParentModuleID=" + id + "";
DataTable dt
= GetDT(sql);
foreach (DataRow dr in dt.Rows)
{
Tree tParent
= new Tree();
tParent.ModuleID
= Int32.Parse(dr["ID"].ToString());
tParent.ModuleName
= dr["ModuleName"].ToString();
tParent.ModulePath
= dr["MenuPath"].ToString();
tParent.ParentID
= Int32.Parse(dr["ParentModuleID"].ToString());
t.Add(tParent);
}
return t;
}
}

都是比较简单的,所以就没有做过的的注释.  需要注意的是,在comboTree.ashx页面中,是用到了递归来生成JSON数据的,所以在利用递归生成的时候,一定要注意数据的正确性,否则会出现错误的.

 

 

 

 

posted on 2010-12-05 09:21  程序诗人  阅读(4535)  评论(5编辑  收藏  举报