TreeView 分层加载 三级大数据
谁能帮帮我!是这样的 我要做个TreeView 分层加载 一共有三个级 单位, 部门,员工, 这个三个级中的数据在三张表里面 用id关联起的,
由于每级数据都很多 不能一次加载三个级 。
这个TreeView 中还有个复选框 要做到子选父被选,父选子全选。 如果没有加载的员工在部门被选中后自动加载并且选中。 --------------------编程问答-------------------- js+treeview --------------------编程问答-------------------- 先加载单位,然后再节点展开事件中,加载其他 --------------------编程问答-------------------- treeview已经能实现这个
在后台的 根据点击的节点去加载子节点
--------------------编程问答-------------------- 我只到这个!public partial class aa : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PopulateRootLevel();
}
}
private void PopulateRootLevel()
{
DataTable dt = DBFun.dataTable("Select id, name,(select count(*) FROM sc_productcat WHERE parent_id=sc.id) as childnodecount From sc_productcat sc where parent_id=0 order by [position] desc, id");
PopulateNodes(dt, TreeView1.Nodes);
}
private void PopulateSubLevel(int parentid, TreeNode parentNode)
{
DataTable dt = DBFun.dataTable("Select id, name,(select count(*) FROM sc_productcat WHERE parent_id=sc.id) as childnodecount From sc_productcat sc where parent_id=" + parentid + " order by [position] desc, id");
PopulateNodes(dt, parentNode.ChildNodes);
}
protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
PopulateSubLevel(Convert.ToInt32(e.Node.Value), e.Node);
}
private void PopulateNodes(DataTable dt, TreeNodeCollection nodes)
{
foreach (DataRow dr in dt.Rows)
{
TreeNode tn = new TreeNode();
tn.Text = dr["name"].ToString();
tn.Value = dr["id"].ToString();
nodes.Add(tn);
tn.PopulateOnDemand = (Convert.ToInt32(dr["childnodecount"]) > 0 ? true : false);
tn.SelectAction = TreeNodeSelectAction.Expand;
}
}
}
这个加载后出现的部门当我点击第一个部门的时候还是部门 还有就是 我的树上面有个复选框 点击这个复选框的时候 也要实现加载复选框下(没有加载的)子节点并且让其子节点加载! 比如说 我选上了第一个单位
那么该单位下的部门全部加载并且 这些部门全部被选中 这些部门下的员工也加载选中! --------------------编程问答-------------------- 可以用站点地图试试啊~ --------------------编程问答-------------------- 这个是动态的啊 --------------------编程问答-------------------- <div>
<asp:TreeView ID="TreeView1" ExpandDepth="1" PopulateNodesFromClient="true" runat="server" ShowCheckBoxes="All" OnTreeNodeExpanded="TreeView1_TreeNodePopulate"></asp:TreeView>
</div>
public void FillData(DataSet ds, string tableName, string strSql)
{
using (SqlConnection conn = new SqlConnection(strconn))
{
conn.Open();
SqlDataAdapter adp = new SqlDataAdapter(strSql, conn);
adp.Fill(ds, tableName);
}
}
private void node()
{
DataTable dt = new DataTable();
dt.Columns.Add("name", typeof(System.String));
dt.Columns.Add("id", typeof(System.String));
dt.Columns.Add("childnodecount", typeof(System.String));
DataRow dr = dt.NewRow();
dr["name"] = "接收人";
dr["childnodecount"] = "1";
dr["id"] = "1";
dt.Rows.Add(dr);
PopulateNodes(dt, TreeView1.Nodes);
}
private void PopulateRootLevel(int p, TreeNode treeNode)
{
string sql = "select id,depart as name,(select count(*) FROM UserSubDepart where DepartId=sc.id) as childnodecount from UserDepart as sc order by Id";
DataSet ds = new DataSet();
DataTable dt = new DataTable();
FillData(ds,"da", sql);
dt = ds.Tables[0];
PopulateNodes(dt, treeNode.ChildNodes);
}
private void PopulateSubLevel(int parentid, TreeNode parentNode)
{
string sql = "select id,Depart1 as name ,(select count(*) FROM UserTelephone1 where SubDepart=sc.id ) as childnodecount from UserSubDepart as sc where DepartId='" + parentid + "' order by Id";
DataTable dt = new DataTable();
DataSet ds = new DataSet();
FillData(ds, "da", sql);
dt = ds.Tables[0];
PopulateNodes(dt, parentNode.ChildNodes);
}
protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
if (e.Node.Depth==0)
{
if (e.Node.ChildNodes.Count >0)
{
}
else {
PopulateRootLevel(Convert.ToInt32(e.Node.Value), e.Node);
}
}
else if (e.Node.Depth == 1)
{
if (e.Node.ChildNodes.Count == 0)
{
PopulateSubLevel(Convert.ToInt32(e.Node.Value), e.Node);
}
}
else
{
if (e.Node.ChildNodes.Count == 0)
{
PopulateSubLeve(Convert.ToInt32(e.Node.Value), e.Node);
}
}
}
private void PopulateSubLeve(int p, TreeNode treeNode)
{
string sql = "select id,UserName as name ,(select count(*) FROM UserTelephone1 where id=sc.id ) as childnodecount from UserTelephone1 as sc where isok=0 and SubDepart='" + p + "' order by Id";
DataTable dt = new DataTable();
DataSet ds = new DataSet();
FillData(ds, "da", sql);
dt = ds.Tables[0];
foreach (DataRow dr in dt.Rows)
{
TreeNode tn = new TreeNode();
tn.Text = dr["name"].ToString();
tn.Value = dr["id"].ToString();
treeNode.ChildNodes.Add(tn);
}
}
private void PopulateNodes(DataTable dt, TreeNodeCollection nodes)
{
foreach (DataRow dr in dt.Rows)
{
TreeNode tn = new TreeNode();
tn.Text = dr["name"].ToString();
tn.Value = dr["id"].ToString();
nodes.Add(tn);
tn.PopulateOnDemand = (Convert.ToInt32(dr["childnodecount"]) > 0 ? true : false);
tn.SelectAction = TreeNodeSelectAction.Expand;
}
}
我现在分布式加载已经成功了 但是又一个问题卡住了我 因为我这个树要实现子选父被选 父选子全选
如果没有加载子节点 选择了父节点那么该父节点下的子节点没有选中 我想要一个父节点选中了 如果没有子节点就加载子节点 如果有子节点就不用了 !或者如果没有加载子节点,而父节点被选中就提示需要加载! --------------------编程问答-------------------- <script type="text/javascript">
function CheckEvent(evt)
{
evt=window.event||evt;
var objNode = evt.srcElement||evt.target;
if(objNode.tagName == "INPUT" && objNode.type== "checkbox")
{
var objParentDiv = objNode.id.replace("CheckBox","Nodes");
if(objNode.checked==true)
{
setChildCheckState(objParentDiv,true);
setParentCheckeState(objNode,true);
}
}
else
{
setChildCheckState(objParentDiv,false);
if(!HasOtherChecked(objNode)){
setParentCheckeState(objNode,false);
}
}
}
}
//判断是否有并行的其他节点被选中
function HasOtherChecked(objNode)
{
var objParentDiv = WebForm_GetParentByTagName(objNode, "div");
var chks = objParentDiv.getElementsByTagName("INPUT");
for(var i=0;i<chks.length;i++){
if(chks[i].checked && chks[i].id != objNode.id)
{
return true;
}
}
return false;
}
//设置父节点
function setParentCheckeState(objNode,chkstate)
{
try{
var objParentDiv = WebForm_GetParentByTagName(objNode, "div");
if(objParentDiv == null || objParentDiv == "undefined "){
}
else{
var objParentChkId = objParentDiv.id.replace("Nodes","CheckBox");
var objParentCheckBox = document.getElementById(objParentChkId);
if(objParentCheckBox){
objParentCheckBox.checked = chkstate;
setParentCheckeState(objParentDiv,chkstate);
}
}
}
catch(e){}
}
//设置子节点
function setChildCheckState(nodeid,chkstate)
{
var node = document.getElementById(nodeid);
if(node){
var chks = node.getElementsByTagName("INPUT");
for(var i=0;i<chks.length;i++){
chks[i].checked = chkstate;
}
}
}
</script> --------------------编程问答-------------------- treeview不是有个什么属性的嘛 好像有你查查咯 --------------------编程问答-------------------- http://blog.sina.com.cn/s/blog_50fc32cd01008g38.html --------------------编程问答-------------------- 建议先加载目录,然后在点击每个目录的时候再去获取下面的数据,ajax 就ok了~~ --------------------编程问答-------------------- 参考以下代码
--------------------编程问答-------------------- 楼主应该有点功底的吧。动态加载的,你研究一下MSDN,上面比较清楚的,我就不多说了。
DataTable dt = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dt.Columns.Add("a1");
dt.Columns.Add("a2");
dt.Columns.Add("a3");
dt.Columns.Add("num", Type.GetType("System.Int32"));
dt.Rows.Add(new object[] { "1", "0", "我的文件夹", 2 });
dt.Rows.Add(new object[] { "2", "0", "工作文件夹", 1 });
dt.Rows.Add(new object[] { "3", "1", "图片", 1 });
dt.Rows.Add(new object[] { "4", "1", "文档", 2 });
dt.Rows.Add(new object[] { "5", "3", "风景", 2 });
dt.Rows.Add(new object[] { "6", "3", "人物", 1 });
dt.Rows.Add(new object[] { "7", "2", "报告", 1 });
dt.Rows.Add(new object[] { "8", "3", "写真", 3 });
bindData("0", TreeView1.Nodes);
}
}
private void bindData(string parentid,TreeNodeCollection tnc)
{
DataRow[] ary_row = dt.Select("a2=" + parentid, "num");
int i = 0;
foreach (DataRow item in ary_row)
{
TreeNode node = new TreeNode();
node.Text = item["a3"].ToString();
node.Value = item["a1"].ToString();
node.Expanded = true;
tnc.Add(node);
bindData(item["a1"].ToString(), tnc[i].ChildNodes);
i++;
}
}
关于级联选择,我正好做了一个,当然,我只是改写了webabcd大虾的SmartTree代码,他的代码不支持动态加载及在updatepanel中使用,我稍改了下,在我项目中正常,但未大量测试,特别是未在动态加载中测试过
使用方法,在aspx页面中加入下面的javascript,不需要任何修改(或许不合适FireFox)。然后设置<asp:treeview onclick="CascadeCheckmarks();">
function CascadeCheckmarks()
{
// obj gives us the node on which check or uncheck operation has performed
var evt =window.event; // FF || IE
var element = evt.srcElement || evt.target;
//checking whether obj consists of checkbox to avoid exception
if (isCheckBox(element))
{
yy_stv_foreachChildCheckbox(element);
yy_stv_foreachParentCheckbox(element);
}
}
function isCheckBox(obj)
{
if (obj==null)
return false;
return (obj.tagName == 'INPUT' && obj.type == 'checkbox');
}
function yy_stv_checkParentCheckbox(table, checked)
{
/// <summary>设置父复选框的状态</summary>
var nodes = table.parentNode.parentNode.childNodes;
for (var i=1; i<nodes.length; i++)
{
if (nodes[i] == table.parentNode)
{
if (typeof(nodes[i-1]) == 'undefined' || typeof(nodes[i-1].rows) == 'undefined') return;
for (var x=0; x < nodes[i-1].rows.length; x++)
{
for (var j=0; j < nodes[i-1].rows[x].cells.length; j++)
{
// debugger;
var chk = nodes[i-1].rows[x].cells[j].childNodes[0];
if (typeof(chk) != 'undefined' && chk.tagName == "INPUT" && chk.type == "checkbox")
{
chk.checked = checked;
yy_stv_foreachParentCheckbox(nodes[i-1]);
return;
}
}
}
}
}
}
function yy_stv_foreachChildCheckbox(obj)
{
/// <summary>单击父复选框时,设置其子复选框的选中状态</summary>
var checked;
if (obj.tagName == "INPUT" && obj.type == "checkbox")
{
checked = obj.checked;
do
{
obj = obj.parentNode;
}
while (obj.tagName != "TABLE")
}
var nodes = obj.parentNode.childNodes;
for (var i=0; i<nodes.length - 1; i++)
{
if (nodes[i] == obj && nodes[i + 1].tagName == "DIV")
{
var elements = nodes[i+1].getElementsByTagName("INPUT");
for (j=0; j< elements.length; j++)
{
if (elements[j].type == 'checkbox')
{
elements[j].checked = checked;
}
}
}
}
}
function yy_stv_foreachParentCheckbox(obj)
{
/// <summary>单击某一复选框时,设置其父复选框的选中状态</summary>
var checkedNum = 0;
var uncheckedNum = 0;
if (obj.tagName == "INPUT" && obj.type == "checkbox")
{
do
{
obj = obj.parentNode;
}
while (obj.tagName != "TABLE")
}
var tables = obj.parentNode.getElementsByTagName("TABLE");
if (typeof(tables) == 'undefined') return;
for (var i=0; i < tables.length; i++)
{
for (var x=0; x < tables[i].rows.length; x++)
{
for (var j=0; j < tables[i].rows[x].cells.length; j++)
{
var chk = tables[i].rows[x].cells[j].childNodes[0];
if (typeof(chk) != 'undefined' && chk.tagName == "INPUT" && chk.type == "checkbox")
{
if (chk.checked)
checkedNum ++;
else
uncheckedNum ++;
}
}
}
}
if (uncheckedNum == 0)
{
yy_stv_checkParentCheckbox(obj, true);
}
else
{
yy_stv_checkParentCheckbox(obj, false);
}
}
补充:.NET技术 , ASP.NET