Wednesday, March 28, 2007

偷渡檔案到使用者的電腦裡

使用者如果不想用如InstallShield之類的安裝方法來發佈程式
但是,又想要在執行檔執行時,偷放一些檔案到安裝的電腦上
這時候,我們可以運用資源檔(Resource)
把想要偷渡的檔案包在執行檔裡面
同樣的
VS2005也大幅簡化了實做的方法
以下的例子,是偷渡一個spftp.exe到系統目錄的步驟
因為最近實在懶得打字
就抓圖片讓大家一個步驟一個步驟的看圖說故事

1.從專案中加入一個新的項目



















2.選擇資源檔













3.在資源檔的畫面中,加入現有的檔案











4.選擇spftp.exe


















5.將spftp.exe的屬性[建置動作]設為[內嵌資源]
























6.程式基本上先判斷spftp.exe是否存在system32資料夾裡,如果沒有的話,就塞進去













您也可以用同樣的方法
塞圖片或字串到資源檔裡
應用很廣,以後有空再介紹

Tuesday, March 20, 2007

關於ComboBox(Part2)

現在來談談看起來簡單,作起來困難的ComboBox技巧

Part2:
ComboBox選擇完成之後,要依照選擇的項目,修改ComboBox的文字
如下拉選單選[1.20070531 測試測試]
選完之後只顯現[測試測試]就好

Ans 2:
看來簡單的問題德瑞克卻搞好久
各位也許會說:
不就只需要在ComboBox的SelectedIndexChanged事件裡面
修改ComboBox的Text就好了嗎?

如果只是這樣的話
ComboBox的文字是一動也不會動的
德瑞克只好把腦筋動到Windows API上面

1.首先在Form上面加上參考
Imports System.Runtime.InteropServices
Imports System.Threading

2.將SetWindowText這個API加進來
Public Shared Sub SetWindowText(ByVal Handle As Integer, ByVal s As String)

3.在ComboBox的SelectedIndexChanged事件裡面開啟另外一個執行緒
去修改ComboBox的文字內容
在此要注意
我們須多加上
Control.CheckForIllegalCrossThreadCalls = False
讓UI可以被其他執行緒更改其值
不然會發生錯誤
執行緒的程式有些小複雜
我還是把整個程式Post出來
讓有興趣的人研究
如果您有更簡單的解決方法也請不吝告知

關於ComboBox(Part1)

User的需求總是沒有止境

而程式設計師的任務,就是在日新月異的技術中

服務User天馬行空的要求


最近苦命的德瑞克又遇到了幾個新的需求

而這些需求又正好都跟ComboBox有關

就順便介紹一下VS2005中ComboBox的一些新功能


下面這兩個需求

Part1 看來困難,作起來卻很簡單

Part2 看來簡單,作起來卻有點困難


Part1:ComboBox

需有自動完成功能

如使用者輸入[X]

下拉選單會出現與[X....]相關的選項


Ans 1:

在以前,不管是VB或是VC

要做到下拉選單的自動完成

是有一定的難度

但是VS2005中ComboBox的新功能

就包含自動完成了

只要將ComboBox屬性中

AutoCompleteMode設為Suggest

AutoCompleteSource設為ListItems

就可以達到自動完成的需求

當然上面那兩個選項還有其他很彈性的設定

在此就不多介紹

總之VS2005幫程式設計師省去了很多麻煩

令人驚嘆

Wednesday, March 07, 2007

DataGridView 怎麼 Click?

在使用DataGridView物件來呈現我們的資料時,最常需要撰寫它的Click()事件

通常,VB的使用者會在設計畫面上double Click,讓程式產生一個函式來撰寫Click事件的程式碼,可是.net預設產生的會是CellContentClick()事件,這個事件處理的是儲存格裡面的資料點選之後才會被觸發

如果我們以這個作為Click()事件時,程式執行後,會發現點選Grid時笨笨的,有時有觸發到,有時沒有。

其實,正確的作法應該是選取它的CellMouseClick()才對,這樣每次點選,該事件都能夠被觸發,用起來也不會笨笨的,同理,DoubleClick()也應該選取CellMouseDoubleClick。

Stored Procedure回傳值的接收方法

相信很多人會照著書上的方法,為了想要能夠從Stored Procedure中接收回傳值,將SqlCommand的CommandType設為StoredProcedure,然後一個一個的Parameter設定型態、值、傳入傳出方法,慢慢的一個一個參數設定下去

如果Stored Procedure的參數少的話還好,參數一多起來程式可是會搞死人,建議您使用比較方便的方法



直接將回傳的參數寫在Sql語法裡面,這樣一來,就可以省下command參數裡面許多煩人的設定了

Right不見了

在以前VB中,有一個不錯的字串函式Right(),現在.net把它包裝在Microsoft.VisualBasic這裡

其實可以發現到,微軟還是偏愛Visual Basic,以前Visual Basic所有的函式,在這個參考裡面都可找的到,而且,使用Visual Basic作開發專案時,[插入程式碼片段]也比使用C Sharp來的豐富

Mid切字會錯誤?

因為.net String預設以UTF8的格式來進行儲存與運算,所以,即使是中文字,它也只算作一個字在處理

這對於一些需要做切字,如上下行電文來說,將會非常的困擾,如果有中英夾雜的一個字串,想要正確的切出字串固定長度的資料,使用預設的String物件,將無法切得正確的資訊

以下,是一個可正確切得字串裡部分資料的函式,中文算成2個bytes


Tuesday, March 06, 2007

如何讓使用者用Enter鍵代替Tab鍵使用

許多使用者,還是習慣按下enter鍵之後,游標會從上一個控制項,跑到下一個控制項
這種操作習慣,並不會隨著開發工具的更新而更新

不過,我們還是有因應的方法的

1. 在Form的屬性裡,先將KeyPreview設為True

2. 在Form的Keypress事件裡,加入下面程式碼



如此一來,使用者就可以用enter鍵來代替tab鍵使用了

含有Reporting Service的程式,在用戶端沒辦法開報表檔?

我們做好的程式,如果其中含有Reporting Service的Viewer,即使使用者端有灌好.net 2.0的Framework,還是沒有辦法開啟報表檔的,使用者端還需要灌Reporting Service的Redistribution Pack,這個Pack在有開發環境的電腦裡面都有

轉發套件
Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\ReportViewer\ReportViewer.exe
語言套件
Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\ReportViewer\zh-CHT\ReportViewerLP.exe

語言套件可灌可不灌,如此,客戶端就可以看報表了

如何讓Reporting Service一頁固定列印三筆(N筆)

在苦命的銀行專案生涯進行當中,接觸了一種叫傳票的東東時,使用者會希望一頁固定要三筆資料顯現,這時就要用到Reporting Service的清單(list)物件了,以下列出作法步驟(以A4紙列印為例)

1. 將報表大小調整成A4的尺寸,請參考之前Reporting Service如何設定列印紙張為橫式的方法

2. 拉一個list物件,將其高度設定為略小於 (29.7/3)cm

3. 將list物件放置在最上方

4. 在list物件裡,拉出報表格式

重點來了

現在如果預覽報表,會發現可能有些頁面有三筆,有些有兩筆,並沒有辦法滿足我們的需求,這時,在list物件上面按右鍵,會出現一個[清單屬性]對話框,裡面有一個選項:[儘可能將清單配置於單一頁面上],將它打勾,這樣,每頁報表就可以正常顯現三筆了

Reporting Service預覽還沒跑完就關掉,會有error產生?

在預覽報表時,reporting service是一頁一頁去產生報表的預覽的,這時,如果使用者心急,把報表預覽畫面切掉,程式會產生一個exception(Invoke or BeginInvoke Error),消除方法如下

1. 在放置報表元件ReportViewer的Form上面,的[類別名稱]下拉選單中,選擇該Form的事件如下圖



2. 然後在該Form的FormClosing裡面加上程式碼如下



其中放置的數字為等待時間,0代表馬上結束,-1代表等待Viewer結束之後回傳,通常放-1讓Viewer自己結束之後再關掉會比較好

Reporting Service跑出比原本預期的還多頁(空白頁)?

在預覽表時,原本只有兩三頁的報表,列印出來時,突然印出了多一倍的頁面,浪費了紙張,這時,我們就要去檢視一下報表本身的size。

首先,我們要知道,報表檔預覽列印所顯示的頁數跟整頁模式所顯示的頁數是不一樣的,列印時會依照列印紙張大小來調整列印的頁數,所以是以整頁模式所顯示的頁數為準,之前介紹過如何調整列印紙張的大小,現在我們要依照列印紙張來調整我們報表的大小,使其不至於超過紙張大小而多印出來沒有必要的空白頁

1. 開啟報表檔(rdlc),選擇[報表] -> [報表屬性],開啟報表屬性對話框,切換到[配置]頁簽,看看頁寬與頁高的尺寸,然後看一下左邊界、右邊界、上邊界、下邊界,記下他們的邊界值

2. 再檢查報表(rdlc)屬性的size值,通常寬度會造成空白頁的產生,所以 (報表屬性.頁寬) – (左邊界) – (右邊界) 必須要大於 (報表檔. Width)

3. 如果經過調整之後,還是有空白頁的產生,那就將報表再縮減一些,多調整幾次,應該就不會有空白頁的產生了。

Reporting Service如何設定列印紙張為橫式(調整大小)?

相信很多人在剛剛接觸Reporting Service時,會不知道怎樣設定列印紙張大小,一般來說,Reporting Service會依照報表的大小尺寸,自動選擇列印紙張,如A4 (21cm, 29.7cm)

但是問題來了,如果今天我們想要設定報表為橫印,雖然在rdlc檔屬性裡面設定它的size為(29.7cm, 21cm),列印紙張大小還是沒辦法調整成橫式的,設定方法其實很簡單:

1. 首先先開啟您要橫印的報表檔(rdlc),這時,VS2005就會多了一項[報表]的選單在上面
2. 選擇[報表] -> [報表屬性],開啟報表屬性對話框,切換到[配置]頁簽,將頁寬設定為29.7cm,頁高設定為21cm

如此一來,您在預覽報表時,切換到整頁模式,就會發現報表的紙張設定已經設定為A4橫式了。

還要Lost Focus嗎?

以前VB在檢查TextBox的內容時,習慣將檢查的程式,放在TextBox.LostFocus裡,現在,在.net中,放在哪裡會比較適當? 下面有一個表,記錄了TextBox在輸入時相關的事件流程



從這個表可以看出,現在比較適當的寫法應該是,把資料的檢查程式寫在Validating事件中,而通過檢查之後的處理寫在Validated事件中。而且,在Validating事件中,可以中止焦點的轉移,也就是說,如果資料檢查不合格,可以不讓焦點轉移,禁止用戶繼續填下一個項目,直到這個項目正確的被填入。
Sample Code:



這樣,如果輸入的資料不正確,將無法轉移到其他TextBox (e.Cancle = True),也無法觸發其他按鈕。