利用DataGridView怎么實現(xiàn)一個展開或收縮功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
首先,創(chuàng)建示例數(shù)據(jù):
示例數(shù)據(jù)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醫(yī)院') insert into Department values('門診內(nèi)科',1,'2222','XXX醫(yī)院') insert into Department values('門診手術',1,'3333','XXX醫(yī)院') insert into Department values('門診兒科',1,'4444','XXX醫(yī)院') insert into Department values('神經(jīng)內(nèi)室',2,'5555','XXX醫(yī)院') insert into Department values('神經(jīng)外科',2,'6666','XXX醫(yī)院') insert into Department values('住院手術',2,'7777','XXX醫(yī)院') insert into Department values('住院康復',2,'8888','XXX醫(yī)院')
其實思路很簡單,就是在展開父節(jié)點的時候,在父節(jié)點下插入新的DataGridViewRow;收縮父節(jié)點的時候,在父節(jié)點下刪除該子節(jié)點的DataGridViewRow。
為了簡便,代碼中的數(shù)據(jù)讀取我都直接硬編碼了。
加載父節(jié)點數(shù)據(jù),除了數(shù)據(jù)庫中的列外我還新加了兩列: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"]; //用于顯示該行是否已經(jīng)展開 row.Cells["IsEx"].Value = "false"; //用于顯示展開或收縮符號,為了簡單我就直接用字符串了,其實用圖片比較美觀 row.Cells["EX"].Value = "+"; } } }
下面就是Cell的單擊事件了,分別在事件中寫展開的插入與收縮的刪除.
插入子節(jié)點:
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,標明該節(jié)點已經(jīng)展開 this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "true"; this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "-";
刪除子節(jié)點:
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,標明該節(jié)點已經(jīng)收縮 this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "false"; this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "+"; }
這里面通過比較ID來確定一行,循環(huán)比較多,因為子節(jié)點是緊接著父節(jié)點的,我們可以確定子節(jié)點所在的行數(shù),所以用RemoveAt()方法更好。
//利用RemoveAt for (int i = table.Rows.Count; i > 0; i--) { //刪除行 this.dataGridView1.Rows.RemoveAt(i + e.RowIndex); }
上面的做法是通過不斷的插入與刪除來實現(xiàn),但這樣與數(shù)據(jù)庫的交互變得很頻繁。更好的做法應該是插入一次,然后通過隱藏或顯示行來實現(xiàn)我們的效果。
為此,我們還要在grid中新增兩個列:
IsInsert:用來判斷該行是否已經(jīng)有插入子節(jié)點數(shù)據(jù)
RowCount:用來保存該行下插入的子節(jié)點數(shù)量。
在方法DataGridBing中,綁定數(shù)據(jù)時,應該再加一列:
//是否插入 row.Cells["IsInsert"].Value = "false";
而在增加節(jié)點的時候,我們要多做一個判斷,如果IsInsert為false就插入數(shù)據(jù),如果為true就顯示數(shù)據(jù)
展開行
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 { //顯示數(shù)據(jù) 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,標明該節(jié)點已經(jīng)展開 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,標明該節(jié)點已經(jīng)收縮 this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "false"; this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "+"; }
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)網(wǎng)站建設公司,的支持。
本文名稱:利用DataGridView怎么實現(xiàn)一個展開或收縮功能-創(chuàng)新互聯(lián)
文章出自:http://www.chinadenli.net/article38/dhddpp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、定制開發(fā)、自適應網(wǎng)站、外貿(mào)建站、ChatGPT、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容