У меня есть WinForm с диаграммой и базой данных. Диаграмма получает данные из базы данных. Если нет данных, диаграмма не видна. Я хотел бы показать сообщение в месте диаграммы. Например: "Нет данных". Могу ли я это сделать?
if (chart1["Series1"].Points.Count == 0)
{
???
}
Спасибо! я посмотрю это!
..show a message in the chart..Can I do it?
Конечно. На самом деле существует много способов, от установки Title
диаграммы до использования события Paint
и DrawString
или создания TextAnnotation
и т. д.
Два последних параметра легко центрировать, и оба сохранят положение даже при изменении размера диаграммы.
Пример 1 - А 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()
, или вы Рискну перечислить весь набор, просто чтобы убедиться, что есть хотя бы один элемент.
Прочитайте комментарии. Я определенно на стороне Т.Дж.Кьяера. Кстати - Any реализован как .Length в массивах и как .Count в списках.
Конечно. На самом деле есть способы много, от использования события Paint и DrawString до создания TextAnnotation и т. д.