2013-04-09 4 views
20

현재 X 축의 월별 데이터와 Y 축의 정수 값을 표시하는 Windows 양식을 사용하여 차트를 표시하려고합니다.System.Windows.Forms.DataVisualization.Charting의 X 축에서 DateTime 범위를 어떻게 설정합니까?

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); 

문제는 차트가 표시 될 때, X 축이 날짜 "1900-01-01"을 가지고 : 그러나, 나는 MonthYear이 날짜 시간 인 X 축, 제대로 범위를 설정하고 있지 않다 그래서 내 질문은 2013-01-01에 시작하는 기간을 어떻게 설정합니까?

나는 다음과 같은 설정을 인터넷을 검색하고 시도 있습니다,하지만 그들은 나에게 올바른 범위를 제공하지 마십시오 :

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

또는

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

또는를

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

TIA.

UPDATE : 내가 제대로 사용하여이 범위를 설정하는 방법을 찾을 수 있습니다 :

  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(); 

위의 코드는 X 축 지금 적절한 범위를 설정; 그러나 이제는 차트 자체가 비어 있습니다.

업데이트 2 :

예, 당신에게 DasKrumelmonster 감사는 - 그게 고정! http://www.codeproject.com/Articles/168056/Windows-Charting-Application의 코드를 사용하고 있으며 작성자의 보호 된 내부 차트 GenerateChart (DataTable dtChartDataSource, int 너비, int 높이, 문자열 bgColor, int intType) 함수를 자세히 살펴 보았습니다. 이에

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); 
} 

:

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++; 
} 

감사합니다이 문제를 해결하려면, 나는이 라인을 변경!

답변

34

재생할 수 없습니다. 이 코드를 시도 :

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(); 
} 

어쩌면 내가 실수를 수정했습니다.

예상대로 작동합니다. 한 줄에 4 개의 데이터 점이 있으면 모든 x 축 레이블이 표시되고 그래프 자체도 표시됩니다. 여전히 문제가있는 경우 실제 상황과 실제 상황에 대한 설명과 함께 전체 테스트 코드를 제공하십시오.

+0

테스트를 위해 복사했습니다. 결과가 표시되지 않습니다. 차트 영역이 비어 있습니다. – C4u

+0

흥미 롭습니다. 방금 다시 시도해 보니 저에게 효과적입니다. 1) 새 WindowsForms 프로젝트를 만듭니다. 2. 폼에 System.Windows.Forms.DataVisualization.Charting.Chart를 놓고 버튼을 두 번 클릭하여 이벤트 처리기를 만듭니다. 4) 위에서 코드를 삽입합니다. 5) 실행하고 즐기십시오. 최대 제한을 조정할 수 있습니다. –

+0

하. 내가 시도한 방식대로. 스레드 작성자를 위해 일한 것처럼 나에게 특별한 문제인 것처럼 보입니다. 어쨌든, 나는 이것을 반대했다. 어떤 부분은 정말 도움이되었습니다. 지금 작업 코드가 있습니다. – C4u

관련 문제