问题描述
要实现下图的显示,该如何操作呢?DataGridView+TreeView的结合,看过一些介绍,要利用第三方控件。如果不用第三方控件,该如何实现呢?重写paint事件?谢谢!
解决方案
解决方案二:
那不就相当于你自己做第三方控件了,不觉得费劲吗
解决方案三:
引用1楼Z65443344的回复:
那不就相当于你自己做第三方控件了,不觉得费劲吗
只是在学习C#中,想了解下思路而已和具体实现的过程。
解决方案四:
还是先把DataGridView和TreeView控件使用熟练,在考虑学习底层吧。
解决方案五:
这是dev的TreeList控件,如果你要自己写,那够你折腾的
解决方案六:
如果你要自己写,就重写DataGridView吧···那表格里面加入TreeView·····但是这个估计麻烦的要死··还不如用第三方控件,方便,快捷·····
解决方案七:
引用
先把DataGridView和TreeView控件使用熟练,在考虑学习底层吧。
没错!
解决方案八:
将DataGridView数据拖放到TreeView控件显示//加载DataGridView绑定数据显示privatevoidForm1_Load(objectsender,EventArgse){stringP_Connection=string.Format(//创建数据库连接字符串"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=test.mdb;UserId=Admin");OleDbDataAdapterP_OLeDbDataAdapter=newOleDbDataAdapter("selectau_idas用户编号,au_lnameas用户名,phoneas联系电话fromauthors",P_Connection);DataSetds=newDataSet();P_OLeDbDataAdapter.Fill(ds,"UserInfo");dataGridView1.DataSource=ds.Tables["UserInfo"].DefaultView;TreeNodetreeNode=newTreeNode("用户信息",0,0);treeView1.Nodes.Add(treeNode);//默认情况下追加节点追加节点ToolStripMenuItem.Checked=true;}//CodeGo.net///DataGridView的按下鼠标事件保存选定数据记录privatevoiddataGridView1_MouseDown(objectsender,MouseEventArgse){if(dataGridView1.SelectedCells.Count!=0){//定义一个二维数组,数组中的每一行代表DataGridView中的一条记录recordInfo=newstring[dataGridView1.Rows.Count,dataGridView1.Columns.Count];//当按下鼠标左键时,首先获取选定行,记录每一行对应的信息for(inti=0;i<dataGridView1.Rows.Count;i++){if(dataGridView1.Rows[i].Selected){for(intj=0;j<dataGridView1.Columns.Count;j++){recordInfo[i,j]=dataGridView1.Rows[i].Cells[j].Value.ToString();}}}}}//当鼠标进入TreeView控件时,触发的操作privatevoidtreeView1_MouseEnter(objectsender,EventArgse){if(追加节点ToolStripMenuItem.Checked==true){#region代码区域if(recordInfo!=null&&recordInfo.Length!=0){//用双重for循环遍历数组recordInfo中的内容for(inti=0;i<recordInfo.GetLength(0);i++){for(intj=0;j<recordInfo.GetLength(1);j++){//判断数组中的值是否为空if(recordInfo[i,j]!=null){if(j==0){//向TreeView中加入节点TreeNodeNode1=newTreeNode(recordInfo[i,j].ToString());treeView1.SelectedNode.Nodes.Add(Node1);treeView1.SelectedNode=Node1;}else{//添加子级节点下的子节点TreeNodeNode2=newTreeNode(recordInfo[i,j].ToString());treeView1.SelectedNode.Nodes.Add(Node2);}}}treeView1.SelectedNode=treeView1.Nodes[0];treeView1.ExpandAll();}//清空recordInfo中的记录for(intm=0;m<recordInfo.GetLength(0);m++){for(intn=0;n<recordInfo.GetLength(1);n++){recordInfo[m,n]=null;}}}#endregion}if(清空内容ToolStripMenuItem.Checked==true){if(treeView1.SelectedNode.Nodes.Count!=0){treeView1.SelectedNode.Remove();TreeNodetreeNode=newTreeNode("用户信息",0,0);treeView1.Nodes.Add(treeNode);treeView1.SelectedNode=treeNode;#region代码区域if(recordInfo!=null&&recordInfo.Length!=0){//用双重for循环遍历数组recordInfo中的内容for(inti=0;i<recordInfo.GetLength(0);i++){for(intj=0;j<recordInfo.GetLength(1);j++){//判断数组中的值是否为空if(recordInfo[i,j]!=null){if(j==0){//向TreeView中加入节点TreeNodeNode1=newTreeNode(recordInfo[i,j].ToString());treeView1.SelectedNode.Nodes.Add(Node1);treeView1.SelectedNode=Node1;}else{//添加子级节点下的子节点TreeNodeNode2=newTreeNode(recordInfo[i,j].ToString());treeView1.SelectedNode.Nodes.Add(Node2);}}}treeView1.SelectedNode=treeView1.Nodes[0];treeView1.ExpandAll();}//清空recordInfo中的记录for(intm=0;m<recordInfo.GetLength(0);m++){for(intn=0;n<recordInfo.GetLength(1);n++){recordInfo[m,n]=null;}}}#endregion追加节点ToolStripMenuItem.Checked=true;清空内容ToolStripMenuItem.Checked=false;}}}