【问题标题】:How to show a message if chart data is empty?如果图表数据为空,如何显示消息?
【发布时间】:2019-04-10 21:35:03
【问题描述】:

我有带有图表和数据库的 WinForm。图表从数据库中获取数据。如果没有数据,则图表不可见。我想在图表的地方显示一条消息。例如:“还没有数据。”可以吗?

if (chart1["Series1"].Points.Count == 0)
{
   ???
}

【问题讨论】:

  • 当然。实际上有很多种方法,从使用 Paint 事件和 DrawString 到创建 TextAnnotation 等等。
  • 谢谢!我会看的!

标签: c# winforms mschart


【解决方案1】:

..在图表中显示一条消息..我可以这样做吗?

当然。实际上有很多方法,从设置图表的Title 到使用Paint 事件和DrawString 或创建TextAnnotation 等。

后两个选项很容易居中,即使调整图表大小,它们也会保持位置。

示例 1 - A TextAnnotation:

TextAnnotation ta = new TextAnnotation();

这样设置:

ta.Text = "No Data Yet";
ta.X = 45;  // % of the..
ta.Y = 45;  // chart size 
ta.Font = new Font("Consolas", 20f);
ta.Visible = false;  // first we hide it
chart1.Annotations.Add(ta);

每当数据改变时显示:

ta.Visible = (chart1.Series[seriesNameOrIndex].Points.Count == 0)

示例 2 - 在 Paint 事件中绘制消息:

private void chart1_Paint(object sender, PaintEventArgs e)
{
    if (chart1.Series[seriesNameOrIndex].Points.Count == 0)
    {
        using (Font font = new Font("Consolas", 20f))
        using (StringFormat fmt = new StringFormat()
        { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center })

            e.Graphics.DrawString("No data yet", 
                                  font, Brushes.Black, chart1.ClientRectangle, fmt);

    }
}

这应该保持自身更新,因为添加或删除 DataPoints 将触发 Paint 事件。

顺便说一句推荐方法是使用 Linq Any() 函数测试集合以包含任何数据:

(!chart1.Series[seriesNameOrIndex].Points.Any())

它的意图既尽可能快又清晰。

【讨论】:

  • 您应该使用!chart1.Series[seriesName].Points.Any() 而不是.Count == 0 - 这被称为代码异味
  • 我不会称它为“气味”,因为0 并不是一个真正的神奇数字,但你是对的,Any 确实是推荐的选择。我试图尽可能多地使用 OP 的代码,但我会将其添加到答案中..
  • 不管你怎么称呼它,这是不好的做法,应该避免,尤其是在使用大数据集时(在渲染图表时可能就是这种情况)
  • 自从您更新了您的评论:这与 0 无关。如果它是一个列表,那真的没关系。但是你会得到一个混合的、不一致的代码风格,因为对于 Enumberables 或 Queryables,你真的需要使用.Any(),或者你冒着枚举整个集合的风险来确定是否至少有一项。
  • 阅读 cmets。我绝对站在 T.J.Kjaer 一边。顺便说一句 - Any 在数组上实现为 .Length,在列表上实现为 .Count。
猜你喜欢
  • 2010-12-31
  • 2014-11-08
  • 2017-09-28
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多