我正在使用System.Windows.Forms.DataVisualization.Charting。 现在我有一个这样的柱状图。
但是我需要将网格放在这个列的旁边。
我该怎么做?
我的数据来自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 | -------------
答案 0 :(得分:2)
GridLines
与DataPoints
和Labels
一起去GridLines
,但是..
您可以为Interval
设置Minimum
和X-Axis
以将它们分开调整:
但是有一些额外的东西需要注意..
// 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
中隐藏该列。
最后,你会想要创建自定义标签,就像以前一样;只需将其内容更改为从包含月份名称的字符串列中提取。
这是它的样子: