<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      數據報表開發技巧:自動為數據報表添加【小計】、【總計】行

        在開發ERP系統的數據報表時,幾乎都是需要看到【小計】、【總計】這樣的匯總數據的,在數據報表的顯示列表中,最下面的一行通常就是【小計】或者【總計】的匯總行。如果手動為每個報表都增加匯總行,那也是一份不小的工作量。

        所以,如果能自動為每個數據報表自動添加【小計】、【總計】匯總行,那將可以節省不少的開發時間。本文將給出實現這種方案的思路原理以及源碼。

        本文中,報表數據的顯示使用的是WinForm的DataGridView控件,如果是Web項目,其原理和思路是一樣的。

        舉個栗子,零售店POS機上查詢銷售單的效果如下圖所示:

        

        在報表的最下面有一行【總計】,對數量和金額項進行了匯總。

        下面,我們來詳細講解是如何自動為其添加【總計】這一匯總行的。

       

      一.基本原理

      1.一般而言,數據報表的現實的核心數據是DataGridView綁定的一個列表List<T>,每一個T對象對應著報表中的一行數據。

      2.在數據報表中,【小計】、【總計】所對應的匯總行與上面列表中的其它普通行,是有區別的,所以,它們對應的T對象也是有區別的。

      3.我們通過T的一個名為 IsStatistics 的bool屬性來區別普通行與匯總行。如果IsStatistics為true,表示其對應的行就為匯總行。

      4.為了達到上面描述的這一目的,我們讓T必須實現接口IStatisticabled這個接口。

          public interface IStatisticabled
          {
              bool IsStatistics { set; get; }
          }

      5.為報表添加匯總行,實際上就是向List<T>列表中添加一個 IsStatistics 為true的 T 對象。

      6.然后,通過反射來統計需要匯總的那些項(即T的某些屬性),然后將匯總得到的結果賦值給匯總T對象對應的屬性。

      7.在綁定到DataGridView時,通過判斷列表中 T 對象的IsStatistics屬性,如果為true,就將該行Row對應的RowHeader的文本設置為【小計】或【總計】。

       

      二.思路實現

        就上面描述的思路來看,稍微有點難度的地方在于最后兩點,下面我們就詳細講解一下。

      1.為List<T>增加匯總行

        增加匯總行,所用到的主要技術就是反射Relection。

          /// <summary>
          /// 為數據報表增加一個匯總行。
          /// </summary>
          /// <typeparam name="T">報表記錄對象的類型</typeparam>
          /// <param name="list">數據行對象列表</param>
          /// <param name="statColumns">需要進行統計的列</param>
          public static void AddSumRow<T>(List<T> list ,params string[] statColumns) where T :IStatisticabled, new()
          {
              T sum = new T();
              sum.IsStatistics = true;
      
              foreach (string column in statColumns) //針對每一個匯總項
              {
                  double total = 0;
                  foreach (T t in list) //統計
                  {
                      object val = ReflectionHelper.GetProperty(t, column);
                      total += double.Parse(val.ToString());
                  }
                  object newTotal = TypeHelper.ChangeType(typeof(T).GetProperty(column).PropertyType, total);
                  ReflectionHelper.SetProperty(sum, column, newTotal);
              }
              list.Add(sum);
          }

      (1)為了可以動態new一個統計行,必須要讓T有 new() 這個約束。

      (2)將統計行的 IsStatistics 標記設置為true。

      (3)針對每一個統計項進行統計:通過反射拿到每一行該項的屬性值,并轉換成double類型(因為double兼容了所有的數值類型),進行累加,然后將累加的結果轉換成正確的類型,最后,賦值給統計行對應的屬性。

      (4)將統計行添加到list列表中,作為最后一個對象。

      2.綁定到DataGridView 

          List<RetailOrder> list = this.GetOrderList();
          AddSumRow(list, new string[] { "Count", "Money" });
          this.dataGridView1.DataSource = list;
      
          DataGridViewCellStyle style = new DataGridViewCellStyle();
          style.Font = new Font(this.dataGridView1.DefaultCellStyle.Font.Name, this.dataGridView1.DefaultCellStyle.Font.Size, FontStyle.Bold);
      
          this.dataGridView1.RowHeadersDefaultCellStyle = style;
          this.dataGridView1.Rows[list.Count - 1].HeaderCell.Value = "總計";
          this.dataGridView1.Rows[list.Count - 1].DefaultCellStyle = style;  

      (1)通過GetOrderList方法獲取到銷售單列表后,我們通過AddSumRow方法為其添加一個匯總行,并對【Count】、【Money】進行匯總。

      (2)將包含了匯總行的列表綁定到DataGridView。

      (3)將最后一行的RowHeader的Cell的value設置為【總計】 。

      (4)將【總計】行的所有數據顯示都變成粗體。

       

      三.示例源碼下載

      1.本文Demo源碼:DataReportsSample.rar

      2.該Demo中用到了ESBasic的反射幫助類ReflectionHelper,這里可以下載我的開源基礎類庫:ESBasic 源碼

       

      四.后續功能

          本文示例是一個【小計】、【總計】匯總功能的基礎展示,實際應用中,通常還會牽涉到以下問題:

      (1)當報表數據存在分頁時,一般會同時存在【小計】、【總計】行,【小計】是本頁的匯總,【總計】是所有業的匯總。

      (2)當DataGridView綁定的某些列對應著Entity的某個只讀屬性,并且這個只讀屬性不會返回null和string.Empty時,匯總行的這一列就會有文字顯示(這是一個非匯總行,目標單元格應該是空的),要如何處理?

      (3)當DataGridView的某一些是一個操作列,即對應著DataGridViewLinkColumn,如果讓匯總行的目標單元格中不出現Link,而是留空了?

      (4)有些數據的匯總,可能是要進行絕對值的匯總,那又該如何處理?

               這些問題,我們都將在下篇文章的示例中一并解決,敬請期待。

       

      posted @ 2018-04-18 09:47  zhuweisky  閱讀(3571)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 奇米777四色成人影视| 亚洲综合无码久久精品综合| 国产精品午夜av福利| 女人与牲口性恔配视频免费 | 国产精品视频午夜福利| 中国女人熟毛茸茸A毛片| 亚洲av激情五月性综合| 色8久久人人97超碰香蕉987| 国产成人精品永久免费视频| 亚洲色www永久网站| 欧洲国产成人久久精品综合| 四虎精品视频永久免费| 国产精品爆乳在线播放第一人称| 亚洲成人av在线资源网| 亚洲av专区一区| 久久亚洲色www成人| 射阳县| 日本一区二区不卡精品| 国产女人18毛片水真多1| 欧美日本国产va高清cabal| 国产偷国产偷亚洲高清日韩| 免费无码黄十八禁网站| 国产欧美日韩精品第二区| 高清破外女出血AV毛片| 99国产精品欧美一区二区三区| 国产精品亚洲А∨天堂免| 国产自拍偷拍视频在线观看| 99久久国产综合精品成人影院| 一本加勒比hezyo无码人妻| 久久久亚洲欧洲日产国码αv| 熟女人妻精品一区二区视频 | 国产毛片三区二区一区| 激情97综合亚洲色婷婷五| 大肉大捧一进一出视频| 色吊丝免费av一区二区| 蜜臀av一区二区精品字幕| 亚洲更新最快无码视频| 猫咪AV成人永久网站在线观看 | 中文字幕在线国产精品| 亚洲精品自拍视频在线看| 久久精品A一国产成人免费网站|