要求:
1.点击子级,父节点不被选中。
2.点击父节点,子节点全部选中
3.点击文字时效果要与点击CheckBox一样.(说明,点击一次文字选中复选框,下面的所有自己的复选框都被选中。再点则取消选中!)
这是我自己写的
Demo1:(问题,只能通过选中复选框来实现效果,而且不支持火狐)

Page:
<asp:TreeView ID="TreeV2" runat="server" ShowLines="True" OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged">
</asp:TreeView>
Page JS:
// 点击复选框时触发事件
function postBackByObject() {
var o = window.event.srcElement;
if ((o.tagName == "INPUT" && o.type == "checkbox") || o.tagName == "A") {
//这里的第一个参数是UpdatePanel ID,因为我使用了MS的ASPAJAX来实现局部刷新
//如果没有使用MS的ASPAJAX,这里的两个参数都可以为空
__doPostBack("", "");
}
}
Code:
//号码簿
private void BindWEmail()
{
TreeV2.Nodes.Clear();
string sql = "select * from SMS_NumberGroup where 1=1";//查询组
if (ht["Detail"] == null)
sql += " and (Levels=1 or (Levels=0 and UIDS like '%," + UserInfo.UserId + ",%'))";
DataTable dt = Iwoak.ExecSQL.ExecuteDataTable(sql);
BindTree(dt, 0, null, TreeV2);
TreeV2.ShowCheckBoxes = TreeNodeTypes.All;//
TreeV2.Attributes.Add("onclick", "postBackByObject()");
//TreeV2.Attributes.Add("onclick", "OnTreeNodeChecked(event);");
}
/// <summary>
/// 绑定Tree
/// </summary>
/// <param name="dt">数据集</param>
/// <param name="parentId">链接ID</param>
/// <param name="pNode">操作节点</param>
/// <param name="tv"></param>
private void BindTree(DataTable dt, int parentId, TreeNode pNode, TreeView tv)
{
DataView dv = new DataView(dt);
dv.RowFilter = "[mid]=" + parentId;
foreach (DataRowView drv in dv)
{
TreeNode tNode = new TreeNode();
tNode.ShowCheckBox = true;
string ID = drv["ID"].ToString();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendFormat(" <span title='{0}'>" + drv["SName"].ToString() + "</span> ", drv["Remark"]);
tNode.Text = sb.ToString();
tNode.Value = ID;
DataTable dtf = Iwoak.ExecSQL.ExecuteDataTable("select * from [SMS_Number] where nid=" + ID + GetQueryW());
if (pNode == null)
{
#region 联系人
for (int i = 0; i < dtf.Rows.Count; i++)
{
DataRow dr = dtf.Rows[i];
TreeNode p2 = new TreeNode();
p2.ShowCheckBox = true;
p2.Text = string.Format("<a href=\"javascript:void();\" title='{2}'>{1} {0}</a>", dr["Phone"], dr["Contact"], dr["Remark"]);
p2.Value = dr["Phone"].ToString();
tNode.ChildNodes.Add(p2);
}
#endregion
tv.Nodes.Add(tNode);
tNode.Expanded = true;
BindTree(dt, Convert.ToInt32(drv["ID"]), tNode, tv);
}
else
{
pNode.ChildNodes.Add(tNode);
tNode.Expanded = true;
BindTree(dt, Convert.ToInt32(drv["ID"]), tNode, tv);
#region 联系人
for (int i = 0; i < dtf.Rows.Count; i++)
{
DataRow dr = dtf.Rows[i];
TreeNode p2 = new TreeNode();
//p2.ShowCheckBox = true;
p2.Text = string.Format("<a href=\"javascript:void());\" title='{2}'>{1} {0}</a>", dr["Phone"], dr["Contact"], dr["Remark"]);
p2.Value = dr["Phone"].ToString();
tNode.ChildNodes.Add(p2);
}
#endregion
}
}
}
<asp:TreeView ID="TreeV2" runat="server" ShowLines="True" OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged">
</asp:TreeView>
Page JS:
// 点击复选框时触发事件
function postBackByObject() {
var o = window.event.srcElement;
if ((o.tagName == "INPUT" && o.type == "checkbox") || o.tagName == "A") {
//这里的第一个参数是UpdatePanel ID,因为我使用了MS的ASPAJAX来实现局部刷新
//如果没有使用MS的ASPAJAX,这里的两个参数都可以为空
__doPostBack("", "");
}
}
Code:
//号码簿
private void BindWEmail()
{
TreeV2.Nodes.Clear();
string sql = "select * from SMS_NumberGroup where 1=1";//查询组
if (ht["Detail"] == null)
sql += " and (Levels=1 or (Levels=0 and UIDS like '%," + UserInfo.UserId + ",%'))";
DataTable dt = Iwoak.ExecSQL.ExecuteDataTable(sql);
BindTree(dt, 0, null, TreeV2);
TreeV2.ShowCheckBoxes = TreeNodeTypes.All;//
TreeV2.Attributes.Add("onclick", "postBackByObject()");
//TreeV2.Attributes.Add("onclick", "OnTreeNodeChecked(event);");
}
/// <summary>
/// 绑定Tree
/// </summary>
/// <param name="dt">数据集</param>
/// <param name="parentId">链接ID</param>
/// <param name="pNode">操作节点</param>
/// <param name="tv"></param>
private void BindTree(DataTable dt, int parentId, TreeNode pNode, TreeView tv)
{
DataView dv = new DataView(dt);
dv.RowFilter = "[mid]=" + parentId;
foreach (DataRowView drv in dv)
{
TreeNode tNode = new TreeNode();
tNode.ShowCheckBox = true;
string ID = drv["ID"].ToString();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendFormat(" <span title='{0}'>" + drv["SName"].ToString() + "</span> ", drv["Remark"]);
tNode.Text = sb.ToString();
tNode.Value = ID;
DataTable dtf = Iwoak.ExecSQL.ExecuteDataTable("select * from [SMS_Number] where nid=" + ID + GetQueryW());
if (pNode == null)
{
#region 联系人
for (int i = 0; i < dtf.Rows.Count; i++)
{
DataRow dr = dtf.Rows[i];
TreeNode p2 = new TreeNode();
p2.ShowCheckBox = true;
p2.Text = string.Format("<a href=\"javascript:void();\" title='{2}'>{1} {0}</a>", dr["Phone"], dr["Contact"], dr["Remark"]);
p2.Value = dr["Phone"].ToString();
tNode.ChildNodes.Add(p2);
}
#endregion
tv.Nodes.Add(tNode);
tNode.Expanded = true;
BindTree(dt, Convert.ToInt32(drv["ID"]), tNode, tv);
}
else
{
pNode.ChildNodes.Add(tNode);
tNode.Expanded = true;
BindTree(dt, Convert.ToInt32(drv["ID"]), tNode, tv);
#region 联系人
for (int i = 0; i < dtf.Rows.Count; i++)
{
DataRow dr = dtf.Rows[i];
TreeNode p2 = new TreeNode();
//p2.ShowCheckBox = true;
p2.Text = string.Format("<a href=\"javascript:void());\" title='{2}'>{1} {0}</a>", dr["Phone"], dr["Contact"], dr["Remark"]);
p2.Value = dr["Phone"].ToString();
tNode.ChildNodes.Add(p2);
}
#endregion
}
}
}
Demo2:(问题,点击文字时,自身的复选框选中,但子级没有选中,支持火狐)

Page:
<asp:TreeView ID="tvDept" runat="server" AllowCascadeCheckbox="True" CssClass="treelink"
OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged" CollapseImageUrl="~/CommonFiles/imgs/SystemImg/file.gif"
ExpandImageUrl="~/CommonFiles/imgs/SystemImg/folder.gif">
<SelectedNodeStyle CssClass="treelink" />
<NodeStyle CssClass="treelink" />
</asp:TreeView>
Page JS:
<script type="text/javascript">
// $(function() {
// parent.ymPrompt.max();
// });
// 点击复选框时触发事件
function postBackByObject() {
var o = window.event.srcElement;
if ((o.tagName == "INPUT" && o.type == "checkbox") || o.tagName == "A") {
//这里的第一个参数是UpdatePanel ID,因为我使用了MS的ASPAJAX来实现局部刷新
//如果没有使用MS的ASPAJAX,这里的两个参数都可以为空
__doPostBack("", "");
}
}
function OnTreeNodeChecked(e) //单击父节点子结点选中的代码
{
if (window.event) e = window.event;
var evt = e.srcElement ? e.srcElement : e.target;
if (evt.type != undefined || evt.tagName != undefined) {
if (evt.type == 'checkbox') {
var childrenDivID = evt.id.replace('CheckBox', 'Nodes');
var div = document.getElementById(childrenDivID);
if (div == null) return;
var checkBoxs = div.getElementsByTagName('INPUT');
for (var i = 0; i < checkBoxs.length; i++) {
if (checkBoxs[i].type == 'checkbox')
checkBoxs[i].checked = evt.checked;
}
}
else if (evt.tagName == "A") {
if (evt.previousSibling && evt.previousSibling.tagName == "INPUT" && evt.previousSibling.type == "checkbox") {
// evt.previousSibling.checked = true;
evt.previousSibling.checked = evt.previousSibling.checked ? false : true;
}
if (window.event) {
window.event.cancelBubble = true;
window.event.returnValue = false;
}
else {
e.stopPropagation();
}
}
}
}
</script>
Code:
#region 页面加载时执行
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Common_BindTree(rule.GetDept(), 0, (TreeNode)null, this.tvDept);
tvDept.ShowCheckBoxes = TreeNodeTypes.All;//
tvDept.Attributes.Add("onclick", "OnTreeNodeChecked(event);");
}
}
#endregion
//初始化部门
public void Common_BindTree(DataSet ds, int parentId, TreeNode pNode, TreeView tv)
{
DataView dv = new DataView(ds.Tables[0]);
dv.RowFilter = "[CID]=" + parentId;
foreach (DataRowView drv in dv)
{
TreeNode tNode = new TreeNode();
tNode.Text = drv["Name"].ToString();
tNode.ShowCheckBox = true;
tNode.NavigateUrl = "#";
tNode.Value = drv["ID"].ToString();
if (ViewState["Selected"] != null)
{
DataTable dt = (DataTable)ViewState["Selected"];
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i]["DeptID"].ToString() == tNode.Value)
{
tNode.Checked = true;
}
}
}
//添加该节点下的所有用户
Iw_UsersRule rule = new Iw_UsersRule();
DataSet UsersDs = rule.GetUsers(tNode.Value);
if (UsersDs.Tables[0].Rows.Count > 0)
{
for (int k = 0; k < UsersDs.Tables[0].Rows.Count; k++)
{
string UserID = UsersDs.Tables[0].Rows[k]["ID"].ToString();
string UserName = UsersDs.Tables[0].Rows[k]["UserName"].ToString();
TreeNode NodeUser = new TreeNode();
NodeUser.Text = UserName;
NodeUser.Value = "User_" + UsersDs.Tables[0].Rows[k]["ID"].ToString();
NodeUser.ImageUrl = "~/CommonFiles/imgs/MenuImages/employee.gif";
NodeUser.ShowCheckBox = true;
if (Request.QueryString["ChooseUserID"] != null && Request.QueryString["ChooseUserID"] != "")//再次选择时显示上次已选中的项
{
string[] ChooseDeptID = Request.QueryString["ChooseUserID"].Split(',');
for (int j = 0; j < ChooseDeptID.Length; j++)
{
if (UserID == ChooseDeptID[j].ToString())
NodeUser.Checked = true;
}
}
tNode.ChildNodes.Add(NodeUser);
}
}
//父节点
if (pNode == null)
{
tv.Nodes.Add(tNode);
tNode.Expanded = true;
Common_BindTree(ds, Convert.ToInt32(drv["ID"]), tNode, tv);
}
else
{
pNode.ChildNodes.Add(tNode);
Common_BindTree(ds, Convert.ToInt32(drv["ID"]), tNode, tv);
}
}
}
<asp:TreeView ID="tvDept" runat="server" AllowCascadeCheckbox="True" CssClass="treelink"
OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged" CollapseImageUrl="~/CommonFiles/imgs/SystemImg/file.gif"
ExpandImageUrl="~/CommonFiles/imgs/SystemImg/folder.gif">
<SelectedNodeStyle CssClass="treelink" />
<NodeStyle CssClass="treelink" />
</asp:TreeView>
Page JS:
<script type="text/javascript">
// $(function() {
// parent.ymPrompt.max();
// });
// 点击复选框时触发事件
function postBackByObject() {
var o = window.event.srcElement;
if ((o.tagName == "INPUT" && o.type == "checkbox") || o.tagName == "A") {
//这里的第一个参数是UpdatePanel ID,因为我使用了MS的ASPAJAX来实现局部刷新
//如果没有使用MS的ASPAJAX,这里的两个参数都可以为空
__doPostBack("", "");
}
}
function OnTreeNodeChecked(e) //单击父节点子结点选中的代码
{
if (window.event) e = window.event;
var evt = e.srcElement ? e.srcElement : e.target;
if (evt.type != undefined || evt.tagName != undefined) {
if (evt.type == 'checkbox') {
var childrenDivID = evt.id.replace('CheckBox', 'Nodes');
var div = document.getElementById(childrenDivID);
if (div == null) return;
var checkBoxs = div.getElementsByTagName('INPUT');
for (var i = 0; i < checkBoxs.length; i++) {
if (checkBoxs[i].type == 'checkbox')
checkBoxs[i].checked = evt.checked;
}
}
else if (evt.tagName == "A") {
if (evt.previousSibling && evt.previousSibling.tagName == "INPUT" && evt.previousSibling.type == "checkbox") {
// evt.previousSibling.checked = true;
evt.previousSibling.checked = evt.previousSibling.checked ? false : true;
}
if (window.event) {
window.event.cancelBubble = true;
window.event.returnValue = false;
}
else {
e.stopPropagation();
}
}
}
}
</script>
Code:
#region 页面加载时执行
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Common_BindTree(rule.GetDept(), 0, (TreeNode)null, this.tvDept);
tvDept.ShowCheckBoxes = TreeNodeTypes.All;//
tvDept.Attributes.Add("onclick", "OnTreeNodeChecked(event);");
}
}
#endregion
//初始化部门
public void Common_BindTree(DataSet ds, int parentId, TreeNode pNode, TreeView tv)
{
DataView dv = new DataView(ds.Tables[0]);
dv.RowFilter = "[CID]=" + parentId;
foreach (DataRowView drv in dv)
{
TreeNode tNode = new TreeNode();
tNode.Text = drv["Name"].ToString();
tNode.ShowCheckBox = true;
tNode.NavigateUrl = "#";
tNode.Value = drv["ID"].ToString();
if (ViewState["Selected"] != null)
{
DataTable dt = (DataTable)ViewState["Selected"];
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i]["DeptID"].ToString() == tNode.Value)
{
tNode.Checked = true;
}
}
}
//添加该节点下的所有用户
Iw_UsersRule rule = new Iw_UsersRule();
DataSet UsersDs = rule.GetUsers(tNode.Value);
if (UsersDs.Tables[0].Rows.Count > 0)
{
for (int k = 0; k < UsersDs.Tables[0].Rows.Count; k++)
{
string UserID = UsersDs.Tables[0].Rows[k]["ID"].ToString();
string UserName = UsersDs.Tables[0].Rows[k]["UserName"].ToString();
TreeNode NodeUser = new TreeNode();
NodeUser.Text = UserName;
NodeUser.Value = "User_" + UsersDs.Tables[0].Rows[k]["ID"].ToString();
NodeUser.ImageUrl = "~/CommonFiles/imgs/MenuImages/employee.gif";
NodeUser.ShowCheckBox = true;
if (Request.QueryString["ChooseUserID"] != null && Request.QueryString["ChooseUserID"] != "")//再次选择时显示上次已选中的项
{
string[] ChooseDeptID = Request.QueryString["ChooseUserID"].Split(',');
for (int j = 0; j < ChooseDeptID.Length; j++)
{
if (UserID == ChooseDeptID[j].ToString())
NodeUser.Checked = true;
}
}
tNode.ChildNodes.Add(NodeUser);
}
}
//父节点
if (pNode == null)
{
tv.Nodes.Add(tNode);
tNode.Expanded = true;
Common_BindTree(ds, Convert.ToInt32(drv["ID"]), tNode, tv);
}
else
{
pNode.ChildNodes.Add(tNode);
Common_BindTree(ds, Convert.ToInt32(drv["ID"]), tNode, tv);
}
}
}