2008年12月3日 星期三

設計可拖拉圖片(DragDrop Image)的Winform表單程式

如果想要在Winform中設計讓使用者可以拖拉圖片的功能,那麼就可以叫用PictureBox控制項的DoDragDrop方法來初始化拖曳作業,DoDragDrop方法需要兩個參數:一為代表正準備複製至DataObject的資料物件,另一個是指定此資料所允許之拖曳效果的DragDropEffects執行個體。

亞當斯來說明以一下此功能的設計步驟:

  1. 先準備一個Form表單,將準備移動的圖片(圖片中主角就是亞當斯最引以為傲,會寫Cat#的MiMi)先加到專案中,這邊亞當斯把圖片加入到專案的資源檔中,並且設定為內崁。ImageDragDrop01
  2. 在From畫面上配置兩個PictureBox控制項,先把左邊的PictureBox控制項Image圖片來源,設定為加入資源檔的圖片,右邊的PictureBox則不做任何設定。ImageDragDrop02
  3. 接下來這個步驟很重要因為PictureBox控制項的AllowDrop屬性沒辦法直接在設計的屬性視窗中設定,所以必須先在Form1表單的Load事件中,將目標PictureBox的AllowDrop屬性設定為True,接著在準備要拖曳的PictureBox之MouseDown事件中起始拖曳作業,程式碼如下:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      '設定PictureBoxRight可以允許拖拉
      PictureBoxRight.AllowDrop = True
    End Sub
    Private Sub PictureBoxLeft_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBoxLeft.MouseDown
      If PictureBoxLeft.Image IsNot Nothing Then
        PictureBoxLeft.DoDragDrop(PictureBoxLeft.Image, DragDropEffects.Move)
      End If
    End Sub



  4. 設定拖放作業中的目標PictureBox置放效果,先用DragEventArgs物件Data屬性的GetDataPresent方法判斷為圖片,再設定DragDropEffects列舉常數(亞當斯的這個範例是使用:Move)。
    Private Sub PictureBoxRight_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles PictureBoxRight.DragEnter
      If e.Data.GetDataPresent(DataFormats.Bitmap) Then

        e.Effect = DragDropEffects.Move

      End If

    End Sub



  5. 在目標的PictureBox之DragDrop事件中,設定PictureBox的Image屬性為拖曳過來的圖片。
    Private Sub PictureBoxRight_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles PictureBoxRight.DragDrop 

      If e.Data.GetDataPresent(DataFormats.Bitmap) Then
        PictureBoxRight.Image = CType(e.Data.GetData(DataFormats.Bitmap), Image)

        PictureBoxLeft.Image = Nothing

      End If

    End Sub



  6. 設計好表單後,執行程式,並且將左邊的PictureBox圖片直接拖曳到右邊的PictureBox,喔耶~成功了!!不過亞當斯只有撰寫從左邊拉到右邊的功能唷,如果你想要再從右邊拉到左邊,那麼就如法泡製整個設計步驟即可^_^。ImageDragDrop03

2008年11月11日 星期二

ToolStrip控制項(2)-ToolStripButton和ToolStripProgressBar應用

ToolStripButton是可包含文字和影像的可選取項目,透過ToolStripButton可以建立同時支援文字和影像的工具列按鈕,最主要的事件當然就是Click事件囉,因為畢竟ToolStripButton與一般按鈕的預作方式雷同。

亞當斯來做個簡單示範,首先先拉一個Timer控制項到表單畫面中,設定Interval屬性為500(0.5秒的意思)。接著表單中先加入ToolStrip控制項,新增一個ToolStripButton,並且直接雙擊滑鼠,在Click的事件程序中加入啟用計時器的程式碼即可。

Timer1.Enabled = True

ToolStripProgressBar 控制項從視覺上指示長時間作業的進度,會以不同色彩由左到右填滿的形式列來顯示作業進度。 要特別注意的是:ToolStripProgressBar 只能置於水平方向,通常我們會用ToolStripProgressBar 來顯示一些需要長時間進行動作的進度監控或顯示資訊,讓使用者可以得知目前系統的作業進度為何,例如:下載檔案、複製檔案或是存取大量資料、列印文件等等。

如果要修改ToolStripProgressBar顯示的數值,並不一定要直接變更 Value 屬性,可以使用Step屬性來指定Value將要遞增的特定數值,再呼叫PerformStep方法來遞增。若要讓遞增數值有所變化,則可以使用 Increment 方法,並指定用來遞增 Value 屬性的值。接著亞當斯在ToolStrip中加入ToolStripProgressBar,並且設定相關屬性:

  • Maximum:100
  • Minimum:0
  • Step:10
  • Style:Continuous

然後在Timer的Tick事件中,加入以下程式碼,去改更ToolStripProgressBar顯示的數值:
ToolStrip04

將應用程式執行,並且按下ToolStripButton啟動計時器,就可以看到ToolStripProgressBar的數值會有所變化了。
ToolStrip05

2008年11月10日 星期一

ToolStrip控制項(1)-ToolStrip設計簡介

ToolStrip控制項為 Windows 工具列物件提供容器,類似VS.NET2003開發WinForm的ToolBar控制項,基本上在VS2008設計WinForm會希望用ToolStrip來取代ToolBar,不過基本上還是相容的。

ToolStrip控制項中主要有幾大類的控制項可以設定,分別為:

  • ToolStripButton:近似於熟知的Button控制項,以按鈕的型態呈現在工具列上。按下按鈕會觸發並執行ToolStripButton.Click事件處理常式裡的程式。
  • ToolStripLabel:包含Label控制項,以及LinkLabel控制項的功能,當其IsLink屬性為False時,只會在工具列上顯示Text屬性裡包含的文字。而當IsLink屬性為True時,ToolStripLabel控制項便會類似於LinkLabel控制項。
  • ToolStripSeparator:ToolStripSeparator控制項是用來區隔工作列不同群組項目使用的控制項。
  • ToolStripSplitButton:結合ToolStripButton控制項,以及ToolStripDropDownButton控制項的功能,它包含一個獨立的按鈕以及一個下拉式選單,各自均有獨立的滑鼠點擊事件,ToolStripSplitButton.Click事件是用來回應按鈕點擊,而ToolStripMenuItem.Click則可用來回應功能表裡每一個選項的點擊動作。
  • ToolStripDropDownButton:允許為按鈕建立一個對應的下拉式選單。
  • ToolStripComboBox:近似於ComboBox控制項,支援Simple、DropDown以及DropDownList等不同的樣式,此外,也透過Items集合來管理其所屬的清單項目。
  • ToolStripTextBox:與TextBox控制項非常相似,與TextBox控制項最大的差異是,ToolStripTextBox控制項並不支援MultiLine屬性。
  • ToolStripProgressBar:與標準的ProgressBar控制項近似,ToolStripProgressBar控制項的外觀由Style屬性決定。可以透過叫用Increment以及PerformStep這兩個方法來改更進度。下列為Style屬性設定值:

    Blocks:增加 ProgressBar 中的分段區塊數,以表示進度
    Continuous: 增加 ProgressBar 中的平滑連續列大小,以表示進度
    Marquee:以跑馬燈形式在 ProgressBar 中連續捲動區塊,以表示進度

如果在表單中把ToolStrip中每一種都加入的話,看起來應該會像以下圖形,按照順序分別為ToolStripButtonToolStripLabelToolStripSplitButtonToolStripDropDownButtonToolStripComboBoxToolStripTextBoxToolStripProgressBar。

ToolStrip01這樣的設計方式都然要自己去設定控管這些項目的功能為何,其實 ToolStrip預設有提供一組系統常用且已經設定好的工具列按鈕,讓開發者直接使用,不過要加入這個預設的功能,可是讓亞當斯找好久,熊熊忘記要設定哪個地方才能加入,後來發現,原來遠在天邊,近在眼前啊!

只要對著ToolStrip按下右鍵,選擇插入標準項目即可。

ToolStrip02

插入後,就會有一組標準的系統工具列可以使用了。
ToolStrip03

2008年9月13日 星期六

About Pass 70-562 BrainDump - ASP.NET 3.5 AP Development

今天早上花了140 mins(兩個小時又20分)才把這科 70-562 最新的ASP.NET 3.5 Web開發的認證MCTS考完,雖然考試的過程當中非常的煎熬,不過總算是Pass,基本上當考完按下End的按鈕的時候,心臟噗通噗通的聲音,可是清晰可見,深怕要是沒看到Pass這幾個字,那麼除了微軟認證考試不敗的戰績從此破滅,還可能會被米米貓狂虧好幾天吧...Orz...(因為米米貓已經在昨天就考過了,不過還好Tony、John、Sophie跟我同一天考,順道帶一下,他們三個今天也考過囉,恭喜^^)

因此,想說趁著目前對70-562印象非常深刻的時候,提供給想要考這科目的朋友們一些參考資料和方向,我就先將考試內容的題型大方向與我所遇到的類型分類,希望對各位接下來如果想要去挑戰70-562時會有些許的幫助,。

70-562 Exam Time : 180 Mins  Questions : 50

考試題型(Exam Type)大分類(共50題):

  • AJAX (約9題左右)
  • ASP.NET 驗證機制 (約2題左右)
  • DataBinding Control 繫結控制項(GridView、FormView等,7題左右)
  • User Control & Custom Control (約7題左右)
  • Web.config 組態相關設定(約7題左右)
  • Web Service & WCF (約3題左右)
  • Mobile Device (約3題左右)
  • Resource 資源檔運用(約1題左右)
  • MasterPage (約1題左右)
  • HttpHandler Design (約1題左右)
  • Cache 效能快取機制(約2題左右)
  • Page Object & Event (約3題左右)
  • ASP.NET SDK (約1題左右)
  • State 狀態維護 (約2題左右)

2008年5月17日 星期六

ASP.NET 3.5 網站統一錯誤處理通知

開發網站時,最怕使用者抱怨,怎麼出現一個好奇怪的畫面, 而這個畫面就是程式執行錯誤的頁面,因此統一錯誤管理變成是開發網站一定要規劃設計的一個功能,如果要在統一錯誤處理頁面再去使用MAIL將訊息傳送給管理員,就可以搭配.NET的傳送MAIL機制,以下亞當斯寫一個可以管理網站整體錯誤的實用範例,步驟如下:

1.在Global.asax的Application_Error事件中,使用Server.Transfer將網頁導到統一處理錯誤的頁面GenericErrorPage.aspx:

void Application_Error(object sender, EventArgs e) 
{
Server.Transfer("~/GenericErrorPage.aspx");
}

2.在GenericErrorPage.aspx的Page_Load事件中,先判斷Server.GetLastError()不為null代表有錯誤要處理。

//如果有錯誤需要處理的話
if (Server.GetLastError() != null)
{
//……
}

3.使用MAIL來通知管理者錯誤訊息,首先匯入System.Net.Mail命名空間


<%@ Import Namespace="System.Net.Mail" %>


4.建立MailMessage物件

//使用asp.net 傳送MAIL
MailMessage mm = new MailMessage("admin@asp.net",
"adams@uuu.com.tw",
"網站錯誤訊息",
Server.GetLastError().GetBaseException().Message);

5.接著先使用Server.ClearError();將錯誤清除 6.最後再用SmtpClient物件來傳送紀錄錯誤的訊息給管理員。

try
{
//針對已經的錯誤(如:Send Mail)做處理
SmtpClient sc = new SmtpClient("localhost");
sc.Send(mm);
}
catch (Exception ex)
{
Response.Write(ex.Message );
}

2008年5月11日 星期日

將Out-of-Process的Session放在自訂的資料庫中

用SQL Server儲存Session之前,必須先到 %windows%\Microsoft.NET\Framework\versionNumber 路徑下執行Aspnet_regsql.exe 工具程式,安裝Session State資料庫,指令為:

  • 存在TEMP資料庫:aspnet_regsql.exe -S localhost -E -ssadd SessionState01
  • 存在ASPState資料庫:aspnet_regsql.exe -S localhost -E -ssadd -sstype p SessionState02
  • 存在自訂資料庫:aspnet_regsql.exe -S localhost -E -ssadd -sstype c -d Northwind SessionState03

接著要在網站的web.config中設定<sessionState>項目,指定將Session存放到自訂的資料庫,例如亞當斯要把Session物件存放到Northwind資料庫中的話,那麼就要做以下的設定:

<sessionState mode="SQLServer"
sqlConnectionString="Server=localhost;uid=sa;pwd=P@ssw0rd;Database=Northwind"
allowCustomSqlDatabase="true" />

2008年5月10日 星期六

設計 ASP.NET 3.5 行事曆

如果設計網站的行事曆,最簡單的方式就是使用ASP.NET 3.5中的Calendar控制項,不過因為行事曆必須在每個日期中有一些特殊的事件會發生,所以只用單純的Calendar當然無法滿足需求,因此我們必須針對Calendar來修訂,事實上在設計時可以在DayRender事件中改寫程式碼即可,假設一般的Calendar會呈現為:Calendar

那麼修改設計步驟如下:

1.在Calendar控制項的DayRender事件中加入程式碼,欲設計的行事曆資料可以來自資料庫資料,或者是指定某個特定日期,例如:10/1o國慶日,當然也可以當作會議行事曆來使用,這邊亞當斯在DayRender事件中先將本月非假日的背景顏色改掉。

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
//非假日時,將背景顏色改掉
if (!e.Day.IsOtherMonth && !e.Day.IsWeekend)
e.Cell.BackColor = System.Drawing.Color.Yellow;
}


2.接著使用e.Dat.Date去判斷目標日期,或是想要改寫的日期,例如:2008/5/11 母親節。



protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
  //非假日時,將背景顏色改掉
  if (!e.Day.IsOtherMonth && !e.Day.IsWeekend)
    e.Cell.BackColor = System.Drawing.Color.Yellow;
  //特定日期,加入控制項
    DateTime dt = new DateTime(2008,5,11);
    if(e.Day.Date  == dt)
    {

      //程式碼...
    }
}


3.使用程式動態產生出ASP.NET 3.5的控制項,這邊亞當斯用HyperLink讓使用者可以點下HyperLink後,將這天的資訊帶到另外一網頁做處理或檢視,另外因為 Calendar 控制項時會引發 DayRender 事件,所以不可以加入也會引發事件的控制項,例如 LinkButton。也就是說只能夠加入靜態控制項,例如 System.Web.UI.LiteralControl、Label、Image 以及 HyperLink。



4.最後,用e.Cell.Controls.Add方法將產生出來的控制項加入Calendar控制項中即可。



protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
//非假日時,將背景顏色改掉
if (!e.Day.IsOtherMonth && !e.Day.IsWeekend)
e.Cell.BackColor = System.Drawing.Color.Yellow;

//特定日期,加入控制項
DateTime dt = new DateTime(2008,5,11);
if(e.Day.Date == dt)
{
HyperLink link = new HyperLink();
link.NavigateUrl = "http://ms-net.blogspot.com";
link.Text = "母親節";

e.Cell.Controls.Add(link);
e.Cell.BackColor = System.Drawing.Color.Red;
}
}


5.執行後的結果如下:Calendar

2008年5月8日 星期四

將ASP.NET3.5健康監控(Health Monitoring)資訊紀錄到SQL Server

以健康監控的功能來看,目前ASP.NET 3.5有內建 Web 事件,並且已經設定提供者當做系統預設值。但是,rules 項目中只啟用兩個事件:All Errors 和 Failure Audits,這兩個事件都已啟用並且已由 EventLogProvider 訂閱。 所以如果要將記錄的資料用資料庫來保存的話,那麼就外另外設定使用:SqlWebEventProvider 才行。

以下是亞當斯設計的步驟:

1.一開始先新增一支DemoHealthMonitoring.aspx給個按鈕,動作是產生自訂錯誤 :
protected void Button1_Click(object sender, EventArgs e) 

    throw new Exception("自訂錯誤"); 
}
3.執行後,可以先檢視事件檢視器,並且對照機器層級的Web.config設定,可看到有WebEvent被觸發紀錄。HealthMonitoring-01

4. 接下來可以透過設定將網頁事件紀錄到SQL中,設定方式為設定Web.config中的<healthMonitoring> ,設定如下 : 

<healthMonitoring>
  <!--先加入一個eventMappings偵測網頁事件-->
  <eventMappings>
    <add name="ASP.NET Events"
         type="System.Web.Management.WebBaseEvent"/>
  </eventMappings>
  <!--設定使用SQL來記錄訊息-->
  <providers>
    <add name="MySqlWebEventProvider"
      type="System.Web.Management.SqlWebEventProvider"
      connectionStringName="LocalSqlServer"
      bufferMode="Notification"/>
  </providers>
  <!--設定規則-->
  <rules>
    <add
      name="All Errors"
      eventName="ASP.NET Events"
      provider="MySqlWebEventProvider" />
  </rules>
</healthMonitoring>

5.再次執行DemoHealthMonitoring.aspx,過一分鐘後可以檢視App_Data中, 會多了一個ASPNETDB.MDF資料庫,檢視其中的aspnet_WebEvent_Events資料表即可!!HealthMonitoring-02

下列檔案為此篇文章的範例程式,有興趣的朋友可自行下載:

2008年4月27日 星期日

使用鍵盤Keyboard操控Winform(2)-傳送按鍵SendKey對照表

亞當斯在使用鍵盤Keyboard操控Winform(1)-移動控制項焦點中提到使用鍵盤的相關設計方式,不過使用SendKey的Send方法時,還是要注意所需要設定的按碼鍵,因為基本上,每一個按鍵由一或多個字元表示。若要指定單一鍵盤字元,直接使用字元本身即可。

例如,若要表示字母 A,就傳遞字串「A」至這個方法,若要表示一個以上的字元,則附加每一個額外的字元至先前的字元,像是要表示字母 A、D、A、M 及 S,請將參數指定為「ADAMS」。

另外,亞當斯覺得要特別注意的是,若要指定當按下如 ENTER 或 TAB 鍵及表示動作而非字元的按鍵時,請使用下表中的按鍵對照表:

按鍵 按鍵碼
退格鍵 {BACKSPACE}、{BS} 或 {BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL 或 DELETE DEL 或 DELETE
向下鍵 {DOWN}
END {END}
ENTER {ENTER}or ~
ESC {ESC}
HELP {HELP}
HOME {HOME}
INS 或 INSERT INS 或 INSERT
向左鍵 {LEFT}
NUM LOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
PRINT SCREEN {PRTSC} (保留供日後使用)
向右鍵 {RIGHT}
SCROLL LOCK {SCROLLLOCK}
TAB {TAB}
向上鍵 {UP}
F1 {F1}
F2 {F2}
F3 {F3}
F4 {F4}
F5 {F5}
F6 {F6}
F7 {F7}
F8 {F8}
F9 {F9}
F10 {F10}
F11 {F11}
F12 {F12}
F13 {F13}
F14 {F14}
F15 {F15}
F16 {F16}
數字鍵台加號 {ADD}
數字鍵台減號 {SUBTRACT}
數字鍵台乘號 {MULTIPLY}
數字鍵台除號 {DIVIDE}


若要指定 SHIFT、CTRL 和 ALT 鍵任意組合的按鍵,請在按鍵碼之前使用一或多個下列的程式碼:

按鍵 按鍵碼
SHIFT +
CTRL ^
ALT %


若要指定當按下其他數個按鍵時,應該按住的 SHIFT、CTRL 和 ALT 的任意組合,請將那些按鍵的程式碼置於括號中。例如,若要指定在按 A 和 D 時按住 SHIFT 鍵,請使用「+(AD)」,若要指定在按 A 時按住 SHIFT 鍵,然後按 D 但不按住 SHIFT 鍵,請使用「+AD」;若要指定重覆的按鍵,請使用格式 {key number},必須在按鍵和數目之間放置空格,例如,{LEFT 5} 表示按向左鍵 5 次;{A 10} 表示按 A 鍵 10 次。

2008年4月26日 星期六

使用鍵盤Keyboard操控Winform(1)-移動控制項焦點

開發Winform程式時, 可以將表單設計為使用鍵盤的Enter,上,下箭頭鍵移動表單上控制項的輸入焦點,根據亞當斯的觀察,這種操作方式在很多大型主機上,如AS400等系統中都是這樣的操作模式,所以其實很多使用者都已經習慣這樣的操作模式了,然而Winform也有提供這樣的設計功能,只是幾乎很少被提到! 剛好上課時有同學提出這個問題,亞當斯就在這邊紀錄一下設計方式給各位參考。假設有一個表單畫面如下:

KeyboardInput01

用鍵盤移動控制項焦點的設計方式有以下兩個重點步驟:

1.設定Form的KeyPreview 屬性,指出表單是否在事件傳送至具有焦點的控制項之前,要接收按鍵事件,當設定這個屬性為 true,表單將接收所有 KeyPress、KeyDown 和 KeyUp 事件。
KeyboardInput02

2.在From的KeyDown事件中,使用e.KeyCode判斷按下鍵盤的哪一個按鍵,如果按下的是:Enter或是上、下鍵的話,就移動表單中的控制項焦點,程式碼如下:

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown   
  Select Case e.KeyCode
    Case Keys.Enter, Keys.Down
      SendKeys.Send("{TAB}")
    Case Keys.Up
      SendKeys.Send("+{TAB}")
  End Select
End Sub

下列檔案為此篇文章的範例程式,有興趣的朋友可自行下載:


2008年4月25日 星期五

Windows Form 中事件(Event)的順序

開發表單程式時,對事件順序的認知其實蠻重要的,亞當斯以前開發Winform專案時有時候為了控制某些邏輯的先後順序,傷透了腦筋,因為都必須要控管出現的順序或是運作方式等,不過透過Winform event的搭配控管就可以節省不少需要自己去控管的部分了。

微軟MSND中也提到:對於需要輪流處理 Windows Form 應用程式中每個事件的開發人員來說,事件的引發順序就十分重要。當某個狀況呼叫嚴密的事件處理,如重新繪製表單的部分時,有必要了解事件在執行階段時的明確引發順序。以下列出亞當斯整理MSDN後的Windows Form 中事件的順序,以方便日後上課或是設計專案時參考。

Form 和 Control 有關啟動與關閉的事件順序為可分為兩大類,當 Windows Form 應用程式啟動時,會以下列順序引發主要表單的啟動事件:

  • Control.HandleCreated
  • Control.BindingContextChanged
  • Form.Load
  • Control.VisibleChanged
  • Form.Activated
  • Form.Shown

當應用程式關閉時,會以下列順序引發主要表單的關閉事件:

  • Form.Closing
  • Form.FormClosing
  • Form.Closed
  • Form.FormClosed
  • Form.Deactivate

焦點和驗證事件:當透過使用鍵盤按鍵 (TAB、SHIFT+TAB 等)、呼叫 Select 或 SelectNextControl 方法,或是將 ActiveControl 屬性設定成目前的表單等作法,變更焦點時,Control 類別的焦點事件就會以下列順序發生:

  • Enter
  • GotFocus
  • Leave
  • Validating
  • Validated
  • LostFocus

當使用滑鼠或呼叫 Focus 方法來變更焦點時,Control 類別的焦點事件會以下列順序發生:

  • Enter
  • GotFocus
  • LostFocus
  • Leave
  • Validating
  • Validated

2008年4月24日 星期四

ListView 控制項的設計要素(2)-設計Group與套用View檢視模式

ListView 群組功能可建立邏輯上與 ListView 項目相關的視覺化群組,主要功能為協助使用者尋找所尋找的項目,方法是將項目分隔成有用的分類,若要使用群組功能,則是將一或多個 ListViewGroup 物件加入至 ListView 控制項的 Groups 集合。
設計步驟為:

1.先設定ListView 的Groups 屬性,加入想要分類的群組,這邊亞當斯加入兩個Group,並且設定Header和Name:

ListView06 2.修改ListItemView的Group屬性,指定為隸屬的群組。
ListView07

接著透過ComboBox控制項來動態控制ListView 的檢視功能( View屬性),View 屬性設定為各項目用大圖示或小圖示顯示,或用垂直清單來顯示的各項項目。最豐富的選項是詳細資料檢視,不只允許檢視項目,更有為各項項目指定的任何子項目。各項項目都顯示在格線中,作垂直列示,各項項目的子項目則顯示在資料行中,附有資料行行首。Details檢視是對使用者顯示出資料庫資訊的完美方式。

在表單中先撰寫以下程式,先使用System.Enum.GetNames(GetType(View))載入所有的View,在使用System.Enum.Parse(GetType(View), comboBox1.Text)取出指定給ListView控制項即可,將ListView的所有View先在入ComboBox控制項以便動態設定ListView:

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
comboBox1.DataSource = System.Enum.GetNames(GetType(View))
End Sub
Private Sub comboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles comboBox1.SelectedIndexChanged
listView1.View = CType(System.Enum.Parse(GetType(View), comboBox1.Text), View)
End Sub


接著就可以在程式執行過程中,隨時去變化ListView的View模式了,以下為亞當斯所測試的每一個不同的結果樣式。

ListView08ListView09ListView12 ListView11 ListView10

2008年4月23日 星期三

NotifyIcon 與contextMenuStrip的搭配應用

Windows Form NotifyIcon 控制項通常用來為在背景中執行的處理序 (Process) 顯示圖示,而且大部分時間不會顯示使用者介面。MSN程式或是防毒軟體即為範例之一,讓一般的User可在工作列的狀態告知區按一下圖示(Icon)來存取。每個 NotifyIcon 控制項都會在狀態區顯示一個圖示。假設想要執行三個背景處理序,每個都需要獨立的顯示圖示,那麼就必須將三個 NotifyIcon 控制項加入表單分別設定才行。

亞當斯接下來簡單說明一下NotifyIcon 搭配contextMenuStrip的設計方式:

  1. 先在表單中加入一個contextMenuStrip控制項,並且設定幾個ToolStripMenuItem,例如:開始、停止、離開等。NotifyIcon01
  2. 拖拉一個NotifyIcon控制項到畫面中,設定ContextMenuStrip(取得或設定與 NotifyIcon 關聯的快速鍵功能表)為ContextMenuStrip1,並設定BalloonTipText、BalloonTipIcon 和 BalloonTipTitle 來指定汽球提示的文字、圖示和標題。
  3. NotifyIcon 主要屬性是 Icon 和 Visible,因此設定Icon 為一個影像檔,並設定Visible為true。NotifyIcon02
  4. 最後可以呼叫 ShowBalloonTip 方法來指定要顯示提示的時間範圍,為 NotifyIcon 顯示提示。程式碼為:
    NotifyIcon1.ShowBalloonTip(3000)
  5. 應用程式執行後的結果,就會在右下角的出現Icon,對著Icon按滑鼠右鍵,會彈出contextMenuStrip所設定的ToolStripMenuItem。另外按下表單中按鈕之後,Icon處就會彈出提示視窗,然後出現三秒鐘。
    05-ContextMenuStrip Work 04-ShowBallonTip

2008年4月22日 星期二

PictureBox的設計應用-載入衛星雲圖

Windows Form PictureBox 控制項是用來顯示點陣圖、GIF、JPEG、中繼檔 (Metafile) 或圖示格式的圖形。顯示的圖片是由可在執行階段或設計階段設定的 Image 屬性所決定的。要載入圖形有以下幾種常見方式:

  1. 直接設定Image屬性為本機資源下某個影像檔的路徑
  2. 設定 ImageLocation 屬性,然後使用 Load 方法同步載入影像或是使用 LoadAsync 方法非同步載入影像
  3. 設定Image屬性為專案資源檔(Resource.resx)檔中的影像

另外一個最重要的屬性就是:SizeMode 屬性,這屬性可以控制影像和控制項間的搭配。

接下來亞當斯使用以上第二種方式來載入圖形,而這個圖形:衛星雲圖,則是根據現在的時間,實際去偵測現在天氣的概況,而呈現完成的圖示。那麼從哪邊取得衛星雲圖呢?答案就是:中央氣象局全球資訊網。

其實程式很簡單,在Winform畫面上,先拖拉一個Button和PictureBox 控制項,然後在Button的Click事件中加入以下程式碼即可,首先將現在的日期時間傳入到中央氣象局全球資訊網的一個位置圖,接著設定PictureBox 的ImageLocation 屬性:
DemoPictureBox 將Winform執行起來,按下按鈕就可以看到衛星雲圖呈現在我們的表單中了,呵呵~真是一個蠻酷的功能。
PictureBox02

2008年4月21日 星期一

ListView 控制項的設計要素(1)-完整設計模式

Windows Form ListView 控制項顯示具有圖示的項目清單,可以使用清單檢視來建立如 Windows 檔案總管右窗格的使用者介面。ListView 主要設定的屬性有下列幾個:Columns 、Items、View和Group等等。透過這幾個屬性可以設計一個常用的介面讓一般User使用。

首先,如果要在ListView 中顯示圖示,當然可以先準備ImageList控制項將想要呈現的圖片先設定好,然後先來設定ListView的Column屬性,Columns 屬性允許存取 ListView.ColumnHeaderCollection,它儲存將控制項的 View 屬性設定為 Details 時所顯示的資料行行首。這邊亞當斯先設定三個欄位以呈現:雜誌名稱、單價、出刊日的檢視樣式。

ListView01

如果想要在ListView中的每個項目都有圖片可以呈現的話,可以設定ImageList控制項中的Images屬性,將圖示先封裝到這個控制項中,然後指定給ListView的LargeImageList屬性或是SmallImageList屬性即可。
ListView02

ListView 控制項的主要屬性是 Items,其中包含控制項顯示的項目,主要功能是取得包含控制項中所有項目的集合,使用這個屬性傳回的 ListView.ListViewItemCollection,可以新增項目、移除項目、和取得項目的計數,這邊亞當斯就把要準備呈現的幾筆項目資料逐一設定,分別為:地理雜誌、科學和創意情報。設定時,可以先加入一個ListViewItem,然後設定Text和ImageKey這兩個比較主要的屬性,就可以將比較完整的項目呈現出來。

ListView03 基本上,整個設定完ListView 的感覺就如同下圖所示。還可以搭配很多其他的屬性變化啦,譬如說View的模式啦,Group群組模式啦...等等的,各位有興趣的話,可以多參考MSDN中的說明囉!
ListView04 另一方面,當然也可以動態使用程式碼來加入其中一個ListViewItem,程式碼如下:
ListView05

2008年4月20日 星期日

修正安裝 Moss 2007 SDK後 Workflow 的 Code Snippet 無法使用的技巧

想要使用VS 2005開發Moss的Workflow,可以安裝SharePoint Server 2007 SDK: Software Development Kit,並且使用其所提供的專案樣板來設計。當建立流程專案之後,在專案的DeploymentFiles\FeatureFiles資料夾中會預設包含以後要部署為Feature的兩份文件,打開feature.xml來看,還有提供透過Code Snippet快速設定Feature範本的步驟ㄝ,看起來功能真的不錯!!FixingWorkflowSnippet01

但是當Adams依照步驟,真的想要使用Code Snippet時,卻發現feature.xml和workflow.xml這兩個檔案所提供的Code Snippet預設都無法Work,如下圖所示,阿咧~只有幾段簡單的鳥程式可以用?? 難道又被「呼ㄌㄨㄥ」了~大哥別鬧了,Orz(微軟阿,你總是那麼容易的欺騙倫家的感情~喵~~嗚~~~~>_<~~~)
FixingWorkflowSnippet02

根據亞當斯的研究,其實安裝完 Moss 2007 SDK後在C:\Program Files\Microsoft Visual Studio 8\Xml\1033\Snippets\SharePoint Server Workflow資料夾下會有5個Snippet可以用,分別是:

  • elementfile.snippet
  • feature.snippet
  • modificationform.snippet
  • taskform.snippet
  • workflowtemp.snippet

因此亞當斯判斷應該是安裝的過程與VS 2005整合時有小Bug,所以導致無法在VS 2005中正常使用,所以解決技巧就是只要打開VS 2005的程式碼片段管理員(快速鍵為:Ctrl + K + B),語言先選擇XML,再點選「加入」,路徑直接指到C:\Program Files\Microsoft Visual Studio 8\Xml\1033\Snippets\SharePoint Server Workflow,將這個Code Snippet加入即可。FixingWorkflowSnippet05

這樣一來,就可以輕鬆的享用Workflow Code Snippet 所帶來的便利囉!
多說無益,馬上來試試看, 亞當斯試著在featuer.xml使用區段程式碼,發現真的可以挑選程式區段唷!FixingWorkflowSnippet06

透過Moss Workflow Code Snippet 產生出來的程式Feature設定如下,淡綠色的地方就是可以自訂修改的地方,其他部分則不需要修改,果然是好用的Code Snippet,像是Workflow.xml也就比照辦理囉。來人阿~有事快奏~無事退朝!^^
FixingWorkflowSnippet07

2008年4月19日 星期六

Moss事件接收器(4)-Debug Event Handler

當事件接收器(Event Handler)的組件(*.dll)部署到GAC並且註冊到MOSS網站後,使用者在執行的過程當中可能多多少少會發生錯誤,然而MOSS網站上針對Event Handler所產生的錯誤訊息幾乎都是:無法預測的錯誤。說實在的,在MOSS的網站上看到這個訊息的時候都會很傻眼,因為根本不知道到底是哪錯了,大人~真是冤忘啊!!

所以如果想要知道是否為Event Handler設計有誤,最好的方式就是使用VS.NET來Debug偵錯。要Debug Event Handler Assembly最主要的步驟就是加入IIS所執行的Process:w3wp.exe,就可以了,以下亞當斯來做個簡單示範:

1.先打開VS.NET中設計 Event Handler組件的專案,並且針對要執行Debug的程式設定中斷點。
EventHandlerDebug01

2.打開瀏覽器,瀏覽MOSS網站,例如:http ://center.beauty.corp,此時會產生w3wp.exe。接著切換到VS.NET執行偵錯-->附加至處理序-->將w3wp.exe附加。
EventHandlerDebug02

3.瀏覽Moss網站並且打開文件庫,刻意去觸發Event Handler所控管的事件(這邊亞當斯要測試的是:刪除事件)。
EventHandlerDebug03

4.當觸發Event Handler中的事件時,這時候就會進入中斷點,以便執行偵錯了,呵呵~真有成就感。
EventHandlerDebug04

2008年4月18日 星期五

VSTS 2008設計Unit Test單元測試(3)-測試方法(TestMethod)的例外處理

在測試專案中,實作Method的單元測試時會用到TestMethodAttribute,簡單來說,測試方法必須放置在測試類別中,並且以 TestMethodAttribute 標示,如此才能生效。

當測試的過程當中,假設想要刻意忽略某一種例外造成測試失敗時,就可以使用ExpectedExceptionAttribute來設定Exception物件。這個屬性可用來測試是否程式執行過程當中會丟出這個Exception例外狀況,假設有擲回預期的例外狀況,則測試方法為"成功",反之,如果丟回的例外不是預期的Exception物件,則測試將會失敗。

1.首先挑選要建立的單元測試,如下圖所示。

UnitTestFixed01

2.修改原本類別中的方法,加入判斷式,假設滿足某個條件時,要丟出我們想要監控的Exception例外狀況,程式碼如下。
UnitTestFixed02 

3.確認一下有設定TestMethodAttribute的測試方法,預設透過VSTS 2008所自動產生的測試方法,只會有設定[TestMethod()],所以並不會針對任何其他條件有所限制。

UnitTestFixed03 
4.將這個測試方法加入到測試編輯器中,並且加入核取的項目中,勾選想要測試的方法後,按下執行測試。
UnitTestFixed04 
5.此時測試結果會因為擷取到ApplicationException而回報測試失敗,點選結果可以看到測試的詳細資訊:UnitTestFixed05

6.接著回到測試方法中,加入ExpectedExceptionAttribute來設定ApplicationException物件。
UnitTestFixed06

7.假設測試程式執行過程當中會丟出這個ApplicationException例外狀況,則測試方法為"成功"。
UnitTestFixed07