小弟使用了非常笨拙的写法,有高手们请指点思路,让小弟学习学习,拜托了。。。
加载树 -- 使用递归写法
protected void LoadChannel()
{
DataTable dt = bllChannel.GetList();
DataRow[] parent = dt.Select(" ParentId=0");
foreach (DataRow parentRow in parent)
{
TreeNode node = new TreeNode(parentRow["Title"].ToString(), parentRow["Id"].ToString());
node.ToolTip = parentRow["Title"].ToString() + "=>" + parentRow["Id"].ToString();//这里是为了用 js获取节点的文本、值---写法感觉很土
BindTree(dt, node, parentRow["Id"].ToString());
TreeView1.Nodes.Add(node);
}
}
void BindTree(DataTable dt, TreeNode node, string parentId)
{
DataRow[] row = dt.Select(" ParentId=" + parentId);
foreach (DataRow r in row)
{
TreeNode n = new TreeNode(r["Title"].ToString(), r["Id"].ToString());
n.ToolTip = r["Title"].ToString() + "=>" + r["Id"].ToString();
node.ChildNodes.Add(n);
BindTree(dt, n, r["Id"].ToString());
}
}
js 获取选中节点的值,分别放入两个数组
var textArr = new Array();
var valueArr = new Array();
$("input[type='checkbox']:checked").each(function () {
var tv = $(this).attr("title").split("=>"); //就是上面很土的tooltip值
textArr.push(tv[0]);
valueArr.push(tv[1]);
});
//使用join把数组转成字符串,以“||”分隔,并分别填入两个文本域
$get("cataNam").setAttribute("value", textArr.join("||"));
$get("cataId").setAttribute("value", valueArr.join("||"));
//加载时,使用递归遍历树把符合的值选中
{
string[] cataIdArray=row["CategoryId"].ToString().Split(new string[]{"||"}, StringSplitOptions.RemoveEmptyEntries);//把刚才插入数据库的值分隔
checkNode(TreeView1.Nodes, cataIdArray);
}
//递归方法
void checkNode(TreeNodeCollection tnodes, string[] cataIdArray)
{
foreach (TreeNode tn in tnodes)
{
for (int i = 0; i < cataIdArray.Length; i++)
{
if (tn.Value == cataIdArray.GetValue(i).ToString())
{
tn.Checked = true;
}
}
checkNode(tn.ChildNodes, cataIdArray);
}
}
恳求高手们帮小弟指点指点,因为要是数据量多的话我怕会吃不消。。。。