小弟使用了非常笨拙的寫法,有高手們請指點思路,讓小弟學習學習,拜託了。。。
載入樹 -- 使用遞迴寫法
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);
}
}
懇求高手們幫小弟指點指點,因為要是資料量多的話我怕會吃不消。。。。