2013-04-09 9 views
20

Obecnie próbuję wyświetlić wykres przy użyciu formularzy okien, które pokazuje miesięczne dane na osi X i liczbę całkowitą na osi Y; Jednak nie jestem ustawieniu zakresu odpowiednio dla osi x, gdzie MonthYear jest DateTime:Jak ustawić zakres DateTime na osi X dla System.Windows.Forms.DataVisualization.Charting?

var pnChart = new System.Windows.Forms.Panel(); 
pnChart.Controls.Clear(); 
DataTable dtChartData = myDatabaseLayer.BuildDataTable("SELECT Added, Modified FROM tblStatistics WHERE ApplicationID = " + intApplicationID + " ORDER BY MonthYear"); 
Chart chart = GenerateChart(dtChartData, pnChart.Width, pnChart.Height, "ActiveBorder", 6); 
chart.Series[0].XValueType = ChartValueType.DateTime; 
chart.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy-MM-dd"; 
chart.ChartAreas[0].AxisX.Interval = 1; 
chart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Months; 
chart.ChartAreas[0].AxisX.IntervalOffset = 1; 
pnChart.Controls.Add(chart); 

Problem jest, gdy wyświetlany jest wykres, oś X ma datetime „1900-01-01” więc moje pytanie brzmi: jak ustawić zakres dat na początek 2013-01-01?

Uwaga Przeszukałem internet i próbował następujące ustawienia, ale oni nie dają mi prawidłowy zakres:

chart.ChartAreas[0].AxisX.Maximum = DateTime.Now.Ticks; 

Albo

chart.ChartAreas[0].AxisX.Crossing = DateTime.Now.Ticks; 

Albo

chart.ChartAreas[0].AxisX.Minimum = DateTime.Now.Ticks; 

TIA.

UPDATE: Należy pamiętać, że znalazłem sposób ustawić zakres właściwie to przy użyciu:

  chart.Series[0].XValueType = ChartValueType.DateTime; 
      DateTime minDate = new DateTime(2013, 01, 01); 
      DateTime maxDate = DateTime.Now; 
      chart.ChartAreas[0].AxisX.Minimum = minDate.ToOADate(); 
      chart.ChartAreas[0].AxisX.Maximum = maxDate.ToOADate(); 

Powyższy kod ustawia odpowiedni zakres teraz na osi X; jednak sam wykres jest pusty.

UPDATE 2:

Tak, dziękuję DasKrumelmonster - że stała się! Używałem kodu z http://www.codeproject.com/Articles/168056/Windows-Charting-Application i po prostu powinienem przyjrzeć się bliżej funkcji chronionej przez autora wewnętrznej funkcji Chart GenerateChart (DataTable dtChartDataSource, int width, int height, string bgColor, int intType). Aby rozwiązać ten problem, zmieniłem te linie:

foreach (DataRow dr in dtChartDataSource.Rows) 
{ 
    double dataPoint = 0; 
    double.TryParse(dr[dc.ColumnName].ToString(), out dataPoint); 
    DataPoint objDataPoint = new DataPoint() { AxisLabel = "series", YValues = new double[] { dataPoint } }; 
    chart.Series[series].Points.Add(dataPoint); 
} 

do tego:

DateTime dtStart = new DateTime(2013, 01, 01); 
int intMonthCounter = 0; 
//Add data points to the series 
foreach (DataRow dr in dtChartDataSource.Rows) 
{ 
    double dataPoint = 0; 
    double.TryParse(dr[dc.ColumnName].ToString(), out dataPoint); 
    DataPoint objDataPoint = new DataPoint() { AxisLabel = "series", YValues = new double[] { dataPoint } }; 
    chart.Series[series].Points.AddXY(dtStart.AddMonths(intMonthCounter), dataPoint); 
    intMonthCounter++; 
} 

dziękuję!

Odpowiedz

34

Nie można odtworzyć. Próbowałem tego kodu:

private void button1_Click(object sender, EventArgs e) 
{ 
    var s = new Series(); 
    s.ChartType = SeriesChartType.Line; 

    var d = new DateTime(2013, 04, 01); 

    s.Points.AddXY(d, 3); 
    s.Points.AddXY(d.AddMonths(-1), 2); 
    s.Points.AddXY(d.AddMonths(-2), 1); 
    s.Points.AddXY(d.AddMonths(-3), 4); 

    chart1.Series.Clear(); 
    chart1.Series.Add(s); 


    chart1.Series[0].XValueType = ChartValueType.DateTime; 
    chart1.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy-MM-dd"; 
    chart1.ChartAreas[0].AxisX.Interval = 1; 
    chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Months; 
    chart1.ChartAreas[0].AxisX.IntervalOffset = 1; 

    chart1.Series[0].XValueType = ChartValueType.DateTime; 
    DateTime minDate = new DateTime(2013, 01, 01).AddSeconds(-1); 
    DateTime maxDate = new DateTime(2013, 05, 01); // or DateTime.Now; 
    chart1.ChartAreas[0].AxisX.Minimum = minDate.ToOADate(); 
    chart1.ChartAreas[0].AxisX.Maximum = maxDate.ToOADate(); 
} 

Może naprawiłem twój błąd po drodze.

Działa zgodnie z oczekiwaniami: Jedna linia z czterema punktami danych, wszystkie etykiety osi X są widoczne, podobnie jak sam wykres. Jeśli problem nadal występuje, podaj pełny kod testowy wraz z opisem tego, co powinno się stać, a co się stanie.

+0

Skopiowano to w celu przetestowania. Nie widać żadnego wyniku. Obszar wykresu jest pusty. – C4u

+0

Interesujące. Po prostu spróbowałem ponownie i działa to dla mnie. 1) Utwórz nowy projekt WindowsForms. 2. Upuść przycisk i System.Windows.Forms.DataVisualization.Charting.Chart w formularzu 3) kliknij dwukrotnie przycisk, aby utworzyć procedurę obsługi zdarzenia 4) wstaw kod z powyższej 5) uruchom i ciesz się. Możesz dostosować maksymalny limit. –

+0

Hah. Dokładnie tak, jak próbowałem. Wygląda na to, że jest to dla mnie szczególny problem, ponieważ zadziałało dla twórcy wątków. W każdym razie, przegłosowałem to. Niektóre części były naprawdę pomocne. Mam teraz działający kod. – C4u

Powiązane problemy