Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MS图表数据值标签_C#_Asp.net Mvc_Charts_Mschart - Fatal编程技术网

C# MS图表数据值标签

C# MS图表数据值标签,c#,asp.net-mvc,charts,mschart,C#,Asp.net Mvc,Charts,Mschart,我正在使用MVC中的C#通过MS图表构建一个“堆叠柱”图表。我的图表有3个系列。我试图让每个系列的数据值标签显示在X轴下方,而不是每个列上 我一直在网上搜索,希望能找到一些指向类似布局的指针,但已经两天没有找到 有人能给我一些关于如何完成相同位置的数据值标签排列的指针吗 这里是最简单的解决方案。它的样式不是很好,但只需要几行: var months = new[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun",

我正在使用MVC中的C#通过MS图表构建一个“堆叠柱”图表。我的图表有3个系列。我试图让每个系列的数据值标签显示在X轴下方,而不是每个列上

我一直在网上搜索,希望能找到一些指向类似布局的指针,但已经两天没有找到


有人能给我一些关于如何完成相同位置的数据值标签排列的指针吗

这里是最简单的解决方案。它的样式不是很好,但只需要几行:

var months = new[] { "Jan", "Feb", "Mar", "Apr", "May", 
                     "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

for (int i = 0; i < pointCount; i++)
{
    double sum = 0;
    string label = "";
    for (int j = seriesCount - 1; j >= 0;  j--)
    {
        sum += chart.Series[j].Points[i].YValues[0];
        label += "\n" + +chart.Series[j].Points[i].YValues[0] ;
    }
    chart.Series[0].Points[i].AxisLabel = months[i] + "\n"  + sum + label;
}
var months=new[]{“一月”、“二月”、“三月”、“四月”、“五月”,
“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
对于(int i=0;i=0;j--)
{
sum+=图表.系列[j].点[i].Y值[0];
label+=“\n”++图表.系列[j].点[i].Y值[0];
}
chart.Series[0]。Points[i]。AxisLabel=months[i]+“\n”+sum+label;
}
这会将标签字符串添加到第一个
系列的每个
数据点
。注意,每个点只能显示一个这样的标签;稍后
系列中的标签将被忽略

使用合适的计数器和标签月份部分所需的任何东西

为了获得更好的外观,比如粗体和彩色背景,你需要做更多的工作

请注意,标签和序列中的数字是反向堆叠的,因此内部循环是反向的


这将适用于任何数量的系列。

以下是使用
延迟事件的变体:

图表样式几乎占据了代码的大部分:

chart.BackColor = Color.DarkSlateGray;
ChartArea ca = chart.ChartAreas[0];
chart.Legends[0].Alignment = StringAlignment.Center;
chart.Legends[0].Docking = Docking.Top;
chart.Legends[0].BackColor =  chart.BackColor;
chart.Legends[0].ForeColor = Color.White;

Legend L = chart.Legends[0];
L.CustomItems.Add(Color.Silver, "Sum");

ca.BackColor = Color.LightSteelBlue;
ca.Position = new ElementPosition(2, 8, 93, 70);  // make room

ca.Area3DStyle.Enable3D = true;
ca.Area3DStyle.PointDepth = 25;
ca.Area3DStyle.WallWidth = 0;

ca.AxisX.MajorGrid.Enabled = false;
ca.AxisY.MajorGrid.LineColor = Color.White;
ca.AxisY.LineColor = Color.White;
ca.AxisY.LabelStyle.ForeColor = Color.White;
ca.AxisY.MajorTickMark.LineColor = Color.White;
ca.AxisX.LabelStyle.Enabled = false;
ca.AxisX.LineColor = Color.White;
ca.AxisX.MajorTickMark.Enabled = false;
使用ITE
颜色创建
系列
后,您需要应用它们,以便可以在代码中访问它们:

chart1.ApplyPaletteColors();
系列
s的漂亮圆形列是由
CustomProperty

s.SetCustomProperty("DrawingStyle", "Cylinder");
更多详情:

chart.Series[1].Color = Color.Crimson;
chart.Series[0].LegendText = "Hobbits";
..
更新:您需要在我的其他一些帖子中包括两个函数
InnerPlotPositionClientRectangle
ChartAreaClientRectangle
,如或

要做到这一点,请在
PageLoad
中连接事件:

chart1.PostPaint += new EventHandler<ChartPaintEventArgs>(chart1_PostPaint);
chart1.PostPaint+=新事件处理程序(chart1\u PostPaint);

这有点棘手。请参阅,以获取一个看起来不错但未与列对齐的示例。或者在标签中插入换行符,这很简单,但看起来并不好看。。或者你可以尝试自己画,这将能够做到这两个,但可能是最难的解决方案..非常感谢你TaW。这对我来说是一个很好的开始。我用尽了所有其他方法。上帝保佑你,先生。在研究了第一个答案后,你可能想看看第二个答案。我在模仿你发布的图片时玩得很开心,正如你所看到的:-)这甚至更好,颜色看起来也很漂亮。Taw,我正在使用Asp.NETMVC;我将无法使用“private void chart1_PostPaint(对象发送者,ChartPaintEventArgs e)”,因为它是针对windows版本的。是否存在调用此过程的变通方法?谢谢那么,在(MSDN)()中查到之后,我想它应该在ASP中工作得差不多。我不使用ASP,所以我不能发布实际的代码,但是参数看起来是一样的,所以应该可以工作。谢谢TaW!我使用了上面的链接:效果很好。我需要添加颜色并使框变宽。我还尝试使用您在上面的第一条注释中指定的书面代码,但是结果不好,所以我跳过了这种方法。我忘了提到MVC for asp.net没有创建页面加载事件的选项。我将查看是否有其他方法获得颜色。谢谢TaW。
chart.Series[1].Color = Color.Crimson;
chart.Series[0].LegendText = "Hobbits";
..
chart1.PostPaint += new EventHandler<ChartPaintEventArgs>(chart1_PostPaint);