Да и нет.
Нет, нет опций / функций , которые бы отображали данные в таблице так, как вы это делаете.
Но да,Вы можете написать код для достижения этого.
Я вижу два варианта:
Вы можете создать собственную легенду с ячейками для хранения данных таблицы.См. здесь для довольно похожего примера!
Вы можете вкладывать DataGridView
, стилизованный под то, что вы хотите, чтобы сидеть на графике.
Сложная проблема в обоих случаях - привести таблицу в соответствие с точками данных как изначально, так и при изменении размера диаграммы.
Код в ссылке не выполняетсямного, если вообще что-нибудь, в этом отношении.
2-й вариант должен был бы в любом случае использовать событие Pre-
или PostPaint
для достижения правильного позиционирования, поэтому должен быть достигнут хотя бы некоторый уровень выравнивания.
Вот пример снимка экрана:
![enter image description here](https://i.stack.imgur.com/8erpF.png)
Как вы можете заметить, я не приложил особых усилий при оформлении DGV.Я не рассчитал высоту и не добавил столбец для отображения цветов строк / серий.
Самый интересный код в событии PrePaint
, где я
- резервирую местодля вложенного DGV
- вычислите левую и ширину для DGV
Вот мой код:
private void chart1_PrePaint(object sender, ChartPaintEventArgs e)
{
ca1.Position.Height = 60; // percent of chart!
L1.Position.Y = 90; // percent of chart!
dataGridView1.Parent = chart1;
int y = (int) ca1.AxisY.ValueToPixelPosition(ca1.AxisY.PositionToValue(65));
int x1 = (int) ca1.AxisX.ValueToPixelPosition(ca1.AxisX.Minimum);
int x2 = (int) ca1.AxisX.ValueToPixelPosition(ca1.AxisX.Maximum);
dataGridView1.Top = y;
dataGridView1.Left = x1;
dataGridView1.Width = x2 - x1;
}
L1
- это Legend
иca1
- это ChartArea
.Это на самом деле просто быстрый и грязный пример, который вы можете написать для него, но это потребует некоторых усилий ..
В зависимости от того, насколько гибким и динамичным вы хотите, чтобы он работал, вам придется добавить (может быть, довольно много) больше кода ..