串接介面(Fluent interface)是繼裝飾者模式(Decorator Pattern)後最常出現在文章上了
從JQuery了解這個撰寫方式後, JavaScript寫法變精簡了, 但還是沒有導入JQuery
因為自行整理一套Library在使用^_^ 但是這種寫法一直停留在JavaScript, 沒有導入到VB.NET內
因為一直遇不到適合的情況使用, 心裡很悶, 又不想硬用-_-

直到有一天在處理GridView標題列時, 好像突然被電到, 眼晴發出雄雄烈火~~~
先說明一下遇到的狀況, 在處理GridView標題列, 是一欄一欄的進行產生及設定然後加到列的物件中
但是各欄的狀況不太一樣, 比如跨欄, 跨列, 顯示文字, 水平置中, 靠右, 靠左,靠上, 靠下
一欄的基本設定程式碼如下

Dim td As TableCell = New TableCell
td.Text = ""
td.HorizontalAlign = HorizontalAlign.Center
td.VerticalAlign = VerticalAlign.Middle
td.RowSpan = 1
td.ColumnSpan = 1
tr.Cells.Add(td)

※如果呆呆的寫, 就是複製貼上的一直寫下去, 落落長的程式碼就這樣子被生出來了
※好一點的, 就寫成一個共用的函數來呼叫

tr.Cells.Add(new_td(Text,Align,vAlign,rowspan,cellspan))
'自訂函數內容
Function new_td(
 Text,Align,vAlign,rowspan,cellspan
) As TableCell
 Dim td As TableCell = New TableCell
 td.Text = Text
 td.HorizontalAlign = Align
 td.VerticalAlign = vAlign
 td.RowSpan = rowspan
 td.ColumnSpan = cellspan
 Return td
End Function

又要再多一個css屬性時, 怎麼辦?? 咱們可以透過多形來處理

tr.Cells.Add(new_td(Text,Align,vAlign,rowspan,cellspan,css))
'自訂函數內容
Function new_td(
 Text,Align,vAlign,rowspan,cellspan,css
) As TableCell
    Dim td As TableCell = New TableCell
    td.Text = Text
    td.HorizontalAlign = Align
    td.VerticalAlign = vAlign
    td.RowSpan = rowspan
    td.ColumnSpan = cellspan
    td.CssClass = css
   
    Return td
End Function

事情圓滿解決了, 往後有需要增加屬性, 就複製貼上改一下就好啦~
請不要做這種事~~很容易被怨念纏身的=_=+
※進入正題, 來看看用Fluent interface的解決方案※
建立一個類別, 名稱為td_load, 內容如下

Public Class td_load
    Dim td As TableCell = New TableCell
    Function text(ByVal v As String) As td_load
        td.Text = v
        Return Me
    End Function
    Function align(ByVal v As Integer) As td_load
        td.HorizontalAlign = v
        Return Me
    End Function
    Function col(ByVal v As Integer) As td_load
        td.ColumnSpan = v
        Return Me
    End Function
    Function row(ByVal v As Integer) As td_load
        td.RowSpan = v
        Return Me
    End Function
    Function css(ByVal v As String) As td_load
        td.CssClass = v
        Return Me
    End Function
    Sub addTo(ByRef tr As TableRow)
        tr.Cells.Add(td)
    End Sub
   
End Class

應用方式如下

'自訂函數內容
Function tdl() As td_load
 Return New td_load
End Function
'對齊列舉
Enum HA As Integer
  Center = HorizontalAlign.Center
  Right = HorizontalAlign.Right
  Left = HorizontalAlign.Left
End Enum
'第一列
tdl().text("日期").row(2).align(HA.Center).addTo(tr1)
tdl().text("姓名").align(HA.Center).css("TBS").addTo(tr1)
tdl().text("電話").align(HA.Center).css("TBS").addTo(tr1)
tdl().text("地址").col(2).align(HA.Center).addTo(tr1)
'第二列
tdl().text("備註").col(2).align(HA.Center).addTo(tr2)
tdl().text("縣市").align(HA.Center).css("TBS").addTo(tr2)
tdl().text("路段").align(HA.Center).css("TBS").addTo(tr2)


將以上程式碼改為最上方的方式呈現的話, 這篇文章到這句話是寫不完的
如上~~希望對您有幫助

 

 

arrow
arrow
    全站熱搜

    aqr199xx 發表在 痞客邦 留言(0) 人氣()