January 29, 2009

GridView的表尾合併範例

用GridView做顯示報表時,常常需要做表尾合併用來顯示如分數、金額、人數的總和或平均。本篇文章要示範如何在GridView做表尾合併。
在做合併功能前,請務必先將GridView的屬性ShowFooter設定為True,接著參考下圖:
根據上圖顯示,我們要將GridView的Footer顯示成兩個Cell,第一個Cell為五個欄位合併(流水號、姓名、國文、英文、數學),Cell內的文字內容為"總分平均";第二個Cell用來顯示總分欄位的平均值。接下來開始進行合併,我們將程式撰寫在GridView的RowCreated事件中,請參考下方code snippet:
    Protected Sub GridView_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles GridView.RowCreated

        If Not (e.Row.RowType = DataControlRowType.Footer) Then
            Exit Sub
        End If

        Dim footer As TableCellCollection = e.Row.Cells

        '清除Footer原本的Cells
        footer.Clear()

        '第一個Cell
        Dim tc1 As New TableCell()
        tc1.Text = "總分平均"
        tc1.ColumnSpan = 5
        tc1.HorizontalAlign = HorizontalAlign.Right
        footer.Add(tc1)

        '第二個Cell
        footer.Add(New TableCell())
    End Sub

說明
1.footer.Clear()用來清除在GridView Footer中原本所存在的Cells,如果不以Clear()清除的話,等於是在原本已有的Cells上再加入新的Cell,則GridView會變成如下顯示:
2.ColumnSpan用來設定合併的欄位數,HorizontalAlign用來設定水平位置
3.完整範例可參考GridViewFooterMerge.zip

January 12, 2009

GridView的RowCommand事件

在GridView觸發RowCommand事件時,由System.Web.UI.WebControls.GridViewEditEventArgs可取得觸發事件的來源物件及其CommandName,如下code snippet
Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) Handles GridView1.RowCommand
    Select Case e.CommandName
        Case "EditItem"
            '執行按下自訂編輯按鈕的動作
        Case "DeleteItem"
            '執行按下自訂刪除按鈕的動作
        Case Else
            Throw New Exception("沒這CommandName")
    End Select11
End Sub
經測試,CommandName是有幾個特定預設值的,如"Edit"、"Delete"、"Update"、"Cancel"、"New"、"Select"、"Page"。
其中"Edit"、"Delete"、"Update"、"Cancel"、"Page"還會觸發特定事件,如RowEditing、RowDeleting、RowUpdating。
所以如果是使用自訂按鈕做類似的動作處理時,請避免設定與系統預設相同的CommandName,以免造成不可預期的結果。

January 11, 2009

UpdatePanel裡出現__designer屬性的解決方案

被這個問題困擾了好一陣子了,Pete用VS2005把Web Control拉進UpdatePanel時,在Web Control的屬性都會莫名的多出__designer::wfdi屬性,而且VS2005會不認得UpdatePanel的屬性。

雖說compile還是能過,但於VS的aspx原始檔畫面會出現一堆紅色底線,畫面極不美觀,嚴重影響視力且格式化文件的排版功能會失效,有時Intellisense還會不能用!

 以下提供一個簡單的方法,Pete也成功的解決了這個問題:

 至C:\Documents and Settings\XXX\Application Data\Microsoft\VisualStudio\8.0下砍掉ReflectedSchemas資料夾後,重新開啟VS,一切問題就解決囉!

*XXX為預設登入電腦名稱,若在安裝作業系統時未變更電腦名稱則預設為Administrator 

*Pete的VS版本是Professional,其它版本的解決方式可參考以下網址: blogs.msdn.com/mikhailarkhipov/archive/2007/01/03/how-to-fix-intellisense-issues-after-upgrading-to-asp-net-ajax-1-0-rc.aspx

BoundField的DataFormatString無作用?

請將BoundField屬性HtmlEncode設為false

GridView加入流水號的方法 - 不使用Code Behind

有時想在GridView顯示流水號如下圖排列方式


可在GridView中加入一TemplateField並在其ItemTemplate裡加入<%#Container.DataItemIndex + 1%>,如以下片段

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
 <Columns>
  <asp:TemplateField HeaderText="流水號">
   <ItemTemplate>
    <%#Container.DataItemIndex + 1%>
   </ItemTemplate>
  </asp:TemplateField>
  <asp:BoundField HeaderText="其它資料" />
 </Columns>
</asp:GridView>

使用上述方式在GridView有開啟分頁功能時,在跳頁時會累加流水號。如一PageSize為5的GridView,其第一頁的流水號為1~5,第二頁的流水號則為6~10。

*如果不想讓流水號累加的話,可將<%#Container.DataItemIndex + 1%>改為<%#Container.DisplayIndex + 1%>
*若流水號想以0001~0005呈現的話,可改為<%#(Container.DataItemIndex + 1).ToString("0000")%>。

將數字轉為以千為單位並用逗號區分的方法

當我們有一數字65536想以65,536來顯示時,我們可以下列函數做處理
String.Format("{0:N0}", 65536)
上述方法可得到一字串65,536,其中{0:N0}的0表示要顯示的小數點位數
以上述範例來看,如果我們改為
String.Format("{0:N2}", 65536)
則得到的結果為65,536.00

如果要以上述所得字串轉回去純數值資料的話, 可以用
Integer.Parse("65,536", System.Globalization.NumberStyles.AllowThousands)
有時在GridView中想把顯示出的數字以千為區分時,我們可以在BoundField中,將其DataFormatString屬性設為{0:N0},並把HtmlEncode屬性設為false,即可得到前述結果。

補充
經hatelove大提醒得知如果要parse的字串含小數點,如"65,536.00",則無法使用System.Globalization.NumberStyles.AllowThousands須改用System.Globalization.NumberStyles.Number
以下是測試結果
System.Globalization.NumberStyles.AllowThousands僅適用於無小數點的數值字串,如"65,536";而System.Globalization.NumberStyles.Number則適用於無小數點和有小數點的數值字串,如"65,536"或"65,536.00"。

參考
為何System.Globalization.NumberStyles.Number可允許有小數點和無小數點的情況?大家可以參考MSDN。
http://msdn.microsoft.com/en-us/library/system.globalization.numberstyles.aspx

在說明表格Number欄位中有提到"Indicates that the AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, and AllowThousands styles are used. This is a composite number style. "
所以Number具有AllowThousands及AllowDecimalPoint的功能,可同時轉換有小數點及無小數點的情況。