Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# 格式化图表数据点并显示标签工具提示_C#_Winforms_Tooltip_Mschart - Fatal编程技术网

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

C# 格式化图表数据点并显示标签工具提示,c#,winforms,tooltip,mschart,C#,Winforms,Tooltip,Mschart,这就是我的图表现在的样子: 我有以下问题: AxisX是一个DateTime,格式为diagram.ChartAreas[0].axix.LabelStyle.Format=“dd.MM.yy HH”。这是工作,但正如你所看到的,如果有许多小时的标签被切断。如何为X轴的每个标签设置鼠标悬停工具提示 序列1放置在次轴2上:diagram.Series[“S1”].YAxisType=AxisType.secondary。我使用diagram.ChartAreas[0].AxisY2.LabelS

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

我有以下问题:

  • AxisX
    是一个
    DateTime
    ,格式为
    diagram.ChartAreas[0].axix.LabelStyle.Format=“dd.MM.yy HH”。这是工作,但正如你所看到的,如果有许多小时的标签被切断。如何为X轴的每个标签设置鼠标悬停工具提示

  • 序列1放置在次轴2上:
    diagram.Series[“S1”].YAxisType=AxisType.secondary。我使用
    diagram.ChartAreas[0].AxisY2.LabelStyle.Format=“C0”格式化了货币的轴

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

    第2点的更新:多亏了TaW,将
    转换为
    ,效果良好

  • “我的系列1”的工具提示是通过以下方式创建的:

    foreach(图表系列[“S1”]中的数据点dp.点)
    {
    如果(dp.Y值[0]>0)
    {
    dp.ToolTip=dp.yValue[0].ToString(“C0”)+“Umsatz für Stunde”+dp.AxisLabel.ToString()+”;
    }
    其他的
    {
    dp.IsValueShownAsLabel=false;
    }
    }

  • 我想从
    axix
    开始计算小时,格式为
    “dd.MM.yy HH”
    。如何访问小时而不是
    dp.AxisLabel.ToString()
    这是错误的

    第3点的更新:多亏了TaW,
    DateTime.FromOADate(Convert.ToDouble(dp.XValue.ToString()).Hour正在工作


    谢谢,因为第2部分和第3部分是从我们留下的注释中解决的,所以我们有一个大问题:如何获得轴标签的工具提示

    似乎没有预定义的轴标签。
    轴本身支持
    工具提示,但不接受类似的
    #VALX

    因此,我们需要在点击
    标签时设置其提示值。我们可以这样做:

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

    一开始很简单:

    • 我们进行
      hittetest
    • 我们检查是否命中了其中一个
      AxisLabel
    • 然后我们将对象强制转换为
      CustomLabel
    这很有趣:我们使用的是普通的、自动创建的
    AxisLabels
    ,但是
    HitTest
    返回的是
    CustomLabels

    结果之一是我们没有
    ,而是
    位置
    起始位置
    值。由于标签是自动创建的,我们可以期望它们对称排列;因此,要获得
    ,我们只需取中间值即可

    由于您的x轴将
    DateTime
    转换为
    double
    ,因此我们现在可以像往常一样转换回
    DateTime
    ,并使用与
    标签样式
    相同的格式字符串格式化提示。如果你想,你当然可以在这里选择另一种格式

    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; 
        }
    }
    
    这样做的一个问题是,您需要很好地击中轴,否则工具提示将不会触发


    您可以通过使用自己的
    工具提示来避免这种情况,但这超出了此问题的范围;这将涉及一个
    计时器
    您在
    鼠标移动中启动/停止。您将在
    勾选事件中创建工具提示字符串,并且必须确保提示正确无误。

    1088,55应该四舍五入到1089只是一个输入错误,对吗?关于
    dp.ToolTip=dp.yvalue[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
    ,但给出的错误不是有效的日期时间