生成树形控件并实现节点状态的变化,这些方法是先在winform中的实现的,后用asp.net改写了,差距只是几个属性的名字有改动而已。详细解释代码中都已列出。
#region TreeView 树形控件
/// <summary>
/// 用于把所有的节点信息从数据库提取出来,然后添加到窗体的树形控件中
/// </summary>
private void InitTreeView()
{
//获得数据库里面的所有节点信息
string sql = @"select TransportID,TransportType,SMS_ParentNode from M_SMS_TransportType";
DataSet ds = GetData(sql);
DataTable dt = ds.Tables[0];
//提取所有的根节点 (提取条件为:SMS_ParentNode为0的记录)
var parents = from p in dt.AsEnumerable()//查找第一层节点即所有父节点
where p.Field<int>("SMS_ParentNode") == 0
orderby p.Field<int>("TransportID")
select p;
//遍历每个根节点
//遍历过程中将每一个根节点的子节点加到根节点的Nodes属性中
//最后将根节点加入到TreeView控件中)
//
foreach (var parent in parents)
{
//创建一个根节点
TreeNode parentNode = new TreeNode();
//提取根节点的所有子节点,提取条件:根节点所代表的记录的Id(TransportID)等于子节点所代表的记录的父ID(SMS_ParentNode)
var child = from c in dt.AsEnumerable()
where c.Field<int>("SMS_ParentNode") == parent.Field<int>("TransportID")//通过子节点的父节点Id等于父节点ID查找子节点
orderby c.Field<int>("TransportID")
select c;
//遍历当前根节点的子节点,并且每遍历一次,就生成一个子节点,并将子节点添加到父节点的Nodes属性中
foreach (var children in child)
{
//创建一个子节点
TreeNode childrenNode = new TreeNode();
childrenNode.Text = children.Field<string>("TransportType");
childrenNode.ToolTip = children.Field<int>("TransportID").ToString();
//将子节点添加到父节点中
parentNode.ChildNodes.Add(childrenNode);//添加子节点
}
parentNode.Text = parent.Field<string>("TransportType");
parentNode.ToolTip = parent.Field<int>("TransportID").ToString();
//将父节点添加到TreeView控件中
this.TreeView1.Nodes.Add(parentNode);
}
}
#region 节点状态变化功能
/// <summary>
/// 节点选中状态更改后触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
//如果一个节点被勾选
if (e.Node.Checked == true)
{
//将该节点的所有直接子节点以及间接子节点都勾选上
SetChildNodesCheckedOrUnChecked(e.Node, true);
//将该节点的直接父节点以及间接父节点都勾选上
SetParentNodesChecked(e.Node);
}
else//如果一个节点被取消勾选
{
//将该节点的所有直接子节点以及间接子节点都取消勾选
SetChildNodesCheckedOrUnChecked(e.Node, false);
//设置该节点的直接父节点以及间接父节点的状态(父节点的状态可能被取消勾选,也不可能被取消)
SetParentNodesUnChecked(e.Node);
}
}
/// <summary>
/// 用于设置当前所选节点的子节点的状态
/// 如果当前所选的节点是勾选状态,那么它的所有子节点都被勾选上
/// 如果当前所选的节点是不勾选状态,那么它的所有子节点都不被勾选上
/// </summary>
/// <param name="node">当前所选节点</param>
/// <param name="state">当前所选节点的状态:true或false</param>
private void SetChildNodesCheckedOrUnChecked(TreeNode node, bool state)
{
if (node.ChildNodes.Count > 0)
{
TreeNodeCollection childNodes = node.ChildNodes;
foreach (TreeNode child in childNodes)
{
child.Checked = state;
SetChildNodesCheckedOrUnChecked(child, state);
}
}
}
/// <summary>
/// 将当前被勾选上的节点的直接父节点以及间接父节点勾选上
/// </summary>
/// <param name="node">当前被勾选的节点</param>
private void SetParentNodesChecked(TreeNode node)
{
TreeNode parent = node.Parent;
if (parent != null)
{
parent.Checked = true;
SetParentNodesChecked(node.Parent);
}
}
/// <summary>
/// 设置当前取消勾选的节点的直接父节点以及间接父节点的状态
/// </summary>
/// <param name="node">当前被取消勾选的节点</param>
private void SetParentNodesUnChecked(TreeNode node)
{
TreeNode parent = node.Parent;
if (parent != null)
{
parent.Checked = false;
TreeNodeCollection childNodesOfParent = node.Parent.ChildNodes;
foreach (TreeNode childNodeOfParent in childNodesOfParent)
{
if (childNodeOfParent.Checked == true)
{
parent.Checked = true;
break;
}
}
SetParentNodesUnChecked(node.Parent);
}
}
/// <summary>
/// 设置用户对应的节点
/// </summary>
private void GetUserNodes()
{
//获取当前选择用户的UerID
string name = GridView1.SelectedRow.Cells[0].Text;
string phone = GridView1.SelectedRow.Cells[1].Text;
string sql = @"SELECT UserID FROM M_SMS_CatConfiguration
WHERE SMS_UserName='" + name + "' AND SMS_Del='" + phone + "'";
DataSet ds = GetData(sql);
string userId = ds.Tables[0].Rows[0]["UserID"].ToString();
//根据用户的UserID获取节点信息
string sql1 = @"SELECT UT.UserID,UT.TransportID,TransportType
FROM UserIDTransportID UT left join M_SMS_TransportType T ON UT.TransportID =T.TransportID
WHERE UT.UserID='" + userId + "'";
DataSet ds1 = GetData(sql1);
//遍历节点信息表的所有行
foreach (DataRow row in ds1.Tables[0].Rows)
{
//获取当前行的节点信息名称
string nodeTest = row["TransportType"].ToString();
//设置当前用户对应节点状态
SetUserNodesChecked(nodeTest, TreeView1.Nodes);
}
}
/// <summary>
/// 设置用户对应的节点
/// </summary>
private void SetUserNodesChecked(string nodeTest, TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
if (nodeTest.Trim() == node.Text.Trim().ToString())
{
node.Checked = true;
//将该节点的所有直接子节点以及间接子节点都勾选上
SetChildNodesCheckedOrUnChecked(node, true);
//将该节点的直接父节点以及间接父节点都勾选上
SetParentNodesChecked(node);
}
SetUserNodesChecked(nodeTest, node.ChildNodes);
}
}
#endregion
/// <summary>
/// 从当前窗口获得用户的节点信息,添加到集合中
/// </summary>
private void GetNodeFromPage(List<int> lstNodeOfTree, TreeNodeCollection nodes)
{
///遍历节点集合
foreach (TreeNode node in nodes)
{
//如果节点存在子节点,递归调用
if (node.ChildNodes.Count > 0)
{
GetNodeFromPage(lstNodeOfTree, node.ChildNodes);
}
else//该节点若无子节点,判断是否为选中状态
{
if (node.Checked == true)
{
lstNodeOfTree.Add(int.Parse(node.ToolTip));
}
}
}
}
/// <summary>
/// 保存当前用户节点信息
/// </summary>
/// <param name="userId"></param>
private void SaveTreeNode(string name, string phone)
{
//根据用户的名字和手机号获取用户ID
string sqlSelect = @"SELECT UserID FROM M_SMS_CatConfiguration WHERE SMS_UserName='" + name + "' AND SMS_Del='" + phone + "'";
DataSet ds = GetData(sqlSelect);
string userId = ds.Tables[0].Rows[0]["UserID"].ToString().Trim();
//获取设置的节点信息
List<int> lstNodeOfTree = new List<int>();
GetNodeFromPage(lstNodeOfTree, this.TreeView1.Nodes);
//删除数据库中现有的存储的节点信息
string sqlDelete = @"DELETE FROM UserIDTransportID WHERE UserID='" + userId + "'";
UpdateData(sqlDelete);
//重新在数据库中添加节点信息
foreach (int Id in lstNodeOfTree)
{
string sql = @"INSERT INTO UserIDTransportID(UserID,TransportID) VALUES('" + userId + "' ,'" + Id + "')";
UpdateData(sql);
}
}
/// <summary>
/// 把树形控件中的所有复选框置为不勾选
/// </summary>
/// <param name="tnc">树形控件的直接子节点集合或者某个节点的所有子节点</param>
private void ClearTreeNodeChecked(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
node.Checked = false;
//递归调用
ClearTreeNodeChecked(node.ChildNodes);
}
}
















