See Sara Ford's WebLog for more information.
Lots of handy tips of VS 2008 to learn about! :)
2008年6月30日
2008年6月27日
SQL 語法 max、mix、count...取值觀念釐清
還記得坎尼在 自定固定長度流水號的方法 中有提到過
要取得新ID 必需先將目前ID最大值給傳入嗎?
坎尼的作法就是利用 T-SQL 語法中的 select max(id) from table 來取得最大值
而最近坎尼一直在改同事的程式,發現到一個怪現象
他們一樣和坎尼用 max 去抓取目前最大值 id
然後回傳的是 DataTable,接著再用 DataTable.Rows.Count 去判斷
if(DataTable.Rows.Count != 0)
ID = DataTable.Rows[0][0].ToString();
else
ID = "0";
有人看出哪不對勁了嗎?
大家先看一下下列美美的抓圖




知道為什麼坎尼要下第一個 select 語法嗎?
第一個 select 不是什麼東西都抓不到嗎?
沒錯! 就是什麼都抓不到!
此時若是把這個查詢塞進一個 DataTable 中,DataTable.Rows.Count = 0
那為什麼要提這個呢?
原因就在於
當我們用 max、min 、count、avg....等語法時
如果資料表內無資料
它仍然會回傳一個值 (count是回傳0,max min avg則是回傳null)
所以,上述的判斷條件式應該改為
if(DataTable.Rows[0][0].ToString() != "")
ID = DataTable.Rows[0][0].ToString();
else
ID = "0";
同樣的bug坎尼已經抓過數次 (還是不同的同事寫的 囧>
所以提出此觀念讓還不知道的人了解一下
以上測試環境皆以 MS SQL 2000 為基準
課後補充
坎尼prefer的作法是,用MS SQL裡的 IsNull來判斷 (Oracle是NVL)
這樣抓取資料的人也不用再去判斷來判斷去
語法是 select IsNull(max(ID) , 0) as MaxID from Table
要取得新ID 必需先將目前ID最大值給傳入嗎?
坎尼的作法就是利用 T-SQL 語法中的 select max(id) from table 來取得最大值
而最近坎尼一直在改同事的程式,發現到一個怪現象
他們一樣和坎尼用 max 去抓取目前最大值 id
然後回傳的是 DataTable,接著再用 DataTable.Rows.Count 去判斷
if(DataTable.Rows.Count != 0)
ID = DataTable.Rows[0][0].ToString();
else
ID = "0";
有人看出哪不對勁了嗎?
大家先看一下下列美美的抓圖




知道為什麼坎尼要下第一個 select 語法嗎?
第一個 select 不是什麼東西都抓不到嗎?
沒錯! 就是什麼都抓不到!
此時若是把這個查詢塞進一個 DataTable 中,DataTable.Rows.Count = 0
那為什麼要提這個呢?
原因就在於
當我們用 max、min 、count、avg....等語法時
如果資料表內無資料
它仍然會回傳一個值 (count是回傳0,max min avg則是回傳null)
所以,上述的判斷條件式應該改為
if(DataTable.Rows[0][0].ToString() != "")
ID = DataTable.Rows[0][0].ToString();
else
ID = "0";
同樣的bug坎尼已經抓過數次 (還是不同的同事寫的 囧>
所以提出此觀念讓還不知道的人了解一下
以上測試環境皆以 MS SQL 2000 為基準
課後補充
坎尼prefer的作法是,用MS SQL裡的 IsNull來判斷 (Oracle是NVL)
這樣抓取資料的人也不用再去判斷來判斷去
語法是 select IsNull(max(ID) , 0) as MaxID from Table
2008年6月26日
Gridview 排序及換頁
根據上篇 錯誤的示範 (這篇的東西看看就好)
坎尼決定開個新頁面來測一下 paging 及 sorting事件
首先提幾個上篇有誤的地方
1. paging事件仍然要重新取得 DataSource
坎尼上篇沒寫也有作用的原因是:我在 postback 有寫個 bind method 囧>
2. 同上點,排序及換頁都要重新取得 DataSource 然後 DataBind()
於是乎,估狗大神講的都是對的
坎尼不應該對神不敬 orz
下面的作法和各位在網路上查到的排序換頁事件應該差不多
如果你已對這個東西很熟了,不仿再看一下 XDDD

首先,先建立ViewState來記錄排序的順序及欄位

繫結 method
其中 GetDataTable() 是坎尼用來抓北風資料庫資料的 method
等等排序及換頁事件都會呼叫本 method

換頁事件,很簡單,改個 PageIndex 然後呼叫 GetData()

排序事件,判斷的條件和上篇一樣
若是欄位和上次不同,一律用遞增
若是欄位相同,再去判斷排序為遞增或遞減
最後再去呼叫 GetData()
坎尼最近出差幫同事修bug
同事的天才程式讓坎尼改的腦袋都不靈光囉
所以上篇請各位當作笑話看看就好
坎尼決定開個新頁面來測一下 paging 及 sorting事件
首先提幾個上篇有誤的地方
1. paging事件仍然要重新取得 DataSource
坎尼上篇沒寫也有作用的原因是:我在 postback 有寫個 bind method 囧>
2. 同上點,排序及換頁都要重新取得 DataSource 然後 DataBind()
於是乎,估狗大神講的都是對的
坎尼不應該對神不敬 orz
下面的作法和各位在網路上查到的排序換頁事件應該差不多
如果你已對這個東西很熟了,不仿再看一下 XDDD

首先,先建立ViewState來記錄排序的順序及欄位

繫結 method
其中 GetDataTable() 是坎尼用來抓北風資料庫資料的 method
等等排序及換頁事件都會呼叫本 method

換頁事件,很簡單,改個 PageIndex 然後呼叫 GetData()

排序事件,判斷的條件和上篇一樣
若是欄位和上次不同,一律用遞增
若是欄位相同,再去判斷排序為遞增或遞減
最後再去呼叫 GetData()
坎尼最近出差幫同事修bug
同事的天才程式讓坎尼改的腦袋都不靈光囉
所以上篇請各位當作笑話看看就好
2008年6月23日
VS 2005 排序事件
古人說「不管是DataGrid或是GridView,總有一天會遇到 Sort」
坎尼就是一直為這個排序事件苦惱
雖然從 VS 2003 時代 升級上來 VS 2005,DataGrid 也多了個兄弟叫 GridView
可是這個Sort事件一直沒有更簡單的寫法
(不要提 DataSource 那個會讓坎尼變精靈工程師的東西)
看看那個 Paging 事件,人家只要簡單的兩行就可解決
gv.PageIndex = e.NewPageIndex;
gv.DataBind();
坎尼一直天真的認為,Sorting應該也是這麼人性化才對
gv.SortDirection= SortDirection.Ascending;
gv.SortExpression = e.SortExpression;
gv.DataBind();
恩、Exception? gv.SortDirection 及 gv.SortExpression 為 唯讀 (翻桌)
後來坎尼去問了 估狗 大神
看到大家都是在Sorting做完判斷,再丟去另外個函式重新Bind
但是坎尼遇到的情況是,同一個Gridview會有兩種以上的DataSource
所以想出了下面這個方法 (當然部分是參考別人的寫法)

一樣要來解釋一下 (雖然註解都寫的差不多了)
首先,先取得 gv.DataSource 並放到一個 DataView 之中
再來,取得用 ViewState 記錄的 SortDirection 和 SortExpression
接著,再判斷如何排序 (方式請見上圖註解)
最後,利用 DataView.Sort 屬性進行排序,再 Bind 回 Gridview
別忘了把目前的 SortDirection 和 SortExpression 記錄在 ViewState中
好了 排序完成 收功
不過目前這個排序判斷版本仍稍為有點問題
可能要加上更加精確的判斷
只是坎尼目前修別人的bug已經修到腦子裡都是漿糊了
方法各位就請自行補完吧 哈 ^^
補充一點 (剛剛發現的)
圖裡的 gv.DataSource 可以直接用 DataView 來接
是因為坎尼在繫結事件時是寫 gv.DataSource = ds.Table[0].DefaultView;
若是寫成 gv.DataSource = DataSet1; (或是 gv.DataSource = DataTable1;)
此時在程式裡的 gv.DataSource 轉型就要注意
再補充一點
這段code只能用在只排序不分頁的事件中
所以....
並不適用於坎尼的這個case中
啊啊 又要想新的解法了 Orz
坎尼就是一直為這個排序事件苦惱
雖然從 VS 2003 時代 升級上來 VS 2005,DataGrid 也多了個兄弟叫 GridView
可是這個Sort事件一直沒有更簡單的寫法
(不要提 DataSource 那個會讓坎尼變精靈工程師的東西)
看看那個 Paging 事件,人家只要簡單的兩行就可解決
gv.PageIndex = e.NewPageIndex;
gv.DataBind();
坎尼一直天真的認為,Sorting應該也是這麼人性化才對
gv.SortDirection= SortDirection.Ascending;
gv.SortExpression = e.SortExpression;
gv.DataBind();
恩、Exception? gv.SortDirection 及 gv.SortExpression 為 唯讀 (翻桌)
後來坎尼去問了 估狗 大神
看到大家都是在Sorting做完判斷,再丟去另外個函式重新Bind
但是坎尼遇到的情況是,同一個Gridview會有兩種以上的DataSource
所以想出了下面這個方法 (當然部分是參考別人的寫法)

一樣要來解釋一下 (雖然註解都寫的差不多了)
首先,先取得 gv.DataSource 並放到一個 DataView 之中
再來,取得用 ViewState 記錄的 SortDirection 和 SortExpression
接著,再判斷如何排序 (方式請見上圖註解)
最後,利用 DataView.Sort 屬性進行排序,再 Bind 回 Gridview
別忘了把目前的 SortDirection 和 SortExpression 記錄在 ViewState中
好了 排序完成 收功
不過目前這個排序判斷版本仍稍為有點問題
可能要加上更加精確的判斷
只是坎尼目前修別人的bug已經修到腦子裡都是漿糊了
方法各位就請自行補完吧 哈 ^^
補充一點 (剛剛發現的)
圖裡的 gv.DataSource 可以直接用 DataView 來接
是因為坎尼在繫結事件時是寫 gv.DataSource = ds.Table[0].DefaultView;
若是寫成 gv.DataSource = DataSet1; (或是 gv.DataSource = DataTable1;)
此時在程式裡的 gv.DataSource 轉型就要注意
再補充一點
這段code只能用在只排序不分頁的事件中
所以....
並不適用於坎尼的這個case中
啊啊 又要想新的解法了 Orz
2008年6月22日
A Survey of .NET Languages And Paradigms
see this MSDN Article.
裡面也有講到 F# 喔,不過我也才剛看了前面兩段 :p
不知道甚麼時候我才有空整理 5/24 那次微軟研討會 (.NET 3.5 & F#)的報告,
看來除非我週末要非常認真,都不休息才有可能吧 ..Orz
裡面也有講到 F# 喔,不過我也才剛看了前面兩段 :p
不知道甚麼時候我才有空整理 5/24 那次微軟研討會 (.NET 3.5 & F#)的報告,
看來除非我週末要非常認真,都不休息才有可能吧 ..Orz
2008年6月21日
幾個好用的 VS.NET 快速鍵
1. CTRL + TAB = 切換.NET開啟視窗
這是坎尼前幾天才發現的快速鍵
剛發現時驚為天人 以後就不需要用滑鼠去點左上角的 ▼ 了
(不過坎尼前幾天才被指出快速鍵用太多 左手腕部要多注意 orz)
Ctrl + Tab 會出現目前有開啟的頁面 及 目前有使用的工具
按了 Ctrl + Tab 後 再按一次 Tab會跳往下一個頁面
另外,按了Ctrl + Tab後,Tab就可以放開了 ( Ctrl 還要按住)
此時可以用十字鍵或滑鼠選擇要到的頁面或工具視窗
選完後再放開 Ctrl 就行了
2005的畫面

2008的畫面 多了內容顯示且超漂亮

2. #region後 + Tab = 自動 endregion
如果常用region的人應該要會這招
個人認為region在2003時可說是非常難用,但05之後又是另一回事
只要在鍵完 #region 後按 Tab 就會出現下圖的畫面

此時可以按 backspace 把 MyRegion消掉 換成自定的Region Name
輸入完名稱之後按 Enter 即可
3. Ctrl + G 跳至指定行數
這是和 Ctrl + F 功能差不多的快速鍵
坎尼認為非常實用,搭配 Ctrl + F 就可以讓你悠游在上萬行的程式碼中

4. aspx頁面 + F7 = 進入後端 Code
這也是坎尼常用的快速鍵之一 (都一直用快速鍵,難怪會被警告)
前後端切換就不用再去點 方案總管 → 檢視程式碼
另外剛剛做了測試
若是頁面為 "不另存cs檔" 的格式 按下F7只會切換至頁面Source
5. cs頁面 + shift + F7 = 進入 aspx 頁面 (如果有的話)
第4點的兄弟,故不贅述
今天好用的快速鍵就介紹到這邊
其他像 Ctrl + C、Ctrl + V .....那些大家都很常用的就不提了
若是還有其他好用的快速鍵 坎尼會再分享給大家
當然也歡迎大家留言提供 ^^
這是坎尼前幾天才發現的快速鍵
剛發現時驚為天人 以後就不需要用滑鼠去點左上角的 ▼ 了
(不過坎尼前幾天才被指出快速鍵用太多 左手腕部要多注意 orz)
Ctrl + Tab 會出現目前有開啟的頁面 及 目前有使用的工具
按了 Ctrl + Tab 後 再按一次 Tab會跳往下一個頁面
另外,按了Ctrl + Tab後,Tab就可以放開了 ( Ctrl 還要按住)
此時可以用十字鍵或滑鼠選擇要到的頁面或工具視窗
選完後再放開 Ctrl 就行了
2005的畫面

2008的畫面 多了內容顯示且超漂亮

2. #region後 + Tab = 自動 endregion
如果常用region的人應該要會這招
個人認為region在2003時可說是非常難用,但05之後又是另一回事
只要在鍵完 #region 後按 Tab 就會出現下圖的畫面

此時可以按 backspace 把 MyRegion消掉 換成自定的Region Name
輸入完名稱之後按 Enter 即可
3. Ctrl + G 跳至指定行數
這是和 Ctrl + F 功能差不多的快速鍵
坎尼認為非常實用,搭配 Ctrl + F 就可以讓你悠游在上萬行的程式碼中

4. aspx頁面 + F7 = 進入後端 Code
這也是坎尼常用的快速鍵之一 (都一直用快速鍵,難怪會被警告)
前後端切換就不用再去點 方案總管 → 檢視程式碼
另外剛剛做了測試
若是頁面為 "不另存cs檔" 的格式 按下F7只會切換至頁面Source
5. cs頁面 + shift + F7 = 進入 aspx 頁面 (如果有的話)
第4點的兄弟,故不贅述
今天好用的快速鍵就介紹到這邊
其他像 Ctrl + C、Ctrl + V .....那些大家都很常用的就不提了
若是還有其他好用的快速鍵 坎尼會再分享給大家
當然也歡迎大家留言提供 ^^
2008年6月19日
"<" + "/script>" 的迷思
今天和Tim討論到標題這個東西
以前我同學在組前端的 javascript code 時
總會看到他在最後結尾時 把"</script>" 拆成 "<" + "/script>"
當時書上似乎也都是這麼作 所以我們都把它當成理所當然
不過就在多年後 坎尼總覺得怪怪的 為什麼不寫在一起就好了呢?
經過多次試驗 "</script>" 一直很正常啊 怪怪~
後來坎尼發現了以下的解釋 (以下講的都是個人推論 有錯請指正 ^^)
首先,坎尼認為會拆成兩段來寫的原因是:
這是個把程式寫在前端的aspx
我們直接看下圖用實例來說明
'
基本上大多數的人在新增一個頁面時
並不會把 將程式碼置於個別檔案中 這個打勾給去掉
所以我們會看到 aspx 和 aspx.cs 兩個檔案
但若是把打勾去掉呢? 那麼原本要寫在cs裡的code 就會變成寫在前端
此時aspx的頁面會在最上方增加 <script runat="server"></script>
所有的事件程式撰寫都會在這個範圍內

所以當我們要在後端輸出 javascript時 (如上圖)
寫下 Response.Write("<script> alert('aaa'); </script>") 時
.net 會跟你講這段程式碼有誤
所以坎尼猜,大概是它直接把 </script>
當成是最前面的 <script runat="server"> 的結尾
不過很神奇的是,若是我們把結束的 </script> 給拆開 (如下圖)
就又一切安然無事....

當然,以上那種情形在目前也不常見啦 (現在寫前端的應該不多吧?)
當時坎尼剛學 .net 時,剛好是 asp 轉 asp.net
很多人似乎都是從 asp 轉型過來 所以仍是習慣在前端頁面寫些東西
而那時看的書也都教這種 寫在前端 的方式
所以當時的人大概發現了 直接寫 "</script>" 來結束 javascript 行不通
於是乎都演變成 拆開寫 這種方式
以上純屬坎尼猜測
至於在 .cs 裡去撰寫呼叫 javascript
請安心的寫 </script> 吧 至少坎尼寫到現在都沒看到有誤
如果真的這麼寫會出錯...那就............寄信來跟坎尼說一下吧 XD
以前我同學在組前端的 javascript code 時
總會看到他在最後結尾時 把"</script>" 拆成 "<" + "/script>"
當時書上似乎也都是這麼作 所以我們都把它當成理所當然
不過就在多年後 坎尼總覺得怪怪的 為什麼不寫在一起就好了呢?
經過多次試驗 "</script>" 一直很正常啊 怪怪~
後來坎尼發現了以下的解釋 (以下講的都是個人推論 有錯請指正 ^^)
首先,坎尼認為會拆成兩段來寫的原因是:
這是個把程式寫在前端的aspx
我們直接看下圖用實例來說明
'基本上大多數的人在新增一個頁面時
並不會把 將程式碼置於個別檔案中 這個打勾給去掉
所以我們會看到 aspx 和 aspx.cs 兩個檔案
但若是把打勾去掉呢? 那麼原本要寫在cs裡的code 就會變成寫在前端
此時aspx的頁面會在最上方增加 <script runat="server"></script>
所有的事件程式撰寫都會在這個範圍內

所以當我們要在後端輸出 javascript時 (如上圖)
寫下 Response.Write("<script> alert('aaa'); </script>") 時
.net 會跟你講這段程式碼有誤
所以坎尼猜,大概是它直接把 </script>
當成是最前面的 <script runat="server"> 的結尾
不過很神奇的是,若是我們把結束的 </script> 給拆開 (如下圖)
就又一切安然無事....

當然,以上那種情形在目前也不常見啦 (現在寫前端的應該不多吧?)
當時坎尼剛學 .net 時,剛好是 asp 轉 asp.net
很多人似乎都是從 asp 轉型過來 所以仍是習慣在前端頁面寫些東西
而那時看的書也都教這種 寫在前端 的方式
所以當時的人大概發現了 直接寫 "</script>" 來結束 javascript 行不通
於是乎都演變成 拆開寫 這種方式
以上純屬坎尼猜測
至於在 .cs 裡去撰寫呼叫 javascript
請安心的寫 </script> 吧 至少坎尼寫到現在都沒看到有誤
如果真的這麼寫會出錯...那就............寄信來跟坎尼說一下吧 XD
訂閱:
文章 (Atom)
Google Spreadsheet 裡用規則運算式
最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D
-
好久沒開 Chart Control 議題了 剛好前陣子 Codeplex 出現可以輕鬆建立 Excel 檔案的 Library- NPOI 於是坎尼想說研究一下,看能不能把 Chart Control 匯出圖片到 Excel 中 沒想到只花了不到1小時就研究...
-
雖然在圖片上直接按右鍵就可以另存圖片 (沒設定權限的話 不過客戶還是想要有個按鈕能讓圖片下載 所以坎尼只好再想辦法滿足客戶的需求 UI設定 首先,在畫面上準備好下載按鈕和圖表 順便設定一下樣式和內容,這部分之前講過很多次就不多談了 撰寫按鈕事件 先宣告 System.IO.Mem...
-
拖稿拖了好幾天 坎尼夢見了富檻出新連載 所以上來把欠的東西還一還 (富檻快給我畫 坎尼廢話就少講一點 直接進入 自訂分頁 Sample 首先,畫面上要有個 Gridview 這邊坎尼偷懶用了 SqlDataSource 見下圖 可以看到 Pager 已經出現了 來看一下...