国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

DataGridView展開與收縮功能實現

來源:懂視網 責編:小采 時間:2020-11-27 22:38:08
文檔

DataGridView展開與收縮功能實現

DataGridView展開與收縮功能實現:很多數據都有父節點與子節點,我們希望單擊父節點的時候可以展開父節點下的子節點數據。 比如一個醫院科室表,有父科室與子科室,點擊父科室后,在父科室下面可以展現該科室下的所有子科室。 我們來說一下在DataGridView中如何實現這個功能。 首先,創建示例
推薦度:
導讀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是如何實現展開收縮的吧,希望大家不僅知道是如何實現的還要動手實驗一番,才不枉小編辛苦整理此文章哦

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

DataGridView展開與收縮功能實現

DataGridView展開與收縮功能實現:很多數據都有父節點與子節點,我們希望單擊父節點的時候可以展開父節點下的子節點數據。 比如一個醫院科室表,有父科室與子科室,點擊父科室后,在父科室下面可以展現該科室下的所有子科室。 我們來說一下在DataGridView中如何實現這個功能。 首先,創建示例
推薦度:
標簽: 功能 實現 展開
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产国语在线播放视频 | 91精品国产色综合久久 | 自拍偷拍免费 | 一级毛片一级毛片一级级毛片 | 日韩另类在线 | 精品国产一区二区三区久久久蜜臀 | 国产九九在线 | 精品一区二区三区免费视频 | 亚洲图欧美 | 亚洲一区综合 | 国产在线观看一区二区三区 | www.久久99| 欧美日韩亚洲无线码在线观看 | 夜夜操夜夜骑 | 欧美午夜在线观看 | 国产区免费 | 在线观看香蕉视频 | 国产精品久久久精品三级 | 日韩aa在线观看 | 日本欧美韩国专区 | 欧洲日韩 | 一区不卡在线观看 | 国产成人一区二区三区影院免费 | 日韩 亚洲 制服 欧美 综合 | 久久久xxx| 中文亚洲欧美日韩无线码 | 久久久精品久久久久久久久久久 | 欧美视频日韩视频 | 久久se精品一区二区国产 | 成人午夜精品久久久久久久小说 | 国产v片在线观看 | 亚洲欧美日韩综合在线 | 欧美日韩在线第一页 | 另类专区亚洲 | 亚洲成a人一区二区三区 | 一区二区三区高清 | 欧美精品一区二区三区免费播放 | 国产在线高清不卡免费播放 | 国产精品亚洲四区在线观看 | 日韩欧美国产精品第一页不卡 | 欧美日韩另类综合 |