February 28, 2009

註冊控制項為全域使用的方法

使用自訂伺服器控制項時,需要在頁面先以Register指示詞註冊控制項後,方能使用該控制項。

如果專案中有N頁會用到該控制項,就要註冊N次顯得有些麻煩。有沒有註冊一次就可以讓所有頁面使用的方式?

有。

請在Web.config中<system.web> -> <pages> -> <controls>加入如下節點

<add tagPrefix="MyTag" namespace="MyWorks.WebControls" assembly="MyWorks"/>

tagPrefix為控制項加入頁面時的前置詞,assembly為組件名稱,namespace為命名空間名稱。

GridView加入流水號的方法 - 使用伺服器控制項(1)

在「GridView加入流水號的方法 - 不使用Code Behind」中提到了不使用Code Behind方式在GridView中實作流水號的方法。

在專案中,為了GridView畫面的一致性,可能將每個GridView都加入流水號。然而每個使用流水號的GridView都要加入5行的程式碼來顯示流水號,不免有點不夠美觀。何不把流水號寫成一個自訂控制項?每次使用時只要加入1行程式碼註1,讓程式碼易讀又美觀。

以下步驟說明如何建立一個流水號伺服器控制項:

1.建立ASP.NET伺服器控制項專案SerialNumberField
2.將控制項命名為SerialNumberField
3.繼承DataControlField
4.覆寫CreateField(),如下
Protected Overrides Function CreateField() As System.Web.UI.WebControls.DataControlField
  Return New SerialNumberField()
End Function
5.覆寫InitializeCell(ByVal cell As System.Web.UI.WebControls.DataControlFieldCell, ByVal cellType As System.Web.UI.WebControls.DataControlCellType, ByVal rowState As System.Web.UI.WebControls.DataControlRowState, ByVal rowIndex As Integer),如下
Public Overrides Sub InitializeCell(ByVal cell As System.Web.UI.WebControls.DataControlFieldCell, ByVal cellType As System.Web.UI.WebControls.DataControlCellType, ByVal rowState As System.Web.UI.WebControls.DataControlRowState, ByVal rowIndex As Integer)

  MyBase.InitializeCell(cell, cellType, rowState, rowIndex)

  If cellType = DataControlCellType.DataCell Then
    cell.Text = (rowIndex + 1).ToString()
  End If
End Sub
6.建置專案

註1
若將註冊伺服器控制項的指示詞也算進去的話就會是2行。也可改以另一種方式註冊控制項,以省去在每個頁面皆註冊控制項的步驟,請參考「註冊控制項為全域使用的方法」。

如何使用SerialNumberField控制項?

1.將SerialNumberField.dll加入參考

2.於使用流水號的頁面中註冊控制項,如下
<%@ Register assembly="SerialNumberField" namespace="SerialNumberField" tagprefix="sn" %>
3.於GridView的<Columns></Columns>中加入SerialNumberField(如同BoundField一樣),如下
<sn:SerialNumberField />

列出列舉(Enumeration)內成員名稱及列舉值的方法

一列舉Family如下
Protected Enum Family As Integer
  Grandpa = 0
  Grandma = 1
  Father = 2
  Mother = 3
  Brother = 4
  Sister = 5
End Enum

以下示範如何列出此列舉內的列舉名稱及值
'列出列舉成員名稱
Me.Response.Write("列出列舉成員名稱<br />")
For Each str As String In [Enum].GetNames(GetType(Family))
  Me.Response.Write(str)
  Me.Response.Write("<br />")
Next

Me.Response.Write("<p></p>")

'列出列舉值
Me.Response.Write("列出列舉值<br />")
For Each value As Integer In [Enum].GetValues(GetType(Family))
  Me.Response.Write(value.ToString())
  Me.Response.Write("<br />")
Next

Me.Response.Write("<p></p>")

'經由列舉值取得列舉成員名稱
Me.Response.Write("經由列舉值取得列舉成員名稱<br />")
For Each value As Integer In [Enum].GetValues(GetType(Family))
  Me.Response.Write("值:" & value.ToString() & " 名稱:" & [Enum].GetName(GetType(Family), value))
  Me.Response.Write("<br />")
Next

顯示結果如下: