C#图表控件: X value of a horizontal bar chart is 0 for all points in the serie

标签 c# mysql charts xvalue

我的应用程序中有一个水平堆叠的条形图,我想弄清楚如何在用户点击条形图时获取 X 轴值。问题是当我在运行时查看值时,Y 值很好,但 X 值都是 0。

Screen capture

在上图中,浅蓝色条来自 Series[0],代表 MTD 销售额,而来自 Series[1] 的深蓝色条代表去年的销售额同月。我的目标是,当用户双击某个栏时,他将被带到该销售人员的详细销售报告。

我还没有尝试将我的图表切换为常规条形图,因为这是我最终需要的样子。但是我开始怀疑我在 XValue 字段中得到全 0 的原因是因为这个还是因为我使用字符串作为值的类型。

有没有人遇到过这个问题或者知道如何解决这个问题?

Screen capture of points at runtime

最佳答案

您使用其中一种条形图 图表类型。

与大多数普通类型相比,它们的 x 轴和 y 轴切换

因此,为了获得沿水平轴的值,您实际上需要获取 y 值

要获得双击数据点的 y 值,您可以执行 HitTest就像在这段代码中:

private void chart1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    var hit = chart1.HitTest(e.X, e.Y, ChartElementType.DataPoint);
    if (hit.PointIndex >= 0)
    {
        DataPoint dp = hit.Series.Points[hit.PointIndex];
        Console.WriteLine(dp.YValues[0]);
    }
}

但是请注意,在堆叠条形图中,值看起来堆叠在一起,但每个点仍然只有自己的值。

如果您想获得堆叠/汇总值,您必须将下面的所有点相加,包括被击中的点。这里的“下方”表示位于相同 x 槽但在较低系列中的点!

如果您将 x 值添加为字符串,您将无法使用它们,因为在这种情况下它们都将是 0,如您在屏幕截图中所见。

但由于您案例中的所有堆叠点都将具有相同的 e.PointIndex 我们可以使用它来访问以下系列中的所有点..:

    ..
    int si = 0;
    double vsum = 0;
    Series s = null;
    do
    {
        s = chart4.Series[si++];
        vsum += s.Points[hit.PointIndex].YValues[0];

    } while (hit.Series != s);
    Console.WriteLine(vsum);

如果您真的想访问 x 值,您有两个选择:

  • 您可以将字符串显式添加到每个 DataPointAxisLabel。虽然 x 值仍将全部为 0,但现在可以访问 AxisLabels

  • 或者您可以将它们添加为数字,也许使用某种方案将字符串映射 为数字并返回,然后再次设置AxisLabels

关于C#图表控件: X value of a horizontal bar chart is 0 for all points in the serie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53052646/

相关文章:

charts - c3.js:可以标记 x 轴和多个 y 轴吗?

c# - 如何将嵌套对象映射到现有的嵌套对象?

c# - 使用单击一次部署时的安装问题

c# - 在实体类中访问 LINQ-2-SQL DataContext

javascript - 错误做法 - 从 PHP while 循环为 getElementbyID 生成 javascript 代码

php - 如何将多对多关系查询结果放入yii2中的 GridView 中?

.NET 图表控件 - X 轴文本旋转

c# - 窗口 SizeToContent 和 ListBox 大小调整

php - MySQL 生成的下拉列表的选定值

javascript - 更改 Highcharts 工具提示值