返回顶部
首页 > 资讯 > 精选 >如何使用DataGridView展开与收缩
  • 843
分享到

如何使用DataGridView展开与收缩

2023-06-17 10:06:44 843人浏览 独家记忆
摘要

这篇文章给大家介绍如何使用DataGridView展开与收缩,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。很多数据都有父节点与子节点,我们希望单击父节点的时候可以展开父节点下的子节点数据。比如一个医院科室表,有父科室与

这篇文章给大家介绍如何使用DataGridView展开与收缩,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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

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

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

首先,创建示例数据:

示例数据sql

create table Department  (   ID int identity(1,1) not null,   DName varchar(20) null,   DparentId int null,   Dtelphone varchar(20) null,   Dhospital varchar(50) null )   insert into Department values('门诊外室',1,'1111','XXX医院')  insert into Department values('门诊内科',1,'2222','XXX医院')  insert into Department values('门诊手术',1,'3333','XXX医院')  insert into Department values('门诊儿科',1,'4444','XXX医院')  insert into Department values('神经内室',2,'5555','XXX医院')  insert into Department values('神经外科',2,'6666','XXX医院')  insert into Department values('住院手术',2,'7777','XXX医院')  insert into Department values('住院康复',2,'8888','XXX医院')

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

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

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

private void DataGridBing(DataTable table)          {              if (table.Rows.Count > 0)              {                  for (int i = 0; i < table.Rows.Count; i++)                  {                                            int k = this.dataGridView1.Rows.Add();                      DataGridViewRow row = this.dataGridView1.Rows[k];                      row.Cells["ID"].Value = table.Rows[i]["ID"];                      row.Cells["DName"].Value = table.Rows[i]["DName"];                      row.Cells["Daddress"].Value = table.Rows[i]["Daddress"];                      row.Cells["Dtelphone"].Value = table.Rows[i]["Dtelphone"];                      //用于显示该行是否已经展开                      row.Cells["IsEx"].Value = "false";                      //用于显示展开或收缩符号,为了简单我就直接用字符串了,其实用图片比较美观                      row.Cells["EX"].Value = "+";                  }              }          }

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

插入子节点:

 string isEx=this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value.ToString();              if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx=="false")              {                  string id = this.dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString();                  DataTable table = GetDataTable("select * from Department where DparentId="+id);                  if (table.Rows.Count > 0)                  {                      //插入行                      this.dataGridView1.Rows.Insert(e.RowIndex+1, table.Rows.Count);                      for (int i = 0; i < table.Rows.Count; i++)                      {                          DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex + i+1];                          row.DefaultCellStyle.BackColor = Color.CadetBlue;                          row.Cells["ID"].Value = table.Rows[i]["ID"];                          row.Cells["DName"].Value = table.Rows[i]["DName"];                          row.Cells["Daddress"].Value = table.Rows[i]["Daddress"];                          row.Cells["Dtelphone"].Value = table.Rows[i]["Dtelphone"];                      }                  }                  //将IsEx设置为true,标明该节点已经展开                  this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "true";                  this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "-";

删除子节点:

if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx == "true")             {                 string id = this.dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString();                 DataTable table = GetDataTable("select * from Department where DparentId=" + id);                 if (table.Rows.Count > 0)                 {                     //利用Remove                     for (int i = 0; i < table.Rows.Count; i++)                     {                         foreach (DataGridViewRow row in this.dataGridView1.Rows)                         {                             if (row.Cells["ID"].Value.Equals(table.Rows[i]["ID"]))                             {                                 this.dataGridView1.Rows.Remove(row);                             }                         }                     }                 }                 ////将IsEx设置为false,标明该节点已经收缩                 this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "false";                 this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "+";             }

这里面通过比较ID来***确定一行,循环比较多,因为子节点是紧接着父节点的,我们可以确定子节点所在的行数,所以用RemoveAt()方法更好。

//利用RemoveAt                      for (int i = table.Rows.Count; i > 0; i--)                      {                          //删除行                          this.dataGridView1.Rows.RemoveAt(i + e.RowIndex);                      }

上面的做法是通过不断的插入与删除来实现,但这样与数据库的交互变得很频繁。更好的做法应该是插入一次,然后通过隐藏或显示行来实现我们的效果。

为此,我们还要在grid中新增两个列:

IsInsert:用来判断该行是否已经有插入子节点数据

RowCount:用来保存该行下插入的子节点数量。

在方法DataGridBing中,绑定数据时,应该再加一列:

//是否插入  row.Cells["IsInsert"].Value = "false";

而在增加节点的时候,我们要多做一个判断,如果IsInsert为false就插入数据,如果为true就显示数据

展开行

if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx=="false")              {                  if (this.dataGridView1.Rows[e.RowIndex].Cells["IsInsert"].Value.ToString() == "false")                  {                      string id = this.dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString();                      DataTable table = GetDataTable("select * from Department where DparentId=" + id);                      if (table.Rows.Count > 0)                      {                          //插入行                          this.dataGridView1.Rows.Insert(e.RowIndex + 1, table.Rows.Count);                          for (int i = 0; i < table.Rows.Count; i++)                          {                              DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex + i + 1];                              row.DefaultCellStyle.BackColor = Color.CadetBlue;                              row.Cells["ID"].Value = table.Rows[i]["ID"];                              row.Cells["DName"].Value = table.Rows[i]["DName"];                              row.Cells["Daddress"].Value = table.Rows[i]["Daddress"];                              row.Cells["Dtelphone"].Value = table.Rows[i]["Dtelphone"];                          }                          this.dataGridView1.Rows[e.RowIndex].Cells["IsInsert"].Value = "true";                          this.dataGridView1.Rows[e.RowIndex].Cells["RowCount"].Value = table.Rows.Count;                      }                  }                  else                 {                      //显示数据                      int RowCount = Convert.ToInt32(this.dataGridView1.Rows[e.RowIndex].Cells["RowCount"].Value);                      for (int i = 1; i <= RowCount; i++)                      {                          this.dataGridView1.Rows[e.RowIndex + i].Visible = true;                      }                  }                  //将IsEx设置为true,标明该节点已经展开                  this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "true";                  this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "-";              }

收缩的时候,我们直接隐藏行就可以了.

收缩行

if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx == "true")              {                  int RowCount = Convert.ToInt32(this.dataGridView1.Rows[e.RowIndex].Cells["RowCount"].Value);                  for (int i = 1; i <= RowCount; i++)                  {                      //隐藏行                      this.dataGridView1.Rows[e.RowIndex + i].Visible = false;                  }                  ////将IsEx设置为false,标明该节点已经收缩                  this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "false";                  this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "+";              }

关于如何使用DataGridView展开与收缩就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何使用DataGridView展开与收缩

本文链接: https://lsjlt.com/news/288367.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用DataGridView展开与收缩
    这篇文章给大家介绍如何使用DataGridView展开与收缩,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。很多数据都有父节点与子节点,我们希望单击父节点的时候可以展开父节点下的子节点数据。比如一个医院科室表,有父科室与...
    99+
    2023-06-17
  • jquery如何展开收缩
    这篇文章给大家分享的是有关jquery如何展开收缩的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。<!DOCTYPE html PUBLIC "-//W3C//DT...
    99+
    2024-04-02
  • JS如何模仿QQ好友列表展开、收缩功能
    这篇文章给大家分享的是有关JS如何模仿QQ好友列表展开、收缩功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图如下所示:js:<script>  wi...
    99+
    2024-04-02
  • Android仿QQ好友列表实现列表收缩与展开
    ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同的是,它可以有两层:每一层都能够被独立的展开并显示其子项。 好友QQ列表,可以展开...
    99+
    2022-06-06
    列表 Android
  • 用CSS3+HTML5+JS 怎么实现块的收缩与展开的动画效果
    ...
    99+
    2023-06-08
  • 如何使用bootstrap实现收缩导航条
    这篇文章将为大家详细讲解有关如何使用bootstrap实现收缩导航条,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下效果图 贴上我的代码<!DocType...
    99+
    2024-04-02
  • 怎么在Android应用中实现一个可收缩与扩展的TextView
    这期内容当中小编将会给大家带来有关怎么在Android应用中实现一个可收缩与扩展的TextView,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现原理:核心是控制TextView的max lines。在...
    99+
    2023-05-31
    android textview roi
  • 如何在PHP中使用bz2压缩扩展工具
    这期内容当中小编将会给大家带来有关如何在PHP中使用bz2压缩扩展工具,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。安装扩展这个扩展的安装需要系统有 bzip2-devel 。所以我们需要先给系统装上这个...
    99+
    2023-06-15
  • Couchbase的自动扩展和收缩功能是如何工作的
    Couchbase的自动扩展和收缩功能是通过自动重新平衡节点和数据来实现的。当集群中添加或删除节点时,Couchbase会自动重新分...
    99+
    2024-04-09
    Couchbase
  • JavaScript如何使用展开运算符
    小编给大家分享一下JavaScript如何使用展开运算符,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用展开运算符(...)var fruits&nb...
    99+
    2023-06-17
  • 怎么使用alwayson后如何收缩数据库日志
    这篇文章将为大家详细讲解有关怎么使用alwayson后如何收缩数据库日志,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述:在使用了alwayson后,主从库实时同步...
    99+
    2024-04-02
  • JavaScript中如何使用扩展运算符展开对象
    这篇文章主要为大家展示了“JavaScript中如何使用扩展运算符展开对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中如何使用扩展运算符展开对象”这篇文章吧。展开对象co...
    99+
    2023-06-04
  • 如何使用python实现展开列表
    这篇文章主要为大家展示了“如何使用python实现展开列表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用python实现展开列表”这篇文章吧。展开列表将列表内的所有元素,包括子列表,都展...
    99+
    2023-06-27
  • Linux如何使用命令进行压缩与解压缩操作
    这篇文章将为大家详细讲解有关Linux如何使用命令进行压缩与解压缩操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在学习压缩和解压缩之前。首先,要了解一下打包、压缩、解压缩的基本概念。打包文件:一看到 ...
    99+
    2023-06-09
  • web中如何实现列表展开收起效果
    这篇文章主要为大家展示了“web中如何实现列表展开收起效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中如何实现列表展开收起效果”这篇文章吧。$(&qu...
    99+
    2024-04-02
  • windows电脑硬盘中磁盘自动扩展和收缩的使用方法
    这期内容当中小编将会给大家带来有关windows电脑硬盘中磁盘自动扩展和收缩的使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在我们日常使用Windows系统的过程中,可能会遇到磁盘分区的使用空间不...
    99+
    2023-06-14
  • 如何在c#中使用Zlib压缩与解压
    目录介绍System.IO.Compressionzlib.netSharpZipLib速度对比总结参考与延申关于Zlib关于 Deflate 和 Raw Deflate关于CSha...
    99+
    2024-04-02
  • 如何使用 CLion 开发调试 PHP 扩展
    本文主要介绍如何使用 IDE Clion 来开发调试PHP扩展。 一、 创建PHP扩展 php 扩展的创建这里就不再赘述,使用ext_skel 生成一个框架,然后编辑相应的文件,编译安装,最后...
    99+
    2024-02-27
  • 怎么使用CSS3实现侧边栏展开收起动画
    这篇文章主要介绍了怎么使用CSS3实现侧边栏展开收起动画,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。@keyframes规则用于创建动画。...
    99+
    2024-04-02
  • 纯CSS3如何实现移动端展开和收起效果
    这篇文章给大家分享的是有关纯CSS3如何实现移动端展开和收起效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。展示效果:HTML代码<section class="block"...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作