2014-10-29 3 views
0

Google 시각화 API를 사용하여 사용자 정의 보고서를 작성 중입니다. 각 섹션에는 6 개의 섹션이 있고 각 섹션에는 양쪽에 테이블이 있고 가운데에 차트가 있습니다.형식으로 Google.DataTable.Net.Wrapper에서 반환 된 표를 사용자 정의하십시오.

형식이 약간 씩 다르기 때문에 각 일회용 사례별로 수업을 정의하는 데 많은 시간을 투자했습니다.

나는 Google.DataTable.Net.Wrapper 3.1.0.0을 시도하기로 결정했습니다.

DataSet을 반환하는 저장 프로 시저를 만든 다음 내 컨트롤러의 DataSet을 통해 필요한 각 테이블을 전달합니다.

데이터는 내가 추가/"F"부분을 수정하는 방법을 알아낼 수 없습니다 등 돈이 형식 또는 다른 디스플레이 형식을 갖게됩니다 차트, 때로는 날짜 때때로이

rownum  charttypeid charttypename 
----------- ----------- ------------------ 
1   1   Membership Sales 

rownum  chartareaid chartareaname 
----------- ----------- ------------------------- 
1   1   Membership Sales Overview 
2   2   Membership Sales Chart 

title      value  display 
------------------------- ----------- ---------- 
# of Walk-ins    25   25 
# of Tours    17   17 
# of New Members   35   35 
Tour Conversion   78   78% 
Percent to Goal   87   87% 

Month value  display goalvalue goaldisplay 
----- ----------- ---------- ----------- ----------- 
Sep 3125  $3,125.00 1500  $1,500.00 
Oct 4500  $4,500.00 1500  $1,500.00 

과 같이 보입니다 표시 할 문자열 형식을 제공하는 셀의 내 컨트롤러 코드는 다음과 같습니다.

[ResponseType(typeof(List<ChartPanel>))] 
public IHttpActionResult GetChart(int gym, string dateCategory, string iso8601date, int id = -1) 
{    
    if (!String.IsNullOrWhiteSpace(dateCategory)) 
    { 
     dateCategory = dateCategory.ToLower(); 
     string strConnString = ConfigurationManager.ConnectionStrings["PrimaryDBConnection"].ConnectionString; 
     // return DataSet From USP 
     DataSet dashBoardDataSet = GetDataSQL(strConnString, gym, dateCategory, iso8601date, 0); 

     if (dashBoardDataSet != null) 
     { 
      int chartPanelCount = dashBoardDataSet.Tables[0].Rows.Count; 
      List<ChartPanel> chartTypeList = new List<ChartPanel>(); // list for all the panels 
      // first table describes the Chart Panels 
      int tableCount = 0; 

      for (int chartPanelLoop = 0; chartPanelLoop < chartPanelCount; chartPanelLoop++) 
      { // for every panel 
       tableCount++; 
       ChartPanel chartPanel = new ChartPanel(); 
       chartPanel.name = dashBoardDataSet.Tables[0].Rows[chartPanelLoop][2].ToString(); 
       // second table describes the following chart areas for the panel 
       int panelAreaCount = dashBoardDataSet.Tables[1].Rows.Count; 
       List<ChartArea> chartAreaList = new List<ChartArea>(); 
       int areaTableCount = tableCount; 
       for (int panelAreaLoop = 0; panelAreaLoop < panelAreaCount; panelAreaLoop++) 
       { // for every area 
        int areaTable = areaTableCount; 
        ChartArea chartArea = new ChartArea(); 
        chartArea.name = dashBoardDataSet.Tables[areaTable].Rows[panelAreaLoop][2].ToString(); 
        int chartAreaRowNum = panelAreaLoop + 1; 
        System.Data.DataTable systDT = new System.Data.DataTable(); 
        systDT = dashBoardDataSet.Tables[areaTable + chartAreaRowNum]; 
        var dt = systDT.ToGoogleDataTable(); //convert with wrapper 
    //issue ==>  //dt = RemoveColumnsWithTitleLikeDisplayAndPassCellContentsAsFormattedStringToPreviousCell(dt); 
        chartArea.table = JsonConvert.DeserializeObject(dt.GetJson()); 
        chartAreaList.Add(chartArea); 
        //} 
        if (chartAreaList.Count() > 0) chartPanel.areas = chartAreaList; 
        tableCount++; 
       }        
       if (chartPanel.areas != null && chartPanel.areas.Count() > 0) chartTypeList.Add(chartPanel); 
      } 
      return Ok(chartTypeList); 
     } 
     else { return NotFound(); } 
    } 
    else { return NotFound(); } 
} 

더 좋은 방법이 있습니까?

답변

1

알아 냈어. 여기에 (colName.Contains ("_ display")) 어떤 열을 찾고 이전 열의 형식화 된 ("f") 데이터로 만드는 해킹 코드가 있습니다.

서식 지정 열에 열을 매핑하기 위해 사용자 지정 클래스를 만들었습니다. 건물의 차트

사용자 정의 클래스

class ColumnDisplayMap 
{ 
    public int columnToFormat { get; set; } 
    public int formatColumn { get; set; } 
} 

방법

[ResponseType(typeof(List<ChartPanel>))] 
    public IHttpActionResult GetChart(int gym, string dateCategory, string iso8601date, int id = -1) 
    {    
     if (!String.IsNullOrWhiteSpace(dateCategory)) 
     { 
      dateCategory = dateCategory.ToLower(); 
      string strConnString = ConfigurationManager.ConnectionStrings["PrimaryDBConnection"].ConnectionString; 
      // return DataSet From USP 
      DataSet dashBoardDataSet = GetDataSQL(strConnString, gym, dateCategory, iso8601date, 0); 

      if (dashBoardDataSet != null) 
      { 
       int chartPanelCount = dashBoardDataSet.Tables[0].Rows.Count; 
       List<ChartPanel> chartTypeList = new List<ChartPanel>(); // list for all the panels 
       // first table describes the Chart Panels 
       int tableCount = 0; 

       for (int chartPanelLoop = 0; chartPanelLoop < chartPanelCount; chartPanelLoop++) 
       { // for every panel 
        ChartPanel chartPanel = new ChartPanel(); 
        chartPanel.name = dashBoardDataSet.Tables[0].Rows[chartPanelLoop][2].ToString(); 
        // second table describes the following chart areas for the panel 
        DataRow[] areaTableRows = dashBoardDataSet.Tables[1].Select("charttype = " + (chartPanelLoop + 1).ToString()); 
        int panelAreaCount = areaTableRows.Count(); 
        List<ChartArea> chartAreaList = new List<ChartArea>(); 
        for (int panelAreaLoop = 0; panelAreaLoop < panelAreaCount; panelAreaLoop++) 
        { // for every area 
         int areaTable = 1; 
         ChartArea chartArea = new ChartArea(); 
         chartArea.name = areaTableRows[panelAreaLoop][3].ToString(); // dashBoardDataSet.Tables[areaTable].Rows[panelAreaLoop][3].ToString(); 
         DataColumnCollection columns = dashBoardDataSet.Tables[areaTable + tableCount + 1].Columns; 
         DataRowCollection rows = dashBoardDataSet.Tables[areaTable + tableCount + 1].Rows; 
         Google.DataTable.Net.Wrapper.DataTable gdt = new Google.DataTable.Net.Wrapper.DataTable(); 
         List<ColumnDisplayMap> cMap = new List<ColumnDisplayMap>(); 
         foreach (DataColumn col in columns) 
         { 
          string colName = col.ToString(); 
          if (!colName.Contains("_display")) 
          { 
           ColumnType type = ColumnType.Number; 
           if (!col.IsNumeric()) type = ColumnType.String; 
           gdt.AddColumn(new Column(type, col.ToString(), col.ToString())); 
          }else 
          { 
           ColumnDisplayMap cdm = new ColumnDisplayMap(){columnToFormat = col.Ordinal - 1, formatColumn = col.Ordinal}; 
           cMap.Add(cdm); 
          } 
         } 
         foreach (DataRow row in rows) 
         { 
          var r = gdt.NewRow(); 
          for (int cellItem = 0; cellItem < row.ItemArray.Count(); cellItem++) 
          { 
           if (cMap.Any(c => c.columnToFormat.Equals(cellItem))) 
           { 
            r.AddCell(new Cell(row.ItemArray[cellItem], row.ItemArray[cellItem + 1].ToString())); 
           } 
           else if (cMap.Any(c => c.formatColumn.Equals(cellItem))) 
           { 
            // do nothing 
           } 
           else 
           { 
            r.AddCell(new Cell(row.ItemArray[cellItem], row.ItemArray[cellItem].ToString())); 
           } 
          } 
          gdt.AddRow(r); 
         } 

         chartArea.table = JsonConvert.DeserializeObject(gdt.GetJson()); 
         chartAreaList.Add(chartArea); 
         //} 
         if (chartAreaList.Count() > 0) chartPanel.areas = chartAreaList; 
         tableCount++; 
        }        
        if (chartPanel.areas != null && chartPanel.areas.Count() > 0) chartTypeList.Add(chartPanel); 
       } 
       return Ok(chartTypeList); 
      } 
      else { return NotFound(); } 
     } 
     else { return NotFound(); } 
    }