亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

DataGridView展開與收縮功能實現

2024-07-10 13:29:24
字體:
來源:轉載
供稿:網友

我們今天將要講到DataGridView之行的展開與收縮,包括功能是如何實現的,感興趣的小伙伴們可以參考一下

很多數據都有父節點與子節點,我們希望單擊父節點的時候可以展開父節點下的子節點數據。

比如一個醫院科室表,有父科室與子科室,點擊父科室后,在父科室下面可以展現該科室下的所有子科室。

我們來說一下在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.  
  10. insert into Department values('門診外室',1,'1111','XXX醫院')  
  11. insert into Department values('門診內科',1,'2222','XXX醫院')  
  12. insert into Department values('門診手術',1,'3333','XXX醫院')  
  13. insert into Department values('門診兒科',1,'4444','XXX醫院')  
  14. insert into Department values('神經內室',2,'5555','XXX醫院')  
  15. insert into Department values('神經外科',2,'6666','XXX醫院')  
  16. insert into Department values('住院手術',2,'7777','XXX醫院')  
  17. 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 = "-";  

刪除子節點:

 

 
  1. if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx == "true")  
  2. {  
  3. string id = this.dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString();  
  4. DataTable table = GetDataTable("select * from Department where DparentId=" + id);  
  5. if (table.Rows.Count > 0)  
  6. {  
  7. //利用Remove  
  8. for (int i = 0; i < table.Rows.Count; i++)  
  9. {  
  10. foreach (DataGridViewRow row in this.dataGridView1.Rows)  
  11. {  
  12. if (row.Cells["ID"].Value.Equals(table.Rows[i]["ID"]))  
  13. {  
  14. this.dataGridView1.Rows.Remove(row);  
  15. }  
  16. }  
  17. }  
  18. }  
  19. ////將IsEx設置為false,標明該節點已經收縮  
  20. this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "false";  
  21. this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "+";  
  22. }  

這里面通過比較ID來唯一確定一行,循環比較多,因為子節點是緊接著父節點的,我們可以確定子節點所在的行數,所以用RemoveAt()方法更好。

 

 
  1. //利用RemoveAt  
  2. for (int i = table.Rows.Count; i > 0; i--)  
  3. {  
  4. //刪除行  
  5. this.dataGridView1.Rows.RemoveAt(i + e.RowIndex);  
  6. }  

上面的做法是通過不斷的插入與刪除來實現,但這樣與數據庫的交互變得很頻繁。更好的做法應該是插入一次,然后通過隱藏或顯示行來實現我們的效果。

為此,我們還要在grid中新增兩個列:

IsInsert:用來判斷該行是否已經有插入子節點數據

RowCount:用來保存該行下插入的子節點數量。

在方法DataGridBing中,綁定數據時,應該再加一列:

 

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

而在增加節點的時候,我們要多做一個判斷,如果IsInsert為false就插入數據,如果為true就顯示數據

展開行

 

 
  1. if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx=="false")  
  2. {  
  3. if (this.dataGridView1.Rows[e.RowIndex].Cells["IsInsert"].Value.ToString() == "false")  
  4. {  
  5. string id = this.dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString();  
  6. DataTable table = GetDataTable("select * from Department where DparentId=" + id);  
  7. if (table.Rows.Count > 0)  
  8. {  
  9. //插入行  
  10. this.dataGridView1.Rows.Insert(e.RowIndex + 1, table.Rows.Count);  
  11. for (int i = 0; i < table.Rows.Count; i++)  
  12. {  
  13. DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex + i + 1];  
  14. row.DefaultCellStyle.BackColor = Color.CadetBlue;  
  15. row.Cells["ID"].Value = table.Rows[i]["ID"];  
  16. row.Cells["DName"].Value = table.Rows[i]["DName"];  
  17. row.Cells["Daddress"].Value = table.Rows[i]["Daddress"];  
  18. row.Cells["Dtelphone"].Value = table.Rows[i]["Dtelphone"];  
  19. }  
  20. this.dataGridView1.Rows[e.RowIndex].Cells["IsInsert"].Value = "true";  
  21. this.dataGridView1.Rows[e.RowIndex].Cells["RowCount"].Value = table.Rows.Count;  
  22. }  
  23. }  
  24. else 
  25. {  
  26. //顯示數據  
  27. int RowCount = Convert.ToInt32(this.dataGridView1.Rows[e.RowIndex].Cells["RowCount"].Value);  
  28. for (int i = 1; i <= RowCount; i++)  
  29. {  
  30. this.dataGridView1.Rows[e.RowIndex + i].Visible = true;  
  31. }  
  32. }  
  33. //將IsEx設置為true,標明該節點已經展開  
  34. this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "true";  
  35. this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "-";  
  36. }  

收縮的時候,我們直接隱藏行就可以了.

收縮行

 

 
  1. if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx == "true")  
  2. {  
  3. int RowCount = Convert.ToInt32(this.dataGridView1.Rows[e.RowIndex].Cells["RowCount"].Value);  
  4. for (int i = 1; i <= RowCount; i++)  
  5. {  
  6. //隱藏行  
  7. this.dataGridView1.Rows[e.RowIndex + i].Visible = false;  
  8. }  
  9. ////將IsEx設置為false,標明該節點已經收縮  
  10. this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "false";  
  11. this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "+";  
  12. }  

大家知道DataGridView是如何實現展開收縮的吧,希望大家不僅知道是如何實現的還要動手實驗一番,才不枉小編辛苦整理此文章哦

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情视频免费观看| 青青精品视频播放| 97精品免费视频| 国产一区二区三区在线观看网站| 亚洲国产精品va在线看黑人动漫| 国产成人精品久久二区二区| 一区二区日韩精品| 日韩不卡在线观看| 国产欧洲精品视频| 国产日韩中文字幕在线| 欧美肥臀大乳一区二区免费视频| 欧洲美女7788成人免费视频| 国产一区二区av| 精品精品国产国产自在线| 亚洲影院污污.| 欧美日韩国产123| 日韩国产高清视频在线| 91网站在线看| 91免费精品视频| 亚洲精品久久久久久久久久久久久| 91夜夜未满十八勿入爽爽影院| 97精品免费视频| 精品网站999www| 91香蕉嫩草影院入口| 亚洲欧美日韩精品久久奇米色影视| 欧美性videos高清精品| 国产成人精品免高潮费视频| 91精品国产综合久久男男| 国产91色在线播放| 欧美最猛黑人xxxx黑人猛叫黄| 日韩精品欧美激情| 亚洲精品中文字幕女同| 日本午夜在线亚洲.国产| 91在线免费网站| 欧美高清理论片| 精品亚洲国产成av人片传媒| 亚洲欧美成人在线| 96国产粉嫩美女| 欧美亚州一区二区三区| 国产精品久久视频| 国模精品视频一区二区三区| 97视频在线观看网址| 亚洲美女视频网站| 久久在线免费观看视频| 亚洲国产成人精品久久久国产成人一区| 麻豆精品精华液| 久久久久国产一区二区三区| 亚洲成人网在线| 国产欧亚日韩视频| 国产不卡精品视男人的天堂| 欧美成人午夜影院| 色老头一区二区三区在线观看| 国产精品久久久久久av福利| 91av福利视频| 亚洲性无码av在线| 日韩av片电影专区| 日韩经典一区二区三区| 欧美视频专区一二在线观看| 欧美另类69精品久久久久9999| 91免费精品视频| 欧美丰满老妇厨房牲生活| 欧美韩日一区二区| 欧美中文字幕在线播放| 久久av在线播放| 亚洲电影免费观看高清完整版| 日韩在线观看免费全集电视剧网站| 亚洲最新av在线| 久久在线观看视频| 日韩精品在线视频| 日韩高清人体午夜| 欧美在线免费视频| 亚洲精品99久久久久| 91精品一区二区| 国内精品久久久久久| 国产成人精品一区二区三区| 曰本色欧美视频在线| 午夜精品福利在线观看| 国产最新精品视频| 日韩精品欧美激情| 欧美丝袜一区二区| 亚洲午夜激情免费视频| 乱亲女秽乱长久久久| 国外视频精品毛片| 国产午夜精品一区理论片飘花| 国内成人精品一区| 一本色道久久88亚洲综合88| 九色精品美女在线| 精品视频—区二区三区免费| 国内精品一区二区三区四区| 亚洲va欧美va国产综合剧情| 91精品美女在线| 亚洲第一区在线观看| 国产成人精品在线观看| 精品成人久久av| 色婷婷av一区二区三区久久| 国产亚洲欧美日韩精品| 欧美中文在线观看国产| 九色精品免费永久在线| 欧美性猛交xxxx免费看久久久| 欧美国产视频一区二区| 久久精品国产亚洲| 中文字幕亚洲一区| 成人精品在线观看| 欧美成人精品xxx| 成人黄色影片在线| 欧美激情网站在线观看| 欧美激情亚洲自拍| 成人国产亚洲精品a区天堂华泰| 国产精品av免费在线观看| 97视频在线免费观看| 奇门遁甲1982国语版免费观看高清| 国产视频精品久久久| 成人精品一区二区三区电影免费| 欧美激情精品久久久| 欧美最猛黑人xxxx黑人猛叫黄| 在线观看日韩www视频免费| 国产热re99久久6国产精品| 亚洲最大激情中文字幕| 精品视频在线播放色网色视频| 日韩视频在线一区| 亚洲xxxxx性| 色综久久综合桃花网| 亚洲成人av资源网| 久久精品免费播放| 久久久久久久久久久久av| 成人亚洲欧美一区二区三区| 久久久久久久国产精品| 亚洲电影在线观看| 精品久久久久久亚洲国产300| 国产精品美女主播在线观看纯欲| 国产精品人人做人人爽| 亚洲毛茸茸少妇高潮呻吟| 亚洲激情视频在线| 亚洲小视频在线观看| 欧美在线视频观看免费网站| 中文字幕av一区中文字幕天堂| 日韩精品福利在线| 亚洲成人激情小说| 亚洲性夜色噜噜噜7777| 亚洲精品小视频| 国产精品一区二区三区毛片淫片| 国产综合久久久久| 日本精品va在线观看| 欧美黄色成人网| 亚洲大胆人体av| 国产欧美va欧美va香蕉在线| 一二美女精品欧洲| 日韩人在线观看| 亚洲人精选亚洲人成在线| www.久久久久久.com| 91高清免费在线观看| 久久久999国产精品| 青青久久av北条麻妃黑人| 91情侣偷在线精品国产| 国产成人激情小视频| 亚洲va欧美va国产综合剧情| 欧美激情第6页| 久久的精品视频| 精品国产一区二区三区久久狼5月| 日韩中文字幕在线免费观看| 欧美最顶级丰满的aⅴ艳星| 成人国产在线激情| 日韩av一卡二卡| 亚洲人午夜色婷婷|