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轴的每个标签设置鼠标悬停工具提示
diagram.Series[“S1”].YAxisType=AxisType.secondary代码>。我使用diagram.ChartAreas[0].AxisY2.LabelStyle.Format=“C0”格式化了货币的轴代码>
,
转换为
,效果良好
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
@TaWdp.XValue.ToString(“HH”)
为我提供了工具提示的值:“87欧元Umsatz für Stunde HH”
。使用断点返回XValue
,例如值41203.375
。我尝试了Convert.ToDateTime(dp.XValue.ToString()).Hour
,但给出的错误不是有效的日期时间