您的位置:首页 > 其它

treeview绑定到关系数据源,生成树,并实现checkbox的级联选择

2010-05-18 21:29 501 查看
treeview使用参考vs的联机帮助,这里重点讲一下treeview绑定到关系数据源,同时实现checkbox的级联选择(使用TreeView.js),提交checkbox为true的项。或者导入某些项到treeview中进行编辑,使相应的checkbox为true。数据表必须有自身id、父亲id两个字段。
前台:

<mce:script language="javascript" src="TreeView.js" mce_src="TreeView.js"  type="text/javascript"></mce:script>
<mce:script language ="javascript" type="text/javascript"><!--
function OnTreeNodeChecked()
{
var element = element = window.event.srcElement;
if (!IsCheckBox(element))
return;
var isChecked = element.checked;
var tree = TV2_GetTreeById("TreeView1");
var node = TV2_GetNode(tree,element);
TV2_SetChildNodesCheckStatus(node,isChecked);
var parent = TV2_GetParentNode(tree,node);
TV2_NodeOnChildNodeCheckedChanged(tree,parent,isChecked);
}
// --></mce:script>

<asp:TreeView ID="TreeView1" runat="server" ShowCheckBoxes="All" OnClick="OnTreeNodeChecked(this)" >
</asp:TreeView>

<asp:Button ID="Button1" Width="40px" Text="提交" runat="server" onclick="Button1_Click" Height="26px" />

<asp:Button ID="Button2" Width="40px" runat="server" Text="编辑"  onclick="Button2_Click" />
<asp:ListBox id=” ListBox1” runat=”server”></asp:ListBox>


后台:

public partial class test1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetDepartment();
}
}

//绑定数据到treeview
private void GetDepartment()
{
TreeView1.Nodes.Clear();
AddTree(0, (TreeNode)null);
}
public void AddTree(int ParentID, TreeNode pNode)
{
string sqlString = "select D_id,D_parentId,D_name from department";
DataTable dt = new DataTable();
//这个是我获取数据源的代码
dt = sqlhelper.GetDataTable(sqlString, "mis");
DataView dvTree = new DataView(dt);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "D_ parentId =" + ParentID;

foreach (DataRowView Row in dvTree)
{
TreeNode Node = new TreeNode();
if (pNode == null)
{          //添加根节点
Node.Text = Row["D_name"].ToString().Trim();
Node.Value = Row["D_id"].ToString().Trim();
TreeView1.Nodes.Add(Node);
//Node.Expanded = true;

AddTree(Int32.Parse(Row["D_id"].ToString()), Node);          //再次递归
}
else
{        //添加当前节点的子节点
Node.Text = Row["D_name"].ToString();
Node.Value = Row["D_id"].ToString().Trim();
pNode.ChildNodes.Add(Node);
//Node.Expanded = true;
AddTree(Int32.Parse(Row["D_id"].ToString()), Node);            //再次递归
}
}
}

//提交
protected void Button1_Click(object sender, EventArgs e)
{
ListBox1.Items.Clear();

foreach(TreeNode tn in TreeView1.CheckedNodes )
{
ListItem li = new ListItem();
li.Text = tn.Text;
li.Value = tn.Value;
ListBox1.Items.Add(li);
}
}

//编辑
protected void Button2_Click(object sender, EventArgs e)
{
GetDepartment();
foreach(ListItem li in ListBox1.Items)
{
IntoTV(TreeView1.Nodes,li.Text);
}
}

//倒入到treeview
private void IntoTV(TreeNodeCollection parNode, string parListItem)
{
foreach (TreeNode node in parNode)
{
if (node.Text == parListItem)
{
node.Checked = true;
Message.Text += node.Text;
}
else
{
if (node.ChildNodes.Count != 0)
{
IntoTV(node.ChildNodes, parListItem);
}
}
}
}
}


treeview.js

function TV2_SetChildNodesCheckStatus(node,isChecked)
{
var childNodes = TV2i_GetChildNodesDiv(node);
if(childNodes == null)
return;

var inputs = WebForm_GetElementsByTagName(childNodes,"INPUT");
if(inputs == null || inputs.length == 0)
return;

for(var i = 0; i < inputs.length; i++)
{
if(IsCheckBox(inputs[i]))
inputs[i].checked = isChecked;
}
}

//change parent node checkbox status after child node changed
function TV2_NodeOnChildNodeCheckedChanged(tree,node,isChecked)
{
if(node == null)
return;

var childNodes = TV2_GetChildNodes(tree,node);

if(childNodes == null || childNodes.length == 0)
return;

var isAllSame = true;

for(var i = 0; i < childNodes.length; i++)
{
var item = childNodes[i];
var value = TV2_NodeGetChecked(item);

if(isChecked != value)
{
isAllSame = false;
break;
}
}

var parent = TV2_GetParentNode(tree,node);
if(isAllSame)
{
TV2_NodeSetChecked(node,isChecked);
TV2_NodeOnChildNodeCheckedChanged(tree,parent,isChecked);
}
else
{
TV2_NodeSetChecked(node,false);
TV2_NodeOnChildNodeCheckedChanged(tree,parent,false);
}
}

//get node relative element(etc. checkbox)
function TV2_GetNode(tree,element)
{
var id = element.id.replace(tree.id,"");
id = id.toLowerCase().replace(element.type,"");
id = tree.id + id;

var node = document.getElementById(id);
if(node == null) //leaf node, no "A" node
return element;
return node;
}

//get parent node
function TV2_GetParentNode(tree,node)
{
var div = WebForm_GetParentByTagName(node,"DIV");

//The structure of node: <table>information of node</table><div>child nodes</div>
var table = div.previousSibling;
if(table == null)
return null;

return TV2i_GetNodeInElement(tree,table);
}

//get child nodes array
function TV2_GetChildNodes(tree,node)
{
if(TV2_NodeIsLeaf(node))
return null;

var children = new Array();
var div = TV2i_GetChildNodesDiv(node);
var index = 0;

for(var i = 0; i < div.childNodes.length; i++)
{
var element = div.childNodes[i];
if(element.tagName != "TABLE")
continue;

var child = TV2i_GetNodeInElement(tree,element);
if(child != null)
children[index++] = child;
}
return children;
}

function TV2_NodeIsLeaf(node)
{
return !(node.tagName == "A"); //Todo
}

function TV2_NodeGetChecked(node)
{
var checkbox = TV2i_NodeGetCheckBox(node);
return checkbox.checked;
}

function TV2_NodeSetChecked(node,isChecked)
{
var checkbox = TV2i_NodeGetCheckBox(node);
if(checkbox != null)
checkbox.checked = isChecked;
}

function IsCheckBox(element)
{
if(element == null)
return false;
return (element.tagName == "INPUT" && element.type.toLowerCase() == "checkbox");
}

//get tree
function TV2_GetTreeById(id)
{
return document.getElementById(id);
}

//////////////////////////////////////////////////////////////////////////////////////////////
//private mothods, with TV2i_ prefix
//////////////////////////////////////////////////////////////////////////////////////////////

//get div contains child nodes
function TV2i_GetChildNodesDiv(node)
{
if(TV2_NodeIsLeaf(node))
return null;

var childNodsDivId = node.id + "Nodes";
return document.getElementById( childNodsDivId );
}

//find node in element
function TV2i_GetNodeInElement(tree,element)
{
var node = TV2i_GetNodeInElementA(tree,element);
if(node == null)
{
node = TV2i_GetNodeInElementInput(tree,element);
}
return node;
}

//find "A" node
function TV2i_GetNodeInElementA(tree,element)
{
var as = WebForm_GetElementsByTagName(element,"A");
if(as== null || as.length == 0)
return null;

var regexp = new RegExp("^" + tree.id + "n//d+$");

for(var i = 0; i < as.length; i++)
{
if(as[i].id.match(regexp))
{
return as[i];
}
}
return null;
}

//find "INPUT" node
function TV2i_GetNodeInElementInput(tree,element)
{
var as = WebForm_GetElementsByTagName(element,"INPUT");
if(as== null || as.length == 0)
return null;

var regexp = new RegExp("^" + tree.id + "n//d+");

for(var i = 0; i < as.length; i++)
{
if(as[i].id.match(regexp))
{
return as[i];
}
}
return null;
}

//get checkbox of node
function TV2i_NodeGetCheckBox(node)
{
if(IsCheckBox(node))
return node;

var id = node.id + "CheckBox";
return document.getElementById(id);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: