У вас есть много вариантов:
Вы можете сделать снимок экрана
Вы можете Save
Chart
's Изображение и DrawToBitmap
TextBox
, а затем нарисуйте 2-е изображение поверх первого.
Вы можете Save
Изображение Chart
и DrawString
the TextBox.Text
поверх изображения
Вы можете добавить TextBox
к Chart.Controls
(в коде!) И затем использовать DrawToBitmap
, чтобы диаграмма нарисовала оба в одно изображение.
Вы можете DrawString
текст в событии Chart.xxxPaint
и использовать DrawToBitmap
Следующие два параметра делают текстподлинная часть таблицы:
(рекомендуется :) вы можете использовать TextAnnotation
или RectangleAnnotation
: поместите его в подходящее место на Chart
и используйте, возможно,TextBox.TextChanged
событие для копирования текста в TextAnnotation
.Это наиболее «похожий на график» вариант, и, скорее всего, я бы это сделал.
Вы можете даже заменить TextBox
на редактируемый TextAnnotation
..!
Не видя диаграмму и не зная цели в деталях, трудно рекомендовать, в какую сторону идти.
Все Annotations
немного сложны для размещения, но будут перемещаться при изменении размера диаграммы и даже будут сохранены в xml при сериализации.Стоит учиться!
Обновление:
Вот пример, который помещает текст прямо под Legend
, предполагая, что он находится в верхней правой позиции по умолчанию.
Обратите внимание , что ElementPosition
содержит и местоположение, и размер, и что все числа указаны в процентах от контейнера, в случае Chart
..:
Сначала мы объявляем это глобально;мы также можем получить к нему доступ через коллекцию chart.Annotions
, но я ленивый;Также обратите внимание, что я использую RectangleAnnotation
, который совпадает с TextAnnotation
, но с возможностью выбора цвета и рамки сзади::
RectangleAnnotation RA = null;
Для его создания я использую этот код:
RA = new RectangleAnnotation();
RA.BackColor = Color.LightPink;
RA.Alignment = ContentAlignment.TopLeft;
chart.Annotations.Add(RA);
RaPos();
Для его размещения я использую функцию:
void RaPos()
{
if (RA == null) return;
ElementPosition LP = chart.Legends[0].Position;
RA.X = LP.X;
RA.Y = LP.Bottom + 5; // 5% below the legend
RA.Width = LP.Width;
RA.Height = 100 - LP.Bottom - 10; // leave 10% of the remaining space
}
Нам нужно адаптировать положение в некоторых точках, как здесь:
private void chart_SizeChanged(object sender, EventArgs e)
{
RaPos();
}
И синхронизировать его сtextbox:
private void textBox1_TextChanged(object sender, EventArgs e)
{
RA.Text = textBox1.Text;
}
При сохранении всех аннотаций do сохраняются, если только они не были размещены за пределами видимой области ..:
chart.SaveImage(someFileName.png, ChartImageFormat.Png);
Эта аннотация всегда будет сохранятьзакреплен под легендой и изменит его высоту, чтобы красиво заполнить оставшееся пространство ..
Также обратите внимание, что, добавив это: RA.AllowTextEditing = true;
пользователь может дважды щелкнуть прямоугольник и поместить Annotation
в режим редактирования с необходимостью отдельного TextBox
..
Обновление 2:
Теперь, когда вы разместили график, я вижу, что вы прикрепляете Легенду внизу.Конечно, в коде потребуются некоторые изменения, например, такие:
При настройке я создаю пространство справа:
ChartArea ca = chart.ChartAreas[0];
ca.Position = new ElementPosition(5, 5, 75, 85);
И в позиционировании создаю новую ElementPositionпрямо так, чтобы соответствовать:
// numbers are in percent!!
RA.X = 83;
RA.Y = 8;
RA.Width = 15;
RA.Height = 80;
Результат: