使用者如果不想用如InstallShield之類的安裝方法來發佈程式
但是,又想要在執行檔執行時,偷放一些檔案到安裝的電腦上
這時候,我們可以運用資源檔(Resource)
把想要偷渡的檔案包在執行檔裡面
同樣的
VS2005也大幅簡化了實做的方法
以下的例子,是偷渡一個spftp.exe到系統目錄的步驟
因為最近實在懶得打字
就抓圖片讓大家一個步驟一個步驟的看圖說故事
1.從專案中加入一個新的項目
2.選擇資源檔
3.在資源檔的畫面中,加入現有的檔案
4.選擇spftp.exe
5.將spftp.exe的屬性[建置動作]設為[內嵌資源]
6.程式基本上先判斷spftp.exe是否存在system32資料夾裡,如果沒有的話,就塞進去
您也可以用同樣的方法
塞圖片或字串到資源檔裡
應用很廣,以後有空再介紹
Wednesday, March 28, 2007
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出來
讓有興趣的人研究
如果您有更簡單的解決方法也請不吝告知
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。
通常,VB的使用者會在設計畫面上double Click,讓程式產生一個函式來撰寫Click事件的程式碼,可是.net預設產生的會是CellContentClick()事件,這個事件處理的是儲存格裡面的資料點選之後才會被觸發
如果我們以這個作為Click()事件時,程式執行後,會發現點選Grid時笨笨的,有時有觸發到,有時沒有。
其實,正確的作法應該是選取它的CellMouseClick()才對,這樣每次點選,該事件都能夠被觸發,用起來也不會笨笨的,同理,DoubleClick()也應該選取CellMouseDoubleClick。
Stored Procedure回傳值的接收方法
相信很多人會照著書上的方法,為了想要能夠從Stored Procedure中接收回傳值,將SqlCommand的CommandType設為StoredProcedure,然後一個一個的Parameter設定型態、值、傳入傳出方法,慢慢的一個一個參數設定下去
如果Stored Procedure的參數少的話還好,參數一多起來程式可是會搞死人,建議您使用比較方便的方法
直接將回傳的參數寫在Sql語法裡面,這樣一來,就可以省下command參數裡面許多煩人的設定了
如果Stored Procedure的參數少的話還好,參數一多起來程式可是會搞死人,建議您使用比較方便的方法
直接將回傳的參數寫在Sql語法裡面,這樣一來,就可以省下command參數裡面許多煩人的設定了
Right不見了
在以前VB中,有一個不錯的字串函式Right(),現在.net把它包裝在Microsoft.VisualBasic這裡
其實可以發現到,微軟還是偏愛Visual Basic,以前Visual Basic所有的函式,在這個參考裡面都可找的到,而且,使用Visual Basic作開發專案時,[插入程式碼片段]也比使用C Sharp來的豐富
其實可以發現到,微軟還是偏愛Visual Basic,以前Visual Basic所有的函式,在這個參考裡面都可找的到,而且,使用Visual Basic作開發專案時,[插入程式碼片段]也比使用C Sharp來的豐富
Mid切字會錯誤?
因為.net String預設以UTF8的格式來進行儲存與運算,所以,即使是中文字,它也只算作一個字在處理
這對於一些需要做切字,如上下行電文來說,將會非常的困擾,如果有中英夾雜的一個字串,想要正確的切出字串固定長度的資料,使用預設的String物件,將無法切得正確的資訊
以下,是一個可正確切得字串裡部分資料的函式,中文算成2個bytes
這對於一些需要做切字,如上下行電文來說,將會非常的困擾,如果有中英夾雜的一個字串,想要正確的切出字串固定長度的資料,使用預設的String物件,將無法切得正確的資訊
以下,是一個可正確切得字串裡部分資料的函式,中文算成2個bytes
Tuesday, March 06, 2007
如何讓使用者用Enter鍵代替Tab鍵使用
許多使用者,還是習慣按下enter鍵之後,游標會從上一個控制項,跑到下一個控制項
這種操作習慣,並不會隨著開發工具的更新而更新
不過,我們還是有因應的方法的
1. 在Form的屬性裡,先將KeyPreview設為True
2. 在Form的Keypress事件裡,加入下面程式碼
如此一來,使用者就可以用enter鍵來代替tab鍵使用了
這種操作習慣,並不會隨著開發工具的更新而更新
不過,我們還是有因應的方法的
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
語言套件可灌可不灌,如此,客戶端就可以看報表了
轉發套件
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物件上面按右鍵,會出現一個[清單屬性]對話框,裡面有一個選項:[儘可能將清單配置於單一頁面上],將它打勾,這樣,每頁報表就可以正常顯現三筆了
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自己結束之後再關掉會比較好
1. 在放置報表元件ReportViewer的Form上面,的[類別名稱]下拉選單中,選擇該Form的事件如下圖
2. 然後在該Form的FormClosing裡面加上程式碼如下
其中放置的數字為等待時間,0代表馬上結束,-1代表等待Viewer結束之後回傳,通常放-1讓Viewer自己結束之後再關掉會比較好
Reporting Service跑出比原本預期的還多頁(空白頁)?
在預覽表時,原本只有兩三頁的報表,列印出來時,突然印出了多一倍的頁面,浪費了紙張,這時,我們就要去檢視一下報表本身的size。
首先,我們要知道,報表檔預覽列印所顯示的頁數跟整頁模式所顯示的頁數是不一樣的,列印時會依照列印紙張大小來調整列印的頁數,所以是以整頁模式所顯示的頁數為準,之前介紹過如何調整列印紙張的大小,現在我們要依照列印紙張來調整我們報表的大小,使其不至於超過紙張大小而多印出來沒有必要的空白頁
1. 開啟報表檔(rdlc),選擇[報表] -> [報表屬性],開啟報表屬性對話框,切換到[配置]頁簽,看看頁寬與頁高的尺寸,然後看一下左邊界、右邊界、上邊界、下邊界,記下他們的邊界值
2. 再檢查報表(rdlc)屬性的size值,通常寬度會造成空白頁的產生,所以 (報表屬性.頁寬) – (左邊界) – (右邊界) 必須要大於 (報表檔. Width)
3. 如果經過調整之後,還是有空白頁的產生,那就將報表再縮減一些,多調整幾次,應該就不會有空白頁的產生了。
首先,我們要知道,報表檔預覽列印所顯示的頁數跟整頁模式所顯示的頁數是不一樣的,列印時會依照列印紙張大小來調整列印的頁數,所以是以整頁模式所顯示的頁數為準,之前介紹過如何調整列印紙張的大小,現在我們要依照列印紙張來調整我們報表的大小,使其不至於超過紙張大小而多印出來沒有必要的空白頁
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橫式了。
但是問題來了,如果今天我們想要設定報表為橫印,雖然在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),也無法觸發其他按鈕。
從這個表可以看出,現在比較適當的寫法應該是,把資料的檢查程式寫在Validating事件中,而通過檢查之後的處理寫在Validated事件中。而且,在Validating事件中,可以中止焦點的轉移,也就是說,如果資料檢查不合格,可以不讓焦點轉移,禁止用戶繼續填下一個項目,直到這個項目正確的被填入。
Sample Code:
這樣,如果輸入的資料不正確,將無法轉移到其他TextBox (e.Cancle = True),也無法觸發其他按鈕。
Subscribe to:
Posts (Atom)