[.NET] RDLC迴圈處理資料

摘要:[.NET] RDLC迴圈處理資料

當我們在使用RDLC開發報表的時候,如果資料來源內容如下。


private List<UserData> CreateDataSet()
{
    List<UserData> userDataSet = new List<UserData>();
    userDataSet.Add(new UserData() { Name = "Clark", Age = 18 });
    userDataSet.Add(new UserData() { Name = "Yaya", Age = 15 });
    return userDataSet;
}

我們可以很快速的使用RDLC裡的資料表控制項,來將資料呈現在報表上。



但是當客戶要求下圖的報表,要將資料來源內容顯示在一行。RDLC處理這種需求就沒有那麼簡單,這是因為RDLC沒有迴圈處理的函式可以使用。造成開發人員要組合資料,必須使用隱藏清單、在外部組合字串…等等迂迴的方式建立報表內容。但這樣的方式開發,既沒有效率而且也有很多的限制。



這個問題困擾了我好幾天,昨晚睡到一半忽然有靈感。可以使用RDLC裡的Sum函式,來做資料迴圈的處理。


Sum函式會取得資料集中的每一筆資料,並且計算出全部資料的總和。我們可以將運算式寫為下列的函式,利用code.PushStringStack這個RDLC自訂函式,來讓Sum函式取得所有資料。這樣的寫法,就可以將資料集中的每一筆資料都交由code.PushString處理過一次。


=Sum(code.PushString(Fields!Name.Value, Fields!Age.Value), "UserDataSet") 

接著看code.PushString這個RDLC自訂函式的內部,使用了一個Static的字串變數,來記錄每一筆資料處理之後的結果。到這邊開發人員應該可以理解,這樣的方式就是在跑迴圈處理資料。


Public Shared _foreachResult As String = String.Empty

Public Shared Function PushString(userName As String, userAge As String) As Integer
    _foreachResult += userName & "(" & userAge & "), "
    Return 0
End Function

當然啦,跑完迴圈處理完資料,最終還是要將資料顯示在畫面上。這邊很簡單的就是建立一個code.PopString回傳。


Public Shared Function PopString() As String
    Return _foreachResult
End Function

並且將原本的運算式改寫成為:


=IIF(Sum(code.PushString(Fields!Name.Value, Fields!Age.Value), "UserDataSet") <> 0, "", code.PopString())

編譯並且執行之後,就可以看到在RDLC的文字方塊裡,已經正確的顯示了客戶要求的資料格式。



範例程式 : RdlcForeachDataSample點此下載。


(為了方便說明思路,簡化了設計。開發人員應依照實際情景建立實作。)

期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。