2016-03-04 55 views
4

我創建了一個DotNet.Highcharts圖表使用兩個表中的數據:支出和收入。我正在使用SQL語句爲每個創建一個DataTable。第一個(Incomings)Dt包含IncCostIncDate。第二個(用於支出)名爲Dt2包含ExpCostExpDateDotNet.Highcharts:成本沒有繪製在正確的日期

我可以繪製IncCostIncDateExpCostExpDate。當我嘗試連接IncDateExpDate(最終)時,問題就出現了,因爲IncCostExpCost的成本是針對(最終)日期的位置繪製的,而不是與其相關的實際日期。

這裏是調用我用它來創建每個數據表:

SqlDataAdapter Adp = new SqlDataAdapter("select CONVERT(DATETIME, IncDate, 103) AS IncDate, SUM(IncCost) AS IncCost from Incomings GROUP BY CONVERT(DATETIME, IncDate, 103) ORDER BY CONVERT(DATETIME, IncDate, 103)", con); 

SqlDataAdapter Adp2 = new SqlDataAdapter("select CONVERT(DATETIME, ExpDate, 103) AS ExpDate, SUM(ExpCost) AS ExpCost from Expenditures GROUP BY CONVERT(DATETIME, ExpDate, 103) ORDER BY CONVERT(DATETIME, ExpDate, 103)", con); 

下面是調用每個這些從數據表

var dateArr = Dt.AsEnumerable().Select(r => r.Field<DateTime>("IncDate")).ToArray(); 
var objectArr = Dt.AsEnumerable().Select(r => r.Field<object>("IncCost")).ToArray(); 

var dateArr2 = Dt2.AsEnumerable().Select(r => r.Field<DateTime>("ExpDate")).ToArray(); 
var objectArr2 = Dt2.AsEnumerable().Select(r => r.Field<object>("ExpCost")).ToArray(); 

var res = dateArr.Concat(dateArr2).ToArray(); 
var final = res.Select(d => d.ToString(@"dd\/MM\/yyyy")).ToArray(); 

代碼這裏是我用來創建代碼我highchart:

Highcharts chart = new Highcharts("graph") 
    .SetTitle(new Title { Text = "Incoming Stats" }) 
    .SetXAxis(new[] { new XAxis { Categories = final } }) 
    .SetYAxis(new YAxis { Title = new YAxisTitle { Text = "Amount Incoming" } }) 
    .SetSeries(new[] 
    { 
     new Series { Name = "inc", Data = new Data(objectArr)}, 
     new Series { Name = "exp", Data = new Data(objectArr2) } 
    }); 

Plot 1

正如您所看到的,該系列正在創建中,但它們正在針對數組中的數字進行繪圖,而不是針對它應該鏈接的日期進行繪製。

我不知道我對解決方案有多接近或遠遠,但任何幫助表示讚賞。 這裏是我的進帳數據表

Here is the data for my incomings datatable Dt

這裏是我的支出數據表

Here is the data for my expenditures datatable (Dt2)

真的不知道如何去這一點。任何信息將不勝感激

回答

4

您的Y值與X值完全斷開。爲了達到你想要什麼,你需要如下重組數據:

 DateTime dt = new DateTime(2016, 2, 27); 

     Highcharts chart = new Highcharts("graph") 
      .SetTitle(new Title { Text = "Incoming Stats" }) 
      .SetXAxis(new XAxis { Type = AxisTypes.Datetime }) 
      .SetYAxis(new YAxis { Title = new YAxisTitle { Text = "Amount Incoming" } }) 
      .SetSeries(new[] 
      { 
       new Series { Name = "inc", Data = new Data(new object[,] { 
        {dt , 23 }, 
        {dt.AddDays(1) , 223 }, 
        {dt.AddDays(2) , 51 }, 
        {dt.AddDays(11) , 200 }, }) }, 
       new Series { Name = "exp", Data = new Data(new object[,] { 
        {dt.AddDays(5) , 100 }, 
        {dt.AddDays(6) , 23 }, 
        {dt.AddDays(11) , 23 }, 
        {dt.AddDays(19) , 35 }, 
        {dt.AddDays(35) , 288 }, }) } 
      }); 

enter image description here

編輯: 如何動態地做到這一點:

 object[,] data1 = new object[Dt.Rows.Count, 2]; 
     for (int i = 0; i < Dt.Rows.Count; i++) 
     { 
      data1[i, 0] = Dt.Rows[i]["IncDate"]; 
      data1[i, 1] = Dt.Rows[i]["IncCost"]; 
     } 

     object[,] data2 = new object[Dt2.Rows.Count, 2]; 
     for (int i = 0; i < Dt2.Rows.Count; i++) 
     { 
      data2[i, 0] = Dt2.Rows[i]["ExpDate"]; 
      data2[i, 1] = Dt2.Rows[i]["ExpCost"]; 
     } 

     Highcharts chart = new Highcharts("graph") 
      .SetTitle(new Title { Text = "Incoming Stats" }) 
      .SetXAxis(new XAxis { Type = AxisTypes.Datetime }) 
      .SetYAxis(new YAxis { Title = new YAxisTitle { Text = "Amount Incoming" } }) 
      .SetSeries(new[] 
      { 
        new Series { Name = "inc", Data = new Data(data1) }, 
        new Series { Name = "exp", Data = new Data(data2) } 
      }); 

enter image description here

從數據庫檢索到的數據:

enter image description here

enter image description here

+0

感謝你爲這個,雖然我希望它是動態的,而不是手動輸入數據 – Stuart

+0

您可以動態地做到這一點....我指出哪些核心問題在這裏:你正在使用錯誤的構造函數重載'Data(object [] data)',這導致你的'Series'的X和Y被完全解除關聯。相反,使用'Data(object [,] data)',這樣你有一組[X,Y]對,它解決了你所遇到的問題,而不是有兩個獨立的數組[X]和[Y ]彼此無關。無論您是否動態獲取數據結構,您的數據結構保持結果必須與上面顯示的結構相同。 – jsanalytics

+0

謝謝你的幫助。雖然我不知道如何以您建議的方式重構我的代碼以使其動態變化 – Stuart