格式化图表数据点并显示标签工具提示

Formatting Chart DataPoints and showing a Label ToolTip

这是我的图表现在的样子:

我有这些问题:

  1. AxisX 是一个DateTime,格式为Diagramm.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM.yy HH";。这是有效的,但正如您所看到的,标签被切断的时间是否过长。如何为 X 轴的每个标签设置鼠标悬停工具提示?

  2. 系列 1 放在次要轴 Y2 上:Diagramm.Series["S1"].YAxisType = AxisType.Secondary;。我用 Diagramm.ChartAreas[0].AxisY2.LabelStyle.Format = "C0";

  3. 格式化了货币轴

据我了解,给定值 1088,55 应四舍五入为 1089 欧元,但如您所见,它已转换为 108855 欧元。但为什么?该值已作为双精度给出...

第 2 点的更新:感谢 TaW,将 , 转换为 .,这有效

  1. 我的 series1 的工具提示是用以下方法创建的:

    foreach (DataPoint dp in Diagramm.Series["S1"].Points) { if (dp.YValues[0] > 0) { dp.ToolTip = dp.YValues[0].ToString("C0") + " Umsatz für Stunde " + dp.AxisLabel.ToString() + ""; } else { dp.IsValueShownAsLabel = false; } }

我想要 AxisX 中的小时,其格式为 "dd.MM.yy HH"。我如何访问小时而不是 dp.AxisLabel.ToString() 这是错误的?

第 3 点的更新:感谢 TaW,DateTime.FromOADate(Convert.ToDouble(dp.XValue.ToString())).Hour 正在运行

谢谢

由于第 2 部分和第 3 部分已从评论中得到解决,我们剩下的是最重要的部分:我们如何获得轴标签的工具提示。

似乎没有预定义的轴标签。 Axis 本身确实支持 ToolTip 但不接受像 #VALXKeywords 等。

所以我们需要在点击Label时设置它的小费值。以下是我们如何做到这一点:

我们对 MouseMove 事件进行编码以测试是否命中 Label。然后我们使用在那里找到的数据创建一个 ToolTip 字符串。

开始很简单:

  • 我们做 HittTest
  • 我们检查是否命中了 AxisLabels
  • 然后我们将对象转换为CustomLabel

这很有趣:我们使用的是普通的、自动创建的 AxisLabels,但是 HitTest returns 是什么 CustomLabels!!

结果之一是我们没有 Value 而是 ToPositionFromPosition 值。由于标签是自动创建的,我们可以期望它们对称排列;所以要得到 Value 我们可以简单地取中间..

由于您的 x-axis 保持 DateTime 像往常一样转换为 double 我们现在可以转换回 DateTime 并使用与您用于的相同格式字符串格式化提示LabelStyle。如果你愿意,你当然可以在这里选择另一种格式..

private void chart_MouseMove(object sender, MouseEventArgs e)
{
    HitTestResult hit = chart.HitTest(e.X, e.Y, ChartElementType.AxisLabels);

    if (hit != null && hit.ChartElementType == ChartElementType.AxisLabels)
    {
        Axis ax = chart.ChartAreas[0].AxisX;
        var lab = hit.Object as CustomLabel;
        if (lab == null || lab.Axis != ax) return;
        double d = (lab.ToPosition + lab.FromPosition) / 2d;
        DateTime dt = DateTime.FromOADate(d);

        string tip =  dt.ToString(ax.LabelStyle.Format);
        ax.ToolTip = tip; 
    }
}

一个问题是您需要很好地击中轴,否则工具提示不会触发。

您可以使用自己的 ToolTip 来避免这种情况,但这超出了本问题的范围;它会涉及 Timer 你 start/stop 在 MouseMove 中。您将在 Tick 事件中创建工具提示字符串,并且必须确保提示来来去去很好..