Столбец DataTable выравнивается по легенде диаграммы Winform - PullRequest
0 голосов
/ 07 октября 2018

Я хотел бы выровнять столбец данных с легендой управления диаграммой MS WinForm по оси x, как в Excel, так и на прикрепленном изображении (проверенный результат экспорта в Excel с использованием c # и Microsoft.Office.Interop.Excel)

Мой вопрос заключается в том, есть ли какие-либо параметры / функции, которые элемент управления MS Chart поддерживает по умолчанию для отображения условных обозначений диаграммы вместе с данными, как в Excel?Мои пользователи предпочитают просматривать в графическом интерфейсе (Winform) вместо экспорта в Excel.Я искал в MSDN столько, сколько мог, но так и не смог его найти.

Существуют ли другие альтернативные решения для этой проблемы?

Выравнивание столбца таблицы по MS-оси. Условные обозначения:

x

1 Ответ

0 голосов
/ 18 октября 2018

Да и нет.

Нет, нет опций / функций , которые бы отображали данные в таблице так, как вы это делаете.

Но да,Вы можете написать код для достижения этого.

Я вижу два варианта:

  • Вы можете создать собственную легенду с ячейками для хранения данных таблицы.См. здесь для довольно похожего примера!

  • Вы можете вкладывать DataGridView, стилизованный под то, что вы хотите, чтобы сидеть на графике.

Сложная проблема в обоих случаях - привести таблицу в соответствие с точками данных как изначально, так и при изменении размера диаграммы.

Код в ссылке не выполняетсямного, если вообще что-нибудь, в этом отношении.

2-й вариант должен был бы в любом случае использовать событие Pre- или PostPaint для достижения правильного позиционирования, поэтому должен быть достигнут хотя бы некоторый уровень выравнивания.

Вот пример снимка экрана:

enter image description here

Как вы можете заметить, я не приложил особых усилий при оформлении 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.Это на самом деле просто быстрый и грязный пример, который вы можете написать для него, но это потребует некоторых усилий ..

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

...