欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > DataGridView展開與收縮功能實現

DataGridView展開與收縮功能實現

熱門標簽:聊城智能電銷機器人電話 安陸市地圖標注app 海東防封電銷卡 云南外呼系統代理 上海市三維地圖標注 寧德防封版電銷卡 南昌自動外呼系統線路 西寧電銷外呼系統公司 辦公用地圖標注網點怎么操作

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

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

我們來說一下在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是如何實現展開收縮的吧,希望大家不僅知道是如何實現的還要動手實驗一番,才不枉小編辛苦整理此文章哦

您可能感興趣的文章:
  • C# DataGridView綁定數據源的方法
  • C#窗體控件DataGridView常用設置
  • Winform在DataGridView中顯示圖片
  • WinForm中DataGridView折疊控件【超好看】
  • C#自定義DataGridViewColumn顯示TreeView
  • C#中DataGridView動態添加行及添加列的方法
  • DataGridView使用自定義控件實現簡單分頁功能(推薦)

標簽:衢州 崇左 平涼 青海 洛陽 汕尾 贛州 南寧

巨人網絡通訊聲明:本文標題《DataGridView展開與收縮功能實現》,本文關鍵詞  DataGridView,展開,與,收縮,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《DataGridView展開與收縮功能實現》相關的同類信息!
  • 本頁收集關于DataGridView展開與收縮功能實現的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    日本黄色动态图| 久久一二三国产| 亚洲日本成人在线观看| 国产成人综合在线观看| 大吊一区二区三区| 久久免费午夜影院| 国模套图日韩精品一区二区| 久久国产柳州莫菁门| 久久综合久久综合九色| 精彩视频一区二区三区| 国产精品成人在线视频| 国产日韩欧美不卡在线| 国产精品一区二区在线看| 成人欧美一区二区三区黑人一| 国产午夜亚洲精品羞羞网站| 国产精品亚洲一区二区三区在线| 国产白丝一区二区三区 | 久久久综合网站| 狠狠色丁香婷婷综合久久片| 美女网站视频色| 国产精品久久久久久久久晋中| 国产成人av资源| av女名字大全列表| 亚洲综合色视频| 少妇一级淫片免费放播放| 日韩欧美卡一卡二| 激情成人午夜视频| 国产激情无码一区二区三区| 亚洲天堂2014| 永久免费未满蜜桃| 日韩免费成人网| 国产一区二区三区黄视频 | 日韩影院免费视频| 亚洲天堂网一区二区| 2024国产精品视频| 成人网页在线观看| 欧美日韩一区成人| 美国欧美日韩国产在线播放| 国产在线免费看| 亚洲免费在线视频一区 二区| youjizz.com日本| 精品乱码亚洲一区二区不卡| 国产河南妇女毛片精品久久久 | 亚洲国产欧美日韩在线| 欧美日韩日本视频| 久久99久久99| 午夜av入18在线| 午夜精品一区二区三区电影天堂| 无码人妻精品一区二区中文| 国产精品三级电影| 少妇熟女视频一区二区三区| 欧美刺激脚交jootjob| 福利一区二区在线| 欧美日韩精品福利| 国内一区二区在线| 欧美午夜一区二区三区| 久久国产婷婷国产香蕉| 一本色道久久综合亚洲精品按摩| 天天色天天操综合| 69夜色精品国产69乱| 午夜精品久久一牛影视| 日韩av毛片在线观看| 亚洲成av人综合在线观看| 在线观看亚洲大片短视频| 一区二区三区在线播放| 神马久久久久久久久久久| 一区二区在线观看免费| 性猛交娇小69hd| 亚洲一区二区高清| 亚洲一级理论片| 亚洲chinese男男1069| 三级黄色免费观看| 视频一区二区三区中文字幕| h色网站在线观看| 男男成人高潮片免费网站| 一本色道久久综合亚洲aⅴ蜜桃| 麻豆精品久久精品色综合| 91黄色激情网站| 国内欧美视频一区二区| 欧美日本不卡视频| 成人高清伦理免费影院在线观看| 欧美成人a视频| 日本r级电影在线观看| 国产午夜精品理论片a级大结局| 日本50路肥熟bbw| 亚洲特级片在线| 永久免费观看片现看| 日本中文字幕一区二区有限公司| 国产va在线播放| 国产精一品亚洲二区在线视频| 51午夜精品国产| 97se亚洲国产综合自在线| 国产亚洲婷婷免费| 国产乱了高清露脸对白| 亚洲天堂久久久久久久| 久久久免费看片| 青草国产精品久久久久久| 欧美色图12p| 成av人片一区二区| 国产欧美视频在线观看| 美女脱光内衣内裤| 视频在线观看一区| 欧美日韩一区二区三区四区| 成人午夜激情视频| 中文欧美字幕免费| 欧美人与禽zoz0善交| 麻豆免费看一区二区三区| 91精品欧美一区二区三区综合在| 91视频精品在这里| 自拍偷自拍亚洲精品播放| 成人涩涩小片视频日本| 国产乱码精品一区二区三| 精品国产免费视频| 欧美黑人欧美精品刺激| 日韩 欧美一区二区三区| 91精品午夜视频| 中文在线观看免费视频| 亚洲动漫第一页| 欧美日韩精品欧美日韩精品| 色哟哟在线观看视频| 亚洲精品视频自拍| 一本到不卡精品视频在线观看 | 国产91露脸合集magnet| 日本一区二区成人| 99精品中文字幕| 国产精品系列在线播放| 亚洲国产经典视频| 国产极品美女在线| 成人精品高清在线| 日韩伦理免费电影| 在线看日韩精品电影| 91亚洲国产成人精品一区二区三| 亚洲啪啪综合av一区二区三区| av女名字大全列表| 午夜诱惑痒痒网| 亚洲成人自拍偷拍| 日韩视频在线一区二区| 亚洲第一成人网站| 精品影视av免费| 国产免费成人在线视频| 欧美黑人猛猛猛| 日批视频在线看| 婷婷丁香激情综合| 欧美电影免费观看高清完整版在线| 亚洲激情视频小说| 国产乱对白刺激视频不卡| 国产精品萝li| 欧美私人免费视频| 加勒比精品视频| 国产最新精品免费| 国产精品大尺度| 欧美在线高清视频| 妖精视频一区二区| 久久99久久99精品免视看婷婷| 中文字幕国产一区| 欧美在线观看一区| 精品久久久久久中文字幕人妻最新| 黄色资源网久久资源365| 国产精品视频九色porn| 欧美专区在线观看一区| 欧美在线一级片| 国产一区二区按摩在线观看| 亚洲欧洲三级电影| 在线成人小视频| 91导航在线观看| 91一区二区在线观看| 日韩av中文字幕一区二区三区| 久久久久久久久久久久久久久99 | 国产一二三区精品| 亚洲 自拍 另类 欧美 丝袜| 蜜臀av一区二区在线观看| 国产精品网站在线观看| 欧美日本一区二区在线观看| 日韩人妻无码精品综合区| gogogo免费视频观看亚洲一| 丝袜美腿亚洲色图| 欧美激情综合五月色丁香小说| 欧洲另类一二三四区| 国产av自拍一区| 91猫先生在线| 精品系列免费在线观看| 亚洲精品久久嫩草网站秘色| 精品国产精品一区二区夜夜嗨| 色狠狠色噜噜噜综合网| 在线观看福利片| 免费高清视频在线观看| 国产在线视视频有精品| 亚洲一区二区三区精品在线| 久久精品日韩一区二区三区| 欧美日韩精品一区二区三区四区 | 久久九九全国免费| 欧美视频一区二区三区在线观看 | 婷婷一区二区三区| 中文无字幕一区二区三区| 欧美一区二区女人| 91国产免费看| 一级片黄色录像| 亚洲黄色在线网站| 男男受被啪到高潮自述| 国产电影精品久久禁18|