玩转DataGridView之行的展开与收缩

发表于:2012-5-07 09:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Gyoung    来源:51Testing软件测试网采编

  很多数据都有父节点与子节点,我们希望单击父节点的时候可以展开父节点下的子节点数据。

  比如一个医院科室表,有父科室与子科室,点击父科室后,在父科室下面可以展现该科室下的所有子科室。

  我们来说一下在DataGridView中如何实现这个功能。

  首先,创建示例数据:

  示例数据SQL

  1. create table Department  
  2. (  
  3.  ID int identity(1,1) not null,  
  4.  DName varchar(20) null,  
  5.  DparentId int null,  
  6.  Dtelphone varchar(20) null,  
  7.  Dhospital varchar(50) null 
  8. )  
  9. insert into Department values('门诊外室',1,'1111','XXX医院')  
  10. insert into Department values('门诊内科',1,'2222','XXX医院')  
  11. insert into Department values('门诊手术',1,'3333','XXX医院')  
  12. insert into Department values('门诊儿科',1,'4444','XXX医院')  
  13. insert into Department values('神经内室',2,'5555','XXX医院')  
  14. insert into Department values('神经外科',2,'6666','XXX医院')  
  15. insert into Department values('住院手术',2,'7777','XXX医院')  
  16. insert into Department values('住院康复',2,'8888','XXX医院')

  其实思路很简单,就是在展开父节点的时候,在父节点下插入新的DataGridViewRow;收缩父节点的时候,在父节点下删除该子节点的DataGridViewRow。

  为了简便,代码中的数据读取我都直接硬编码了。

  加载父节点数据,除了数据库中的列外我还新加了两列:IsEx与EX。

  1. private void DataGridBing(DataTable table)  
  2.         {  
  3.             if (table.Rows.Count > 0)  
  4.             {  
  5.                 for (int i = 0; i < table.Rows.Count; i++)  
  6.                 {  
  7.                       
  8.                     int k = this.dataGridView1.Rows.Add();  
  9.                     DataGridViewRow row = this.dataGridView1.Rows[k];  
  10.                     row.Cells["ID"].Value = table.Rows[i]["ID"];  
  11.                     row.Cells["DName"].Value = table.Rows[i]["DName"];  
  12.                     row.Cells["Daddress"].Value = table.Rows[i]["Daddress"];  
  13.                     row.Cells["Dtelphone"].Value = table.Rows[i]["Dtelphone"];  
  14.                     //用于显示该行是否已经展开 
  15.                     row.Cells["IsEx"].Value = "false";  
  16.                     //用于显示展开或收缩符号,为了简单我就直接用字符串了,其实用图片比较美观 
  17.                     row.Cells["EX"].Value = "+";  
  18.                 }  
  19.             }  
  20.         }

  下面就是Cell的单击事件了,分别在事件中写展开的插入与收缩的删除.

  插入子节点:

  1. string isEx=this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value.ToString();  
  2.             if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx=="false")  
  3.             {  
  4.                 string id = this.dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString();  
  5.                 DataTable table = GetDataTable("select * from Department where DparentId="+id);  
  6.                 if (table.Rows.Count > 0)  
  7.                 {  
  8.                     //插入行 
  9.                     this.dataGridView1.Rows.Insert(e.RowIndex+1, table.Rows.Count);  
  10.                     for (int i = 0; i < table.Rows.Count; i++)  
  11.                     {  
  12.                         DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex + i+1];  
  13.                         row.DefaultCellStyle.BackColor = Color.CadetBlue;  
  14.                         row.Cells["ID"].Value = table.Rows[i]["ID"];  
  15.                         row.Cells["DName"].Value = table.Rows[i]["DName"];  
  16.                         row.Cells["Daddress"].Value = table.Rows[i]["Daddress"];  
  17.                         row.Cells["Dtelphone"].Value = table.Rows[i]["Dtelphone"];  
  18.                     }  
  19.                 }  
  20.                 //将IsEx设置为true,标明该节点已经展开 
  21.                 this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "true";  
  22.                 this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "-";

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号