【问题标题】:Formatting Chart DataPoints and showing a Label ToolTip格式化图表数据点并显示标签工具提示
【发布时间】:2017-05-03 08:17:58
【问题描述】:

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

我有这些问题:

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

  2. series1 放置在辅助 AxisY2 上: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; } }

我想从格式为"dd.MM.yy HH"AxisX 中获取小时。我怎样才能访问小时而不是 dp.AxisLabel.ToString() 这是错误的?

第 3 点更新:感谢 TaW,DateTime.FromOADate(Convert.ToDouble(dp.XValue.ToString())).Hour 工作正常

谢谢

【问题讨论】:

  • 1088,55 应该四舍五入到 1089 只是一个错字,对吧?
  • dp.ToolTip = dp.YValues[0].ToString("C0") + " Umsatz für Stunde " + dp.XValue.ToString("HH") + "";怎么样
  • @TaW 不是错字。 1088,55 是我给定的值,应该四舍五入到 1089。实际上它将 1088,55 更改为 108855 这是错误的
  • 对不起,我以为我也看到了一个正确的值,但它们都是“错误的”。看起来你只是用小数点输入它们是逗号,但你需要按照我们的约定输入它们1088.55!
  • @TaW dp.XValue.ToString("HH") 为我提供了工具提示的值:"87 € Umsatz für Stunde HH"。使用断点返回XValue,例如值41203.375。我试过Convert.ToDateTime(dp.XValue.ToString()).Hour,但给出的错误不是有效的日期时间

标签: c# winforms tooltip mschart


【解决方案1】:

由于第 2 和第 3 部分是从 cmets 中解决的,因此我们留下了一个大问题:我们如何获得轴标签的工具提示。

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

所以我们需要在点击Label 时设置它的tip 值。我们可以这样做:

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

开始很简单:

  • 我们做HittTest
  • 我们检查是否命中了AxisLabels 之一
  • 然后我们将对象投射到CustomLabel

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

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

由于您的 x 轴保持 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 来避免这种情况,但这超出了本问题的范围;这将涉及您在MouseMove 中启动/停止的Timer。您将在 Tick 事件中创建 ToolTip 字符串,并且必须确保提示顺利进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2020-05-20
    • 2018-05-13
    相关资源
    最近更新 更多