格式化图表数据点并显示标签工具提示
Formatting Chart DataPoints and showing a Label ToolTip
这是我的图表现在的样子:
我有这些问题:
AxisX
是一个DateTime
,格式为Diagramm.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM.yy HH";
。这是有效的,但正如您所看到的,标签被切断的时间是否过长。如何为 X 轴的每个标签设置鼠标悬停工具提示?
系列 1 放在次要轴 Y2 上:Diagramm.Series["S1"].YAxisType = AxisType.Secondary;
。我用 Diagramm.ChartAreas[0].AxisY2.LabelStyle.Format = "C0";
格式化了货币轴
据我了解,给定值 1088,55 应四舍五入为 1089 欧元,但如您所见,它已转换为 108855 欧元。但为什么?该值已作为双精度给出...
第 2 点的更新:感谢 TaW,将 ,
转换为 .
,这有效
我的 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
但不接受像 #VALX
等 Keywords 等。
所以我们需要在点击Label
时设置它的小费值。以下是我们如何做到这一点:
我们对 MouseMove
事件进行编码以测试是否命中 Label
。然后我们使用在那里找到的数据创建一个 ToolTip
字符串。
开始很简单:
- 我们做
HittTest
- 我们检查是否命中了
AxisLabels
- 然后我们将对象转换为
CustomLabel
这很有趣:我们使用的是普通的、自动创建的 AxisLabels
,但是 HitTest
returns 是什么 CustomLabels
!!
结果之一是我们没有 Value
而是 ToPosition
和 FromPosition
值。由于标签是自动创建的,我们可以期望它们对称排列;所以要得到 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
事件中创建工具提示字符串,并且必须确保提示来来去去很好..
这是我的图表现在的样子:
我有这些问题:
AxisX
是一个DateTime
,格式为Diagramm.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM.yy HH";
。这是有效的,但正如您所看到的,标签被切断的时间是否过长。如何为 X 轴的每个标签设置鼠标悬停工具提示?系列 1 放在次要轴 Y2 上:
Diagramm.Series["S1"].YAxisType = AxisType.Secondary;
。我用Diagramm.ChartAreas[0].AxisY2.LabelStyle.Format = "C0";
格式化了货币轴
据我了解,给定值 1088,55 应四舍五入为 1089 欧元,但如您所见,它已转换为 108855 欧元。但为什么?该值已作为双精度给出...
第 2 点的更新:感谢 TaW,将 ,
转换为 .
,这有效
我的 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
但不接受像 #VALX
等 Keywords 等。
所以我们需要在点击Label
时设置它的小费值。以下是我们如何做到这一点:
我们对 MouseMove
事件进行编码以测试是否命中 Label
。然后我们使用在那里找到的数据创建一个 ToolTip
字符串。
开始很简单:
- 我们做
HittTest
- 我们检查是否命中了
AxisLabels
- 然后我们将对象转换为
CustomLabel
这很有趣:我们使用的是普通的、自动创建的 AxisLabels
,但是 HitTest
returns 是什么 CustomLabels
!!
结果之一是我们没有 Value
而是 ToPosition
和 FromPosition
值。由于标签是自动创建的,我们可以期望它们对称排列;所以要得到 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
事件中创建工具提示字符串,并且必须确保提示来来去去很好..