TreeView 树节点的处理
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using WinForm_CRUD.BLL; 11 using WinForm_CRUD.Model; 12 13 namespace WinForm_TestTree 14 { 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 22 MyORM_BLL myORM_BLL = new MyORM_BLL(); 23 24 /// <summary> 25 /// import Area 26 /// </summary> 27 /// <param name="sender"></param> 28 /// <param name="e"></param> 29 private void btnImportArea_Click(object sender, EventArgs e) 30 { 31 32 } 33 34 /// <summary> 35 /// 窗口加载时 省市联动 36 /// </summary> 37 /// <param name="sender"></param> 38 /// <param name="e"></param> 39 private void Form1_Load(object sender, EventArgs e) 40 { 41 LoadAlllNodes(); 42 } 43 44 /// <summary> 45 /// 加载所有节点 46 /// </summary> 47 private void LoadAlllNodes() 48 { 49 treeView1.Nodes.Clear(); 50 //根据PID=0查询省 51 List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=0"); 52 //for 遍历省 53 foreach (Object obj in list) 54 { 55 T_AREA area = (T_AREA)obj; 56 TreeNode nodePro = new TreeNode(area.NAME); 57 nodePro.Tag = area.ID; 58 //根据省ID 即PID查询市 遍历市 把市节点加入省(即需要省ID 和省节点递归) 59 RecursionCity(nodePro, area); 60 //把省节点加入treeview 61 treeView1.Nodes.Add(nodePro); 62 } 63 } 64 65 /// <summary> 66 /// 递归加载市和县 67 /// </summary> 68 /// <param name="node">上一级节点,比如省节点</param> 69 /// <param name="area">上一级对象,比如省,提供下一级的PID</param> 70 private void RecursionCity(TreeNode node, T_AREA area) 71 { 72 List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=" + area.ID); 73 foreach(Object obj in list) 74 { 75 T_AREA areaCity = (T_AREA)obj; 76 TreeNode nodeCity = new TreeNode(areaCity.NAME); 77 nodeCity.Tag = areaCity.ID; 78 RecursionCity(nodeCity, areaCity); //再次递归获得县节点 79 node.Nodes.Add(nodeCity); 80 } 81 } 82 83 /// <summary> 84 /// 删除节点 85 /// </summary> 86 /// <param name="sender"></param> 87 /// <param name="e"></param> 88 private void btnDeleteNode_Click(object sender, EventArgs e) 89 { 90 //判断是否选中 91 if (treeView1.SelectedNode == null) 92 { 93 MessageBox.Show("请先选中要删除的节点"); 94 return; 95 } 96 string name = treeView1.SelectedNode.Text; 97 int id = (Int32)treeView1.SelectedNode.Tag; 98 //提示是否删除 99 if(MessageBox.Show("您确定要删除节点"+name+"吗?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning)!=DialogResult.OK) 100 { 101 return; 102 } 103 //根据ID删除 递归 104 //在根据ID删除省之前,先要删除省下面所有的市,删除每个市之前,先要删除市下面所有的县 105 RecursionDeleteCity(id); 106 myORM_BLL.DeleteModelById(typeof(T_AREA), id); 107 //重新加载数据 108 MessageBox.Show("删除成功"); 109 LoadAlllNodes(); 110 } 111 112 /// <summary> 113 /// 根据省ID删除下面的所有市,递归 根据市ID删除下面的所有县 114 /// </summary> 115 /// <param name="id"></param> 116 private void RecursionDeleteCity(int id) 117 { 118 //根据省ID查询所有市 119 List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=" + id); 120 //for市 121 foreach(Object obj in list) 122 { 123 T_AREA areaCity = (T_AREA)obj; 124 //根据市ID删除之前,先删除市下面的所有的县 125 RecursionDeleteCity(areaCity.ID); 126 myORM_BLL.DeleteModelById(typeof(T_AREA), areaCity.ID); 127 } 128 } 129 130 /// <summary> 131 /// 双击事件 进行编辑 132 /// </summary> 133 /// <param name="sender"></param> 134 /// <param name="e"></param> 135 private void treeView1_DoubleClick(object sender, EventArgs e) 136 { 137 //是否选中 138 if (treeView1.SelectedNode == null) 139 { 140 MessageBox.Show("请先选中要编辑的节点"); 141 return; 142 } 143 //获得选中的节点 144 TreeNode node = treeView1.SelectedNode; 145 //设置节点为可编辑状态 146 node.BeginEdit(); 147 //获得改变的文本 148 T_AREA area=new T_AREA(); 149 area.NAME = node.Text.Trim(); 150 area.ID = (Int32)node.Tag; 151 area.PID = node.Parent==null?0:(Int32)node.Parent.Tag; //父节点pid 152 //根据节点ID更新 153 bool flag = myORM_BLL.UpdateModel(area); 154 string msg = flag ? "更新成功" : "更新失败"; 155 MessageBox.Show(msg); 156 //刷新 157 LoadAlllNodes(); 158 } 159 160 private event EventHandler _evt; 161 private MyEventArg mea = new MyEventArg(); 162 163 /// <summary> 164 /// 新增节点 165 /// </summary> 166 /// <param name="sender"></param> 167 /// <param name="e"></param> 168 private void btnAddNew_Click(object sender, EventArgs e) 169 { 170 //是否选中父节点,如果不选中,默认父节点为0 171 TreeNode node = treeView1.SelectedNode; 172 int id = node == null ? 0 : (Int32)node.Tag; 173 //获得父节点ID,即PID 174 mea.area = new T_AREA(); 175 mea.area.PID = id; //新增传PID 176 AddNewAndEdit(1); 177 } 178 179 /// <summary> 180 /// 编辑节点 181 /// </summary> 182 /// <param name="sender"></param> 183 /// <param name="e"></param> 184 private void btnEdit_Click(object sender, EventArgs e) 185 { 186 //是否选中 187 if (treeView1.SelectedNode == null) 188 { 189 MessageBox.Show("请先选中要编辑的节点"); 190 return; 191 } 192 //获得节点ID 193 int id = (Int32)treeView1.SelectedNode.Tag; 194 mea.area = new T_AREA(); 195 mea.area.ID = id; //编辑传ID 196 mea.area.PID = treeView1.SelectedNode.Parent == null ? 0 : (Int32)treeView1.SelectedNode.Parent.Tag; 197 AddNewAndEdit(2); 198 } 199 200 /// <summary> 201 /// 编辑和新增 202 /// </summary> 203 /// <param name="p"></param> 204 private void AddNewAndEdit(int p) 205 { 206 mea.Tp = p; 207 Form2 f2 = new Form2(); 208 //注册事件 209 this._evt += new EventHandler(f2.SetText); 210 if(this._evt!=null) 211 { 212 this._evt(this, mea); 213 } 214 if (f2.ShowDialog() == DialogResult.OK) 215 { 216 f2.Close(); 217 LoadAlllNodes(); 218 } 219 else if (f2.ShowDialog() == DialogResult.Cancel) 220 { 221 f2.Close(); 222 } 223 } 224 } 225 public class MyEventArg : EventArgs 226 { 227 /// <summary> 228 /// 1 新增,2 编辑 229 /// </summary> 230 public int Tp { get; set; } 231 /// <summary> 232 /// 节点实例 233 /// </summary> 234 public T_AREA area { get; set; } 235 } 236 }