时间:2015-09-06 14:21:26

标签: c# winforms charts

我正在使用System.Windows.Forms.DataVisualization.Charting。 现在我有一个这样的柱状图。

Image

但是我需要将网格放在这个列的旁边。

Image

我该怎么做?

我的数据来自DataGridView,所以我的代码看起来像这样。

var ser = chart1.Series.Add("ana");
ser.IsValueShownAsLabel = true;
ser.IsVisibleInLegend = false;
ser.ChartType = SeriesChartType.Column;

//X value is string
ser.XValueMember = dataGridView1.Columns[0].DataPropertyName;

//Y value is int
ser.YValueMembers = dataGridView1.Columns[1].DataPropertyName;

chart1.DataSource = dataGridView1.DataSource;

DataGridView中的数据很简单。

-------------
|Month|Sales|
-------------
| Jan | 17  |
-------------
| Feb | 28  |
-------------
| Mar | 19  |
-------------

1 个答案:

答案 0 :(得分:2)

GridLinesDataPointsLabels一起去GridLines,但是..

您可以为Interval设置MinimumX-Axis以将它们分开调整:

enter image description here

但是有一些额外的东西需要注意..

// get a reference
ChartArea chartArea1 = chart1.ChartAreas[0];

// don't start at 0
chartArea1.AxisX.IsStartedFromZero = false;

// pick your interval
double interval = 1D;
chartArea1.AxisX.MajorTickMark.Interval = interval;

// set minimum at the middle
chartArea1.AxisX.Minimum = interval / 2d;

// pick a column width (optional)
chart1.Series[0].SetCustomProperty("PixelPointWidth", "30");

// we want the labels to sit with the points, not the grid lines..
// so we add custom labels for each point ranging between the grid lines..
for (int i = 0; i <  chart1.Series[0].Points.Count; i++)
{
    DataPoint dp = chart1.Series[0].Points[i];
    chartArea1.AxisX.CustomLabels.Add( (0.5d + i) * interval, 
                                       (1.5d + i) * interval, dp.XValue.ToString());
}

<强>更新

正如您的更新问题所示,您正在将字符串数据绑定用作 X-Values 。这非常方便,但违背了Chart控件的核心特性。它的所有xalues,X-Value或任何Y-Values都在内部存储为双打。

随机字符串不会转换为双重,而您可以方便地将DataPoints字符串添加为X-Values,因此会出现各种丑陋的问题。< / p>

首先看一下X-Values本身:正如我所说的那样,它们是双倍的;当你检查它们的值时,你会发现它们都是0.字符串值在哪里?它们被放置在标签中。

一个问题经常发现您现在无法使用value expressions访问X-Values

另一个问题是我们现在无法为自定义标签提供范围 x-Values

解决方案:如果我们需要自定义标签,我们必须更改数据!

数据绑定很好,只需确保为包含月份编号的数据源添加数字列,并将其设置为系列的XValueMember

您可以在DataGridView中隐藏该列。

最后,你会想要创建自定义标签,就像以前一样;只需将其内容更改为从包含月份名称的字符串列中提取。

这是它的样子:

enter image description here