2012-04-20 7 views
5

मुझे लगता है कि मैं VB.NET और DotNet.HighCharts उपयोग कर बनाई गई है श्रृंखला का एक सेट है:Highcharts और DotNet.HighCharts का उपयोग करते हुए "प्ले" पर होने वाले अनेक सीरीज

Dim SeriesList4As New List(Of Series)(stfipsList4.Count) 

कुछ इसी तरह क्या मैं ऐसा करना चाहते है http://jsfiddle.net/8M2fF/ को छोड़कर मैं पहले से जानते हुए भी कि कितने मैं बिना एकाधिक श्रृंखला में पारित करने में सक्षम होना चाहता हूँ।

VB कोड है कि ऊपर है कि उदाहरण के लिए बनाया यह है:

 Dim stfipsList4 = (From r In dt4.AsEnumerable() Select r("areaname")).Distinct().ToList() 
     Dim SeriesList4 As New List(Of Series)(stfipsList4.Count) 
     Dim seriesItem4(stfipsList4.Count) As Series 
     Dim xDate4 As DateTime 
     Dim fakeDate4 As String 
     Dim sX4 As Integer 

     sX4 = 1 
     For Each state In stfipsList4 
      Dim data As New Dictionary(Of DateTime, Decimal) 
      Dim stateVal As String = state.ToString 
      Dim recCount As Integer = dt4.Rows.Count - 1 
      Dim seriesPointCount As Integer = dt4.Compute("Count(population)", "areaname = '" + stateVal + "'") 
      Dim chartData As Object(,) = New Object(seriesPointCount - 1, 1) {} 
      Dim x As Integer = 0 
      For i As Integer = 0 To recCount 
       If dt4.Rows(i)("areaname").ToString = stateVal Then 
        fakeDate4 = "1/1/" + dt4.Rows(i)("periodyear").ToString 
        xDate4 = DateTime.Parse(fakeDate4) 
        chartData.SetValue(xDate4.Date, x, 0) 
        chartData.SetValue(dt4.Rows(i)("population"), x, 1) 
        x += 1 
       End If 

      Next 

      seriesItem4(sX4) = New Series With { 
         .Name = state.ToString, _ 
         .Data = New Helpers.Data(chartData) 
      } 

      SeriesList4.Add(seriesItem4(sX4)) 

      sX4 = sX4 + 1 
     Next 

     Dim iterateData As String = JsonSerializer.Serialize(seriesItem4(1)) 

      Dim chart4 As Highcharts = New Highcharts("chart4").SetOptions(New Helpers.GlobalOptions() With { _ 
       .[Global] = New [Global]() With { _ 
         .UseUTC = False _ 
        } _ 
       }).InitChart(New Chart() With { _ 
       .DefaultSeriesType = ChartTypes.Column, _ 
       .MarginRight = 10, _ 
       .Events = New ChartEvents() With { _ 
        .Load = "ChartEventsLoad" _ 
       } _ 
       }).SetTitle(New Title() With { _ 
       .Text = "Population" _ 
       }).SetTooltip(New Tooltip() With { _ 
        .Formatter = "function() { return '<b>' + this.series.name + '<br/>' + Highcharts.dateFormat('%Y', this.x) +'</b>: '+ Highcharts.numberFormat(this.y, 0, ','); }" _ 
       }).SetXAxis(New XAxis() With { _ 
       .Type = AxisTypes.Datetime, _ 
       .TickPixelInterval = 150 _ 
       }).SetYAxis(New YAxis() With { _ 
         .Min = 0, _ 
         .Title = New YAxisTitle() With { _ 
         .Text = "Population", _ 
         .Align = AxisTitleAligns.High _ 
         } _ 
       }).SetSeries(New Series() With { _ 
        .Data = New Helpers.Data(New Object() {}) _ 
       }) _ 
       .SetOptions(New Helpers.GlobalOptions() With { _ 
       .Colors = palette_colors _ 
       }) _ 
       .AddJavascripVariable("iterated", iterateData.ToString) _ 
       .AddJavascripFunction("ChartEventsLoad", "// set up the updating of the chart each second" & vbCr & vbLf & _ 
            " var result = iterated.data;" & vbCr & vbLf & _ 
            " var counter = 0;" & vbCr & vbLf & _ 
            " var series = this.series[0];" & vbCr & vbLf & _ 
            " var loopseries = function() {" & vbCr & vbLf & _ 
            " if (counter <= result.length) {" & vbCr & vbLf & _ 
            " var p = String(result[counter]);" & vbCr & vbLf & _ 
            " var splitp = p.split("","");" & vbCr & vbLf & _ 
            " var x = Number(splitp[0]);" & vbCr & vbLf & _ 
            " var y = Number(splitp[1]);" & vbCr & vbLf & _ 
            " series.addPoint([x, y], true, series.points.length > 10, true);" & vbCr & vbLf & _ 
            " counter++;" & vbCr & vbLf & _ 
            " } else {" & vbCr & vbLf & _ 
            " clearInterval(loopseries);" & vbCr & vbLf & _ 
            " }};" & vbCr & vbLf & _ 
            " setInterval(loopseries, 300);") 

     ltrChart4.Text = chart4.ToHtmlString() 

इसमें केवल एक श्रृंखला के लिए है। मैं एक सूची (श्रृंखला का) में गुजरना चाहता हूं। चीजें शामिल करने की आवश्यकता है कि: प्रत्येक श्रृंखला प्रत्येक श्रृंखला

मैं उन वस्तुओं यह सिर्फ मास्टर श्रृंखला "सूची" है कि मैं पूरा नहीं कर सकते में गुजर रहा है संभाल कर सकते हैं नामकरण करने के लिए जोड़ना अंक श्रृंखला के एन संख्या बना रहा है।

संपादित करें: वहाँ मैं क्या पूछ रहा हूँ पर कुछ भ्रम हो रहा है। मैं DotNet.HighCharts API के माध्यम से उच्च संख्या में श्रृंखला को एन-पास करने में सक्षम हूं। जो मैं वर्तमान में करने में सक्षम नहीं हूं, वह श्रृंखला के इस सेट को जावास्क्रिप्ट फ़ंक्शन में लूप करने और श्रृंखला को "प्ले" करने के लिए पास करता है। कृपया देखें:

  .AddJavascripVariable("iterated", iterateData.ToString) _ 
      .AddJavascripFunction("ChartEventsLoad", "// set up the updating of the chart each second" & vbCr & vbLf & _ 
           " var result = iterated.data;" & vbCr & vbLf & _ 
           " var counter = 0;" & vbCr & vbLf & _ 
           " var series = this.series[0];" & vbCr & vbLf & _ 
           " var loopseries = function() {" & vbCr & vbLf & _ 
           " if (counter <= result.length) {" & vbCr & vbLf & _ 
           " var p = String(result[counter]);" & vbCr & vbLf & _ 
           " var splitp = p.split("","");" & vbCr & vbLf & _ 
           " var x = Number(splitp[0]);" & vbCr & vbLf & _ 
           " var y = Number(splitp[1]);" & vbCr & vbLf & _ 
           " series.addPoint([x, y], true, series.points.length > 10, true);" & vbCr & vbLf & _ 
           " counter++;" & vbCr & vbLf & _ 
           " } else {" & vbCr & vbLf & _ 
           " clearInterval(loopseries);" & vbCr & vbLf & _ 
           " }};" & vbCr & vbLf & _ 
           " setInterval(loopseries, 300);") 

.AddJavaScriptVariable एक स्ट्रिंग की उम्मीद है और इन-अस्तर कोड मुझे अमान्य ऑब्जेक्ट संदर्भ दे रहा है।

उत्तर

5

मैं वास्तव में एक चार्ट श्रृंखला का एक अपरिभाषित संख्या है बनाने के लिए DotNet.Highcharts का उपयोग करें। ऐसा करने के लिए मैं linq का उपयोग कर चार्ट में जोड़ने के लिए आवश्यक डेटा के लिए पूछताछ करता हूं। मैं अलग-अलग बिंदु बनाने के लिए ऑब्जेक्ट [] की एक सूची का उपयोग करता हूं, फिर मैं उस सूची को लेता हूं और इसे श्रृंखला की सूची में जोड़ता हूं। मैं लूप के माध्यम से कई बार श्रृंखला के रूप में फिर से शुरू करने की जरूरत है। फिर SetSeries के लिए मैं श्रृंखला सूची में क्या शामिल था असाइनमेंट। कोड सी # में लिखा गया है लेकिन मुझे यकीन है कि आप इसे VB.NET में बदल सकते हैं। चार्ट बनाने के लिए मैं पूरे एक्शन रिसेट का उपयोग करता हूं:

public ActionResult CombinerBarToday(DateTime? utcStartingDate = null, 
            DateTime? utcEndingDate = null) 
{ 
    //GET THE GENERATED POWER READINGS FOR THE SPECIFIED DATETIME 
    var firstQ = from s in db.PowerCombinerHistorys 
       join u in db.PowerCombiners on s.combiner_id equals u.id 
       where s.recordTime >= utcStartingDate 
       where s.recordTime <= utcEndingDate 
       select new 
       { 
        CombinerID = u.name, 
        Current = s.current, 
        RecordTime = s.recordTime, 
        Voltage = s.voltage, 
        Watts = (s.current * s.voltage) 
       }; 

    //GET A LIST OF THE COMBINERS CONTAINED IN THE QUERY 
    var secondQ = (from s in firstQ 
        select new 
        { 
         Combiner = s.CombinerID 
        }).Distinct(); 

    /* THIS LIST OF SERIES WILL BE USED TO DYNAMICALLY ADD AS MANY SERIES 
    * TO THE HIGHCHARTS AS NEEDED WITHOUT HAVING TO CREATE EACH SERIES INDIVIUALY */ 
    List<Series> allSeries = new List<Series>(); 

    TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

    //LOOP THROUGH EACH COMBINER AND CREATE SERIES 
    foreach (var distinctCombiner in secondQ) 
    { 
     var combinerDetail = from s in db2.PowerCombinerHistorys 
       join u in db2.PowerCombiners on s.combiner_id equals u.id 
       where u.name == distinctCombiner.Combiner 
       where s.recordTime >= utcStartingDate 
       where s.recordTime <= utcEndingDate 
       select new 
       { 
        CombinerID = u.name, 
        Current = s.current, 
        RecordTime = s.recordTime, 
        Voltage = s.voltage, 
        Watts = (s.current * s.voltage)/1000d 
       }; 


     var results = new List<object[]>(); 

     foreach (var detailCombiner in combinerDetail) 
     { 
      results.Add(new object[] { 
          TimeZoneInfo.ConvertTimeFromUtc(detailCombiner.RecordTime, easternZone), 
          detailCombiner.Watts }); 
     } 

     allSeries.Add(new Series 
     { 
      Name = distinctCombiner.Combiner, 
      //Data = new Data(myData) 
      Data = new Data(results.ToArray()) 

     }); 
    } 

    Highcharts chart = new Highcharts("chart") 
    .InitChart(new Chart { DefaultSeriesType = ChartTypes.Spline, ZoomType = ZoomTypes.X}) 
    .SetTitle(new Title { Text = "Combiner History" }) 
    .SetSubtitle(new Subtitle { Text = "Click and drag in the plot area to zoom in" }) 
    .SetOptions(new GlobalOptions { Global = new Global { UseUTC = false } }) 
    .SetPlotOptions(new PlotOptions 
    { 
     Spline = new PlotOptionsSpline 
     { 
      LineWidth = 2, 
      States = new PlotOptionsSplineStates { Hover = new PlotOptionsSplineStatesHover { LineWidth = 3 } }, 
      Marker = new PlotOptionsSplineMarker 
      { 
       Enabled = false, 
       States = new PlotOptionsSplineMarkerStates 
       { 
        Hover = new PlotOptionsSplineMarkerStatesHover 
        { 
         Enabled = true, 
         Radius = 5, 
         LineWidth = 1 
        } 
       } 
      } 
     } 
    }) 
    .SetXAxis(new XAxis 
    { 
     Type = AxisTypes.Datetime, 
     Labels = new XAxisLabels 
     { 
      Rotation = -45, 
      Align = HorizontalAligns.Right, 
      Style = "font: 'normal 10px Verdana, sans-serif'" 
     }, 
     Title = new XAxisTitle { Text = "Time(Hour)" }, 
    }) 
    .SetYAxis(new YAxis 
    { 
     Title = new YAxisTitle { Text = "Kilowatt" } 
    }) 

    .SetSeries(allSeries.Select(s => new Series {Name = s.Name, Data = s.Data }).ToArray()); 

    return PartialView(chart); 
} 
+0

मुझे श्रृंखला की सूची प्राप्त करने में कोई समस्या नहीं है। यही वह है जो 'प्रत्येक राज्य में stfipsList4' कर रहा है। और मैं डिफ़ॉल्ट सूची का उपयोग कर चार्ट में कोई समस्या जोड़ने के लिए श्रृंखला को जोड़ने के लिए उस सूची के माध्यम से पुन: प्रयास कर सकता हूं। समय के माध्यम से श्रृंखला को एनिमेट/प्ले करने के लिए यह सवाल क्या है (हाईचर्ट्स डिफ़ॉल्ट लोडिंग एनीमेशन के साथ उलझन में नहीं)। जो मैं पूरा करने की कोशिश कर रहा था, उसके लिए मेरी जेएसफ़ील्ड देखें लेकिन केवल 1 श्रृंखला के साथ। मेरी समस्या यह है कि मुझे यकीन नहीं है कि श्रृंखला की सूची को जावास्क्रिप्ट फ़ंक्शन में कैसे पास किया जाए जो श्रृंखला को पुन: सक्रिय करता है और करता है। – wergeld

+0

मैं समझता हूं कि यह उत्तर DotNet.HighCharts एपीआई का उपयोग कर हाईचर्ट्स को एकाधिक श्रृंखला जोड़ने का एक अच्छा सामान्य समाधान है लेकिन यह पूछे गए प्रश्न को संबोधित नहीं करता है। यह क्या करता है चार्ट में एक बार श्रृंखला की सूची में सभी श्रृंखला जोड़ता है। यह उदाहरण जेएसफ़िल्ड में वर्णित श्रृंखला अंक नहीं चलाता है। – wergeld

+0

मैं मूल रूप से आपके प्रश्न को गलत पढ़ता हूं। मुझे क्षमा करें। मुझे नहीं पता कि लोग इसे क्यों वोट दे रहे हैं। यह डॉटनेट का उपयोग करने का एक अच्छा तरीका है। हाइचार्ट्स। लेकिन जैसा कि आपने बताया है कि यह आपके प्रश्न का उत्तर नहीं देता है। – Linger

संबंधित मुद्दे