C# DataGridView 中如何结合treeview显示

sinat_19969823 2014-09-10 03:15:34
要实现下图的显示,该如何操作呢?DataGridView+TreeView的结合,
看过一些介绍,要利用第三方控件。如果不用第三方控件,该如何实现呢?重写paint事件?
谢谢!


...全文
2304 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ee_2499021096 2014-09-12
  • 打赏
  • 举报
回复
将DataGridView数据拖放到TreeView控件显示 //加载DataGridView绑定数据显示 private void Form1_Load(object sender,EventArgs e) { string P_Connection = string.Format(//创建数据库连接字符串 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb;User Id=Admin"); OleDbDataAdapter P_OLeDbDataAdapter = new OleDbDataAdapter( "select au_id as 用户编号,au_lname as 用户名,phone as 联系电话 from authors", P_Connection); DataSet ds = new DataSet(); P_OLeDbDataAdapter.Fill(ds,"UserInfo"); dataGridView1.DataSource = ds.Tables["UserInfo"].DefaultView; TreeNode treeNode = new TreeNode("用户信息",0,0); treeView1.Nodes.Add(treeNode); //默认情况下追加节点 追加节点ToolStripMenuItem.Checked = true; }//CodeGo.net/ //DataGridView的按下鼠标事件保存选定数据记录 private void dataGridView1_MouseDown(object sender,MouseEventArgs e) { if(dataGridView1.SelectedCells.Count != 0) { //定义一个二维数组,数组中的每一行代表DataGridView中的一条记录 recordInfo = new string[dataGridView1.Rows.Count,dataGridView1.Columns.Count]; //当按下鼠标左键时,首先获取选定行,记录每一行对应的信息 for(int i = 0; i < dataGridView1.Rows.Count; i++) { if(dataGridView1.Rows[i].Selected) { for(int j = 0; j < dataGridView1.Columns.Count; j++) { recordInfo[i,j] = dataGridView1.Rows[i].Cells[j].Value.ToString(); } } } } } //当鼠标进入TreeView控件时,触发的操作 private void treeView1_MouseEnter(object sender,EventArgs e) { if(追加节点ToolStripMenuItem.Checked == true) { #region 代码区域 if(recordInfo != null && recordInfo.Length != 0) { //用双重for循环遍历数组recordInfo中的内容 for(int i = 0; i < recordInfo.GetLength(0); i++) { for(int j = 0; j < recordInfo.GetLength(1); j++) { //判断数组中的值是否为空 if(recordInfo[i,j] != null) { if(j == 0) { //向TreeView中加入节点 TreeNode Node1 = new TreeNode(recordInfo[i,j].ToString()); treeView1.SelectedNode.Nodes.Add(Node1); treeView1.SelectedNode = Node1; } else { //添加子级节点下的子节点 TreeNode Node2 = new TreeNode(recordInfo[i,j].ToString()); treeView1.SelectedNode.Nodes.Add(Node2); } } } treeView1.SelectedNode = treeView1.Nodes[0]; treeView1.ExpandAll(); } //清空recordInfo中的记录 for(int m = 0; m < recordInfo.GetLength(0); m++) { for(int n = 0; n < recordInfo.GetLength(1); n++) { recordInfo[m,n] = null; } } } #endregion } if(清空内容ToolStripMenuItem.Checked == true) { if(treeView1.SelectedNode.Nodes.Count != 0) { treeView1.SelectedNode.Remove(); TreeNode treeNode = new TreeNode("用户信息",0,0); treeView1.Nodes.Add(treeNode); treeView1.SelectedNode = treeNode; #region 代码区域 if(recordInfo != null && recordInfo.Length != 0) { //用双重for循环遍历数组recordInfo中的内容 for(int i = 0; i < recordInfo.GetLength(0); i++) { for(int j = 0; j < recordInfo.GetLength(1); j++) { //判断数组中的值是否为空 if(recordInfo[i,j] != null) { if(j == 0) { //向TreeView中加入节点 TreeNode Node1 = new TreeNode(recordInfo[i,j].ToString()); treeView1.SelectedNode.Nodes.Add(Node1); treeView1.SelectedNode = Node1; } else { //添加子级节点下的子节点 TreeNode Node2 = new TreeNode(recordInfo[i,j].ToString()); treeView1.SelectedNode.Nodes.Add(Node2); } } } treeView1.SelectedNode = treeView1.Nodes[0]; treeView1.ExpandAll(); } //清空recordInfo中的记录 for(int m = 0; m < recordInfo.GetLength(0); m++) { for(int n = 0; n < recordInfo.GetLength(1); n++) { recordInfo[m,n] = null; } } } #endregion 追加节点ToolStripMenuItem.Checked = true; 清空内容ToolStripMenuItem.Checked = false; } } }
nongfuxu 2014-09-11
  • 打赏
  • 举报
回复
引用
先把DataGridView 和 TreeView 控件使用熟练,在考虑学习底层吧。
没错!
敌敌畏耶 2014-09-10
  • 打赏
  • 举报
回复
如果你要自己写,就重写 DataGridView 吧···那表格里面 加入 TreeView·····但是 这个估计麻烦的要死·· 还不如用第三方控件,方便,快捷·····
熙风 2014-09-10
  • 打赏
  • 举报
回复
这是dev 的TreeList控件,如果你要自己写,那够你折腾的
  • 打赏
  • 举报
回复
还是 先把DataGridView 和 TreeView 控件使用熟练,在考虑学习底层吧。
sinat_19969823 2014-09-10
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
那不就相当于你自己做第三方控件了,不觉得费劲吗
只是在学习C#中,想了解下思路而已和具体实现的过程。
於黾 2014-09-10
  • 打赏
  • 举报
回复
那不就相当于你自己做第三方控件了,不觉得费劲吗

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧