实例介绍
【实例简介】我在之前很多文章里面,介绍过Winform主界面的开发,基本上都是标准的界面,在顶部放置工具栏,中间区域则放置多文档的内容,但是在顶部菜单比较多的时候,就需要把菜单分为几级处理,如可以在顶部菜单放置一二级菜单,这种方式在一般功能点不算太多的情况下,呈现的界面效果较为直观、也较为美观。不过随着一些系统功能的增多,这种方式可能就会显得工具栏比较拥挤,那么我们是否可以在左侧放置一个树形列表,这样通过树形列表的收缩折叠,就可以放置非常多的菜单功能了。
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace TreeViewLearn
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnAddTotal_Click(object sender, EventArgs e)
{
if(string.IsNullOrEmpty(textBox1.Text.Trim()))
{
MessageBox.Show("请填写要添加的节点名称!");
return;
}
string sql = "insert into TreeTest(nodeName,parentId) output inserted.id values" "(" " " "'" textBox1.Text.Trim() "'" "," "'" 0 "'" ")";
int id = (int)sqlHelper.ExecuteScalar(sql);
TreeNode node1 = new TreeNode();
node1.Tag = id;
node1.Text = textBox1.Text.Trim();
treeView1.Nodes.Add(node1);
textBox1.Text = "";
}
private void btnAddChild_Click(object sender, EventArgs e)
{
int id;
if(string.IsNullOrEmpty(textBox1.Text.Trim()))
{
return;
}
if(treeView1.SelectedNode==null)
{
MessageBox.Show("请选择父节点");
return;
}
id =(int)treeView1.SelectedNode.Tag;
string sql = "insert into TreeTest(nodeName,parentId) output inserted.id values" "(" " " "'" textBox1.Text.Trim() "'" "," "'" id "'" ")";
int id1 = (int)sqlHelper.ExecuteScalar(sql);
TreeNode node1 = new TreeNode();
node1.Tag = id1;
node1.Text = textBox1.Text.Trim();
treeView1.SelectedNode.Nodes.Add(node1);
textBox1.Text = "";
}
private void treeView1_Leave(object sender, EventArgs e)
{
//失去焦点事件
//treeView1.SelectedNode.BackColor = Color.Blue;
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
textBox1.Text = treeView1.SelectedNode.Name;
}
private void Form1_Load(object sender, EventArgs e)
{
setTreeView(treeView1, 0);
}
private void button1_Click(object sender, EventArgs e)
{
Form2 fr = new Form2();
fr.ShowDialog();
}
private void button2_Click(object sender, EventArgs e)
{
SqlConnection connec = sqlHelper.getcon();
if(connec.State==ConnectionState.Open)
{
MessageBox.Show(connec.State.ToString());
MessageBox.Show("成功连接数据库");
}
}
//调用的时候parentId以0值开始 setTreeView(treeView1, 0);
private void setTreeView(TreeView tr1,int parentId)
{
string sql = "select * from TreeTest where parentId=" parentId;
DataTable ds= sqlHelper.ExecuteDataTable(sql);
if (ds.Rows.Count > 0)
{
int pId = -1;
foreach (DataRow row in ds.Rows)
{
TreeNode node = new TreeNode();
node.Text = row["nodeName"].ToString();
node.Tag = (int)row["id"];
pId = (int)row["parentId"];
if (pId == 0)
{
//添加根节点
tr1.Nodes.Add(node);
}
else
{
//添加根节点之外的其他节点
RefreshChildNode(tr1,node,pId);
}
//查找以node为父节点的子节点
setTreeView(tr1,(int)node.Tag);
}
}
}
//处理根节点的子节点
private void RefreshChildNode(TreeView tr1,TreeNode treeNode, int parentId)
{
foreach (TreeNode node in tr1.Nodes)
{
if((int)node.Tag==parentId)
{
node.Nodes.Add(treeNode);
return;
}else if (node.Nodes.Count > 0)
{
FindChildNode(node, treeNode, parentId);
}
}
}
//处理根节点的子节点的子节点
private void FindChildNode(TreeNode tNode,TreeNode treeNode, int parentId)
{
foreach (TreeNode node in tNode.Nodes)
{
if ((int)node.Tag == parentId)
{
node.Nodes.Add(treeNode);
return;
}else if (node.Nodes.Count > 0)
{
FindChildNode(node,treeNode,parentId);
}
}
}
private void btnDelete_Click(object sender, EventArgs e)
{
if(treeView1.SelectedNode==null)
{
MessageBox.Show("请选择要删除的节点!");
return;
}
//选中节点的主键id,也是其子节点的parentId
int id = (int)treeView1.SelectedNode.Tag;
nodeDelete(id);
treeView1.SelectedNode.Remove();
}
//数据表中的数据的递归删除方法
public void nodeDelete(int id)
{
string sql = "select * from TreeTest where parentId=" id;
DataTable ds = sqlHelper.ExecuteDataTable(sql);
if (ds.Rows.Count > 0)
{
//有子节点
foreach(DataRow row in ds.Rows)
{
//先删除父节点
string delete = "delete from TreeTest where id=" id;
int k = sqlHelper.ExecuteNonQuery(delete);
//查找子节点,删除
int id1 = (int)row["id"];
nodeDelete(id1);
}
}
else
{
//没有子节点
string delete = "delete from TreeTest where id=" id;
int k = sqlHelper.ExecuteNonQuery(delete);
}
}
private void button3_Click(object sender, EventArgs e)
{
treeView1.SelectedNode.Remove();
}
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if(e.Action!=TreeViewAction.Unknown)
{
if(e.Node.Checked)
{
}
}
}
}
}
标签: TreeView
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)