How to show a message if chart data is empty?

1 c# mschart winforms

I have WinForm with chart and database.Chart get data from database. If no data the chart isn't visible. I would like to show a message in the chart place.For example: "No data yet." Can I do it?

if (chart1["Series1"].Points.Count == 0)
{
   ???
}
Run Code Online (Sandbox Code Playgroud)

TaW*_*TaW 5

..在图表中显示一条消息..可以吗?

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

后两个选项很容易居中,即使调整了图表大小,两个选项都将保持位置不变。

示例1 -A TextAnnotation

TextAnnotation ta = new TextAnnotation();
Run Code Online (Sandbox Code Playgroud)

像这样设置:

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);
Run Code Online (Sandbox Code Playgroud)

在数据更改时显示:

ta.Visible = (chart1.Series[seriesNameOrIndex].Points.Count == 0)
Run Code Online (Sandbox Code Playgroud)

示例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);

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

(!chart1.Series[seriesNameOrIndex].Points.Any())
Run Code Online (Sandbox Code Playgroud)

它既要尽可能快又要明确其意图。

  • 您应该使用`!chart1.Series [seriesName] .Points.Any()`而不是`.Count == 0`-这被称为代码气味 (2认同)