Настройка таблиц, возвращаемых из Google.DataTable.Net.Wrapper с форматом

Я делаю пользовательский отчет, используя Google Visualization API. Он будет состоять из 6 разделов, каждый из которых будет иметь таблицы по обе стороны и диаграмму в середине.

Поскольку форматы немного отличаются, я трачу много времени на определение классов для каждого разового случая.

Я решил попробовать Google.DataTable.Net.Wrapper 3.1.0.0.

Я создал хранимую процедуру, которая возвращает DataSet и затем проходит через DataSet в моем контроллере и передает каждую нужную мне таблицу.

Данные выглядят примерно так

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

Иногда диаграммы будут иметь денежные форматы или другие форматы отображения, иногда даты и т. Д. Я не могу понять, как добавить / изменить часть "f" ячейки, которая обеспечивает формат строки для отображения. Мой код контроллера выглядит так

[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(); }
    }
Другие вопросы по тегам