顯示具有 WebUserControl 標籤的文章。 顯示所有文章
顯示具有 WebUserControl 標籤的文章。 顯示所有文章

2011年2月11日

[NPOI] 輕鬆地將 GridView 匯出成試算表-修正版

之前坎尼有發佈一版 Web User Control,讓 GridView 可以輕鬆匯出成 Excel
(詳見 [NPOI] 輕鬆地將 GridView 匯出成試算表)

後來有讀者發信來問:「為什麼他匯出的檔案標題列都是空白?」
經一番追查之後發現,原來是 GridView 啟用了排序 (AllowSorting)
HeaderText 會自動轉換成 LinkButton
以至於原本抓取標題部分的程式碼只抓到空白文字

於是坎尼稍做了一下修改,如下圖紅框所示
ec_01 
可以看到,不論標題是否可排序
新版本的 Web User Control 仍可以抓取標題文字
ec_02 
ec_03 

請有需求的讀者到 這邊 下載

2010年12月11日

[NPOI] 輕鬆地將 GridView 匯出成試算表

相信大家都遇過要將資料匯出成 Excel 的問題
這次坎尼用 NPOI 製作匯出用的 WebUserControl
如果以後有相同需求,不介意就直接拿去用吧 :D

I. 實作過程

首先,建立一個 WebUserControl
在畫面上加入按鈕,用來觸發匯出事件 nec_01
接著建立兩個屬性:TargetGridViewIDSheetName
TargetGridViewID 用來指定要匯出的 GridView
SheetName 則是匯出的試算表名稱 nec_02
進入按鈕事件,這邊唯一要做的事,就是去找引用頁面的 GridView
找到之後丟給 ExportToFile 這個 method 就沒事了 (十分輕鬆)nec_03接著到 ExportToFile(GridView gv)
這邊可參考 NPOI 建立試算表的方法,不再多提
要注意的就是抓取 GridView 欄位數時,不用要 Columns.Count
而是改用 HeaderRow.Cell.Count nec_04 大功告成,其他部分的 Code 有興趣的話可以到這邊下載

II. 測試

建立一個測試頁面,把剛做好熱騰騰的 WebUserControl 放上去
接著再加入 GridView 及設定其繫結事件
設定 UserControl 的 TargetGridViewID 及 SheetName 屬性 nec_05 執行測試頁面,點下匯出之後即會把資料轉換成試算表 nec_06
怎樣,是不是很簡單呢?

III. 小結

這次只陽春地做出了匯出功能
使用上也限制了 GridView 不能啟動分頁

如果要加入自定樣式或是分頁也可以匯出的功能
可將 Source Code下載回去自行修改
坎尼有空再來擴充這個 UserControl 的功能 : )

2011/02/11 修改:User Control 已有新版本,請前往 連結 下載新的檔案

2009年2月27日

與 UserControl 動態產生的控制項互動

就在前幾天在瀏覽各大部落格的文章時,
看到 Johnny 大大寫的這篇 [UserControl] 網頁生命週期與取不到 UserControl 資料的問題
原本坎尼已經快睡著了,看到結論的地方突然醒了!!!!!

還記得坎尼之前寫了一篇 如何設定UserControl中動態產生的控制項初始值
坎尼當時的著眼點在 Page_Load
一直都忘了 Page_Init... Page_Init... Page_Init...
於是坎尼又做了下面的測試

新增一個 UserControl ,裡面加入一個 DropDownList
並在 Page_Init 事件動態增加項目


新增一個 WebForm,並將剛剛的 UserControl 引用到頁面上

在剛剛的WebForm 的 Page_Load 事件
加入指定的 SelectedIndex

執行畫面,並未出現 "未設為執行個體" 的 Exception
登登~~成功~~


所以坎尼之前那次的研究還真的是繞了不少路啊 (汗)

坎尼記得坎尼的朋友小馬王有寫過 ASP.NET生命週期的文章
有興趣的人可以看看

最近加入了圖片放大的Script
使用上有什麼意見可以回覆這篇文章或寄信
(Tim你就別來亂了...說什麼很噁心)

2009年1月12日

如何設定UserControl中動態產生的控制項初始值

今天講的這個也是坎尼一年前遇到的問題
但到最近才因同事的一句話而發現今天要示範的作法

首先 先來講解一下事件大綱
從前從前,坎尼的同事寫了支 UserControl--用來顯示某種類別的下拉選單
當然是動態的從資料庫撈出來給使用者選擇

新增時一切運作正常
修改時卻因某種緣故 一直無法指定類別 (使用者新增時設定的)

說到這邊 那個"某種緣故"請參考 UserControl 事件的觸發順序
「原來是事件順序不同 所以在 Page_Load 時 UserControl 卻還沒產生下拉的選項」
坎尼雖然當時知道了這個 卻不知道該如何解決
因為 Google 到的資料 好像都要去改寫事件的觸發順序?
(懶惰如坎尼 當然就放棄這個作法 自己重新在頁面上放個下拉選單重寫事件 XD)

最近同事的一句:「不知道可不可以傳參數?」
坎尼頭上閃過了新人類閃電符號 「そこだ!!!!」馬上去試驗了這個作法
以下來看範例

首先是 UserControl (vs 2008的切割畫面真好用)
畫面上有個未繫結的 DropDownList

然後是執行頁
這邊分別做了來源頁 (有RadioButtonList)

和目的頁 (只放 UserControl)


接著來看關鍵的UserControl裡的事件

由上圖可以看到
第一次執行時 會動態的加入下拉選項
由於上述的動作 會造成 UserControl1.FindControl 的方式抓不到選項
所以坎尼加了個 mySelectedValue 屬性
並在 UserControl 的 Page_Load 時去判斷有沒有值 再指定給 ddl

使用上很簡單 只要把要選擇的 value 指定給 mySelectedValue 即可

下圖為實際執行畫面


如此就可以輕鬆的把值指定給 UserControl 中的動態控制項
不用再去 override 原本的 Page_Load 事件
最後是這次的範例程式 點我下載

補充1.
若是下拉選單非動態產生 (就是自己已經先加入)
直接使用 FindControl 再去指定即可

補充2.
上述的方法適用於不會 AutoPostBack 的 UserControl
若是引發了 PostBack 會造成 UserControl 的屬性值消失
解法就是 頁面指定屬性的那段要寫在 Page_Load 裡
讓頁面每次刷新時 再次去指定屬性給 UserControl

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D