2008年3月25日 星期二

Treeview 的 ExpandDepth 屬性無作用

Q: 我以 unbound的方式建立Treeview 的節點, 產生後設定ExpandDepth 屬性卻無作用, 應如何解決?

A: 先展開所有節點, 再以程式自行收合至特定層級, 程式如下:
mRootNode.ExpandAll() ' mRootNode:為根節點, 先展開所有節點
CollapseTreeNodes(mRootNode) '以遞迴方式找到特定層級, 收合節點

Sub CollapseTreeNodes(ByVal mNode As TreeNode)
For Each mSubRootNode As TreeNode In mNode.ChildNodes
' DropDownListLevel.SelectedValue 為特定層級
If mSubRootNode.Depth = DropDownListLevel.SelectedValue Then
mSubRootNode.Collapse() ' 特定層級, 收合節點
ElseIf mSubRootNode.Depth < color="#660000">' 若為特定層級以上之節點, 繼續往下搜尋子節點
End If
Next
End Sub

2008年3月24日 星期一

使用SELECT比較區間值

Q: 如何以簡潔的語法, 作多重區間值的比較?

A: 用If ...ElseIf...End If, 寫多重比較, 程式會像樓梯愈走愈往右, 很難一目瞭然, 用Select ... Case就漂亮多了。

Sub Main()
Dim IntPurchaseOrderID = 11
Dim StrPurchaseOrderNumber As String
Select Case IntPurchaseOrderID
Case Is < 10
StrPurchaseOrderNumber = "00000" & IntPurchaseOrderID
Case Is < 100
StrPurchaseOrderNumber = "0000" & IntPurchaseOrderID
Case Is < 1000
StrPurchaseOrderNumber = "000" & IntPurchaseOrderID
Case Is < 10000
StrPurchaseOrderNumber = "00" & IntPurchaseOrderID
Case Is < 100000
StrPurchaseOrderNumber = "0" & IntPurchaseOrderID
Case Else
StrPurchaseOrderNumber = CStr(IntPurchaseOrderID)
End Select
Console.WriteLine(StrPurchaseOrderNumber)
Console.ReadLine()
End Sub

2008年3月22日 星期六

設定與擷取程式的結束碼(Exit Code)

Q: 我希望在Workflow中執行外部程式, 如果成功, 則繼續執行另一個外部程式, 否則就將錯誤代碼寫入log. 首先需要設定與擷取外部程式的結束碼(Exit Code) , 程式該怎麼作呢?

A: 分成兩部分解釋:
1. 設定程式的結束碼
Sub Main()
Environment.ExitCode = 99
End Sub
2. 擷取外部程式的結束碼
Dim filename As String = "H:\TestExitCode.exe"
Dim pInfo As ProcessStartInfo = New ProcessStartInfo(filename)
pInfo.WindowStyle = ProcessWindowStyle.Normal
pInfo.WorkingDirectory = Environment.CurrentDirectory
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
mExitCode = p.ExitCode

2008年3月20日 星期四

抓取網頁的最短程式

Q: 如何在.net中抓取網頁?

A: 要抓取網頁可以呼叫System.Net命名空間中的 WebClient 或 WebRequest 類別, 其中WebClient 較簡單, 只要幾行就搞定了。

Dim myClient As WebClient = New WebClient()
Dim response As Stream = myClient.OpenRead _("http://www.contoso.com/index.htm")
Dim Buffer(10240) As Byte
Dim Buffer_all(1024000) As Byte
Dim bytesread As Integer
Dim length As Integer
length = 10240
' 從資料流讀取,並將任何資料寫至主控台。
' *** bytesread 不等於 length
Dim sb As New StringBuilder
Dim i As Integer = 0
bytesread = response.Read(Buffer, 0, length)
Do While (bytesread > 0)
Array.Copy(Buffer, 0, Buffer_all, i, bytesread)
i = i + bytesread
bytesread = response.Read(Buffer, 0, length)
Loop
' 完成後關閉資料流。
response.Close()
MsgBox(System.Text.Encoding.UTF8.GetString(Buffer_all, 0, i))

2008年3月11日 星期二

取得 Enum 的資訊

Q: 使用Enum取代 hard code, 是一個很好的coding方式, 但是, 要如何取得enum的所有內容及個數呢? (以免又 hard code !!)

A: .net 提供標準函數, 可將enum的元素名稱轉成陣列, 範例如下:

Public Enum FormulaElement
Sheet
Row
Column
Formula
RowCount
ColumnCount
End Enum

Public mArrayFormulaElement() As String = _
System.Enum.GetNames(GetType(FormulaElement))

Public mFormulaElementCount As Integer = _
System.Enum.GetNames(GetType(FormulaElement)).Length