许多数据都有父节点和子节点,我们希望单击父节点在父节点下展开子节点的数据。
例如,一个医院的部门表,由父亲部和儿童部,点击父亲部,在父亲节可以
显示所有部门下属部。
让我们来谈谈如何在DataGridView中这样做。
首先,
创建示例数据:
样本数据的SQL
创建表的部门
(
id int(1,1)不是null,
DName varchar(20)空,
dparentid int空,
Dtelphone varchar(20)空,
Dhospital varchar(50)空
)
插入部值('outpatient室,1,'1111 ','xxx医院)
插入部值('outpatient内科,1,'2222 ','xxx医院)
Insert into Department values ('outpatient operation', 1,'3333','XXX hospital')
插入部值('outpatient儿科,1,'4444 ','xxx医院)
插入部值('nerve内部,2,'5555 ','xxx医院)
插入部值('department神经外科',2,'6666 ','xxx医院)
插入部('hospitalized值
操作,2,'7777 ','xxx医院)
插入部值('hospitalized康复,2,'8888 ','xxx医院)
事实上,这个想法很简单。当父节点推出,新的DataGridViewRow插入父节点下。当父节点的子节点收缩,DataGridViewRow
删除父节点下。
为了简单起见,代码中读取的数据是硬编码的。
父母除了负荷数据,数据库中的列,我增加了两个新的栏目:isex和EX.
private void datagridbing(表表)
{
如果(table.rows.count > 0)
{
为(int i = 0;i < table.rows.count;i++)
{
int k = this.datagridview1.rows.add();
这datagridview1 DataGridViewRow行=。。行{ k };
行单元格;
行。细胞{名称}。值=表。行{我} {名称};
行。细胞{daddress}。值=表。行{我} {daddress};
行。细胞{dtelphone}。值=表。行{我} {dtelphone};
是否已用于显示/
启动 行。细胞{isex},值为假;
为了显示/展开或收缩简单的符号,我只使用字符串,但用更漂亮的
图片 行单元格{}。值;
}
}
}
下面是单元格的单击事件,它分别在事件的
扩展中写入和
退出。
插入子节点:
字符串isex =这。datagridview1。行{ e.rowindex },{细胞isex}。value.tostring();
如果(这。datagridview1。列{ e.columnindex }。
名字= =前isex = =假)
{
字符串ID =这。datagridview1。行{ } { e.rowindex。细胞IDvalue.tostring()};
数据表表= GetDataTable(选择*从哪儿dparentid =+身份证);
如果(table.rows.count > 0)
{
插入行
this.datagridview1.rows.insert(e.rowindex + 1,表行。计数);
为(int i = 0;i < table.rows.count;i++)
{
这datagridview1 DataGridViewRow行=。。行{ e.rowindex +我+ 1 };
row.defaultcellstyle.backcolor = color.cadetblue;
行单元格;
行。细胞{名称}。值=表。行{我} {名称};
行。细胞{daddress}。值=表。行{我} {daddress};
行。细胞{dtelphone}。值=表。行{我} {dtelphone};
}
}
/ / isex为true,说明节点已扩大
这个datagridview1。行{ e.rowindex },{细胞isex}。值为真;
这个datagridview1。行{ } { e.rowindex。细胞前}。值= ;
删除子节点:
如果(这。datagridview1。列{ e.columnindex }。名字= =前isex = =真的)
{
字符串ID =这。datagridview1。行{ } { e.rowindex。细胞IDvalue.tostring()};
数据表表= GetDataTable(选择*从哪儿dparentid =+身份证);
如果(table.rows.count > 0)
{
使用删除
为(int i = 0;i < table.rows.count;i++)
{
foreach(DataGridViewRow排在这。datagridview1。行)
{
如果(行。细胞{id}。value.equals(表。行{我} {ID))))
{
this.datagridview1.rows.remove(行);
}
}
}
}
/ isex为false,说明节点已经萎缩
这个datagridview1。行{ e.rowindex },{细胞isex},值为假;
这个datagridview1。行{ } { e.rowindex。细胞前}。值=+;
}
通过比较ID,我们只需要确定一个行和更多的循环,因为子节点的父节点下,所以我们可以确定行数的子节点的
位置,所以RemoveAt()
方法更好。
RemoveAt / /利用
为(int i = table.rows.count;我> 0;我--)
{
删除行
this.datagridview1.rows.removeat(我+ e.rowindex);
}
上面的方法是通过
连续插入和删除来实现的,但是与数据库的交互变得非常频繁,一个更好的方法应该是插入一次,然后隐藏或显示行以达到我们的效果。
为此,我们还将两个列添加到网格中:
IsInsert:确定是否行已插入子节点的数据或不。
行数:它是用来节省下的子节点插入的行数。
方法datagridbing,绑定数据时,应增加一列:
是否插入
行。细胞{isinsert},值为假;
当添加节点时,我们还要做一个判断。如果IsInsert是假的,你插入的数据,如果这是真的,数据显示。
折叠线
如果(这。datagridview1。列{ e.columnindex }。名字= =前isex = =假)
{
如果(这。datagridview1。行{ } { e.rowindex。细胞isinsert)(}。value.tostring = =假)
{
字符串ID =这。datagridview1。行{ } { e.rowindex。细胞IDvalue.tostring()};
数据表表= GetDataTable(选择*从哪儿dparentid =+身份证);
如果(table.rows.count > 0)
{
/ /插入行
this.datagridview1.rows.insert(e.rowindex + 1,表行。计数);
为(int i = 0;i < table.rows.count;i++)
{
这datagridview1 DataGridViewRow行=。。行{ e.rowindex +我+ 1 };
row.defaultcellstyle.backcolor = color.cadetblue;
行单元格;
行。细胞{名称}。值=表。行{我} {名称};
行。细胞{daddress}。值=表。行{我} {daddress};
行。细胞{dtelphone}。值=表。行{我} {dtelphone};
}
这个datagridview1。行{ e.rowindex },{细胞isinsert}。值为真;
这个datagridview1。行{ e.rowindex }。细胞{行数值= table.rows.count };
}
}
其他的
{
显示数据
int行数= convert.toint32(这个。datagridview1。行{ e.rowindex }。细胞{行数}。值);
为(int i = 1;i <行数;i++)
{
这个datagridview1。行{ e.rowindex +我=真实可见的};
}
}
/ / isex为true,说明节点已扩大
这个datagridview1。行{ e.rowindex },{细胞isex}。值为真;
这个datagridview1。行{ } { e.rowindex。细胞前}。值= ;
}
当我们收缩时,我们可以直接隐藏线。
收缩线
如果(这。datagridview1。列{ e.columnindex }。名字= =前isex = =真的)
{
int行数= convert.toint32(这个。datagridview1。行{ e.rowindex }。细胞{行数}。值);
为(int i = 1;i <行数;i++)
{
隐藏行
这个datagridview1。行{ e.rowindex +我}。可视=假;
}
/ isex为false,说明节点已经萎缩
这个datagridview1。行{ e.rowindex },{细胞isex},值为假;
这个datagridview1。行{ } { e.rowindex。细胞前}。值=+;
}
我们都知道,如何实现DataGridView收缩我希望你不仅知道如何做到这一点,而且还做一些实验。