asp.net使用原生控件實(shí)現(xiàn)自定義列導(dǎo)出功能的方法
自定義列實(shí)現(xiàn)
最近負(fù)責(zé)開(kāi)發(fā)公司內(nèi)部使用的人事信息化系統(tǒng)時(shí),有一個(gè)需求是這樣的,需要在頁(yè)面中可以用戶每次導(dǎo)出Excel時(shí)自定義需要導(dǎo)出哪些列,經(jīng)過(guò)半天的琢磨和倒騰,總算完成了這個(gè)需求。寫(xiě)篇blog記錄一下小菜雞的成長(zhǎng)歷程。哈哈哈。
需求見(jiàn)截圖所示:
tbg:數(shù)據(jù)源使用DataTable、且GridView中用于綁定數(shù)據(jù)的BoundFiled列中使用的DataField全部是與CheckBox中的ID一一對(duì)應(yīng),這樣方便后面循環(huán)這些控件時(shí)進(jìn)行操作。
嘗試一
- 數(shù)據(jù)源使用的是DataTable一開(kāi)始想的是根據(jù)CheckBox的選中決定刪除Remove掉DataTable中的列,因?yàn)槊看尾樵?xún)時(shí),DataTable中的數(shù)據(jù)會(huì)重新被填充,但在實(shí)施過(guò)程中發(fā)現(xiàn),如果DataTable中的對(duì)應(yīng)列移除掉,但是GridView中的列乜有移除的話,也會(huì)報(bào)錯(cuò),想過(guò)也去移除對(duì)應(yīng)的GridView中的BoundFiled,但是在移除后又去添加與CheckBox的ID相對(duì)應(yīng)的列,如此操作非常容易出錯(cuò),而且整個(gè)for循環(huán)寫(xiě)的非常惡心,一層套一層。而且在移除對(duì)應(yīng)的DataTable列和GridView中的列之后會(huì)無(wú)法再進(jìn)行有效的添加(前端不顯示),猜測(cè)可能是回發(fā)問(wèn)題導(dǎo)致的,沒(méi)有有效解決遂放棄。
嘗試二
- 使用一個(gè)字典Dictionary存儲(chǔ)CheckBox的ID和對(duì)應(yīng)的選中狀態(tài),然后去遍歷GridView中的每一列,為每一列設(shè)置對(duì)應(yīng)的隱藏和顯示狀態(tài)。這個(gè)方案嘗試成功了哈,哈哈哈,雖然很簡(jiǎn)單,但開(kāi)心了好一陣子。下面放代碼;
DataTable dt = employeesServices.GetEmployeesDataTable(); Dictionary<string, bool> ckbInfoList = new Dictionary<string, bool>(); foreach (var control in Page.Controls) { if (control.GetType().ToString() == "System.Web.UI.HtmlControls.HtmlForm") { HtmlForm form = (HtmlForm)control; foreach (var item in form.Controls) { if (item is CheckBox) { CheckBox ckb = (CheckBox)item; if (!ckb.Checked) { ckbInfoList.Add(ckb.ID, false); } else { ckbInfoList.Add(ckb.ID,true); } } } } } //遍歷GridView列,根據(jù)Dictionary提供的內(nèi)容來(lái)決定是否隱藏。 foreach (var control in Page.Controls) { if (control.GetType().ToString() == "System.Web.UI.HtmlControls.HtmlForm") { HtmlForm form = (HtmlForm)control; foreach (var item in form.Controls) { if (item.GetType().ToString() == "System.Web.UI.WebControls.GridView") { GridView gridView = (GridView)item; foreach (BoundField col in gridView.Columns) { foreach (var keyValue in ckbInfoList) { if (keyValue.Key == col.DataField) { col.Visible = Convert.ToBoolean(keyValue.Value); } } } } } } } gv.DataSource = dt; gv.DataBind();
總結(jié)
到此這篇關(guān)于asp.net使用原生控件實(shí)現(xiàn)自定義列導(dǎo)出功能的文章就介紹到這了,更多相關(guān)asp.net原生控件自定義列導(dǎo)出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Winform OpenFileDialog打開(kāi)文件對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Winform OpenFileDialog打開(kāi)文件對(duì)話框 的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03asp.net下生成英文字符數(shù)字驗(yàn)證碼的代碼
用了asp.net隨機(jī)數(shù),獲取指定位數(shù)的字母或數(shù)字以后,進(jìn)行圖片輸出的驗(yàn)證碼函數(shù)。2009-12-12.NET 排序 Array.Sort<T> 實(shí)現(xiàn)示例
System.Array.Sort<T> 是.NET內(nèi)置的排序方法, 本文就詳細(xì)的介紹一下具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09ASP.net 動(dòng)態(tài)加載控件時(shí)一些問(wèn)題的總結(jié)
經(jīng)常見(jiàn)到有人說(shuō)在ASP.net中不要使用動(dòng)態(tài)控件,我想主要的原因在于使用動(dòng)態(tài)控件會(huì)帶來(lái)一些問(wèn)題,在做項(xiàng)目的過(guò)程中,我將由動(dòng)態(tài)加載控件引發(fā)的總是作了一個(gè)小小的總結(jié).2009-04-04.net連接Mysql封裝類(lèi)代碼 可直接調(diào)用
下面是我封裝好的連接Mysql數(shù)據(jù)庫(kù)的類(lèi),直接調(diào)用即可。2013-07-07Asp.net動(dòng)態(tài)生成html頁(yè)面的方法分享
這篇文章介紹了Asp.net動(dòng)態(tài)生成html頁(yè)面的方法,有需要的朋友可以參考一下2013-10-10Visual Studio 2017 15.5 正式發(fā)布!性能再提升
Visual Studio 2017 15.5 正式發(fā)布!性能再提升,時(shí)發(fā)布的還有 Visual Studio for Mac 7.3,亮點(diǎn)如下2017-12-12Entity Framework使用DbModelBuilder API創(chuàng)建表結(jié)構(gòu)
這篇文章介紹了Entity Framework使用DbModelBuilder API創(chuàng)建表結(jié)構(gòu)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03