Как показать сообщение, если данные диаграммы пусты?

У меня есть WinForm с диаграммой и базой данных. Диаграмма получает данные из базы данных. Если нет данных, диаграмма не видна. Я хотел бы показать сообщение в месте диаграммы. Например: "Нет данных". Могу ли я это сделать?

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

Конечно. На самом деле есть способы много, от использования события Paint и DrawString до создания TextAnnotation и т. д.

TaW 10.04.2019 23:46

Спасибо! я посмотрю это!

qwerteste 10.04.2019 23:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
315
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

..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 — это известно как запах кода.

Mafii 11.04.2019 08:51

Я бы не назвал это «запахом», так как 0 на самом деле не магическое число, но вы правы, Any действительно рекомендуемый выбор. Я пытался как можно больше придерживаться кода OP, но я добавлю его к ответу.

TaW 11.04.2019 08:52

Как бы вы это ни называли, это плохая практика, и ее следует избегать, особенно при использовании больших наборов данных (что может иметь место при рендеринге диаграммы).

Mafii 11.04.2019 08:53

Поскольку вы обновили свой комментарий: речь идет не о 0. Если это список, на самом деле это не имеет значения. Но вы получаете смешанный, непоследовательный стиль кода, потому что с Enumberables или Queryables вы действительно используете нужно, чтобы использовать .Any(), или вы Рискну перечислить весь набор, просто чтобы убедиться, что есть хотя бы один элемент.

Mafii 11.04.2019 08:57
Этот имеет хорошее обсуждение; но imo это хороший пример стиля и ясности по сравнению с (предполагаемой) производительностью.
TaW 11.04.2019 09:00

Прочитайте комментарии. Я определенно на стороне Т.Дж.Кьяера. Кстати - Any реализован как .Length в массивах и как .Count в списках.

Mafii 11.04.2019 09:02

Другие вопросы по теме