Прокрутка / Перемещение области MS-диаграммы к выделенной точке данных в состоянии масштабирования - PullRequest
0 голосов
/ 13 июня 2019

В форме Windows я отображаю данные в MS Chart из Datagridview.

При выборе строки в сетке данных я выделяю соответствующую точку данных на диаграмме другим цветом.

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

        chart.ChartAreas.Add("LineGraphHistory");
        chart.ChartAreas["LineGraphHistory"].AxisX.Title = "X Axis";
        chart.ChartAreas["LineGraphHistory"].AxisX.MajorGrid.LineColor = System.Drawing.Color.Black;
        chart.ChartAreas["LineGraphHistory"].AxisX.MajorGrid.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dash;
        chart.ChartAreas["LineGraphHistory"].AxisY.Title = "Y Axis";
        chart.ChartAreas["LineGraphHistory"].AxisY.MajorGrid.LineColor = Color.Black;
        chart.ChartAreas["LineGraphHistory"].AxisY.MajorGrid.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dash;
        chart.ChartAreas["LineGraphHistory"].BackColor = Color.White;

        chart.ChartAreas["LineGraphHistory"].CursorX.IsUserEnabled = true;

      chart.ChartAreas["LineGraphHistory"].CursorX.IsUserSelectionEnabled = true;
        chart.ChartAreas["LineGraphHistory"].CursorX.Interval = 0;
        chart.ChartAreas["LineGraphHistory"].AxisX.ScaleView.Zoomable = true;
        chart.ChartAreas["LineGraphHistory"].AxisX.ScrollBar.Enabled = true;

        chart.Legends.Add("Legend");
        chart.Legends["Legend"].BorderColor = Color.Tomato;
        chart.DataSource = CSVDataTable;
        chart.ChartAreas["LineGraphHistory"].AxisX.IntervalType = DateTimeIntervalType.Seconds;
        chart.ChartAreas["LineGraphHistory"].AxisX.LabelStyle.Format ="dd-MM-yyyy\n hh:mm:ss"; ;
        chart.Series[s].XValueType =ChartValueType.DateTime ;
        chart.DataBind();
        chart.Update();



       private void cDataGrid_SelectionChanged(object sender, EventArgs e)
       {
            int nCount = csvDataGrid.SelectedRows.Count;
            if (nCount > 0)
            {
                for (int i = 0; i < nCount; i++)
                {
                    int index = csvDataGrid.SelectedRows[i].Index;
                    if (index >= csvDataGrid.Rows.Count-1)
                        return;
                     for (int k = 0; k < chart.Series.Count; k++)
                     {
                         DataPointCollection pr = chart.Series[k].Points;
                         pr[index].MarkerColor = Color.DarkGoldenrod;
                         pr[index].MarkerStyle = MarkerStyle.Star10;
                         pr[index].MarkerSize = 20;
                        // chart.
                       }
                       chart.Update();
                   }
               }
           }      

Как этого добиться?

Как предложил Тау, я попытался установить позицию масштаба. У меня есть 10 точек данных. Диапазон значений x точек данных составляет от 20 до 200. Каждое значение x имеет равную разницу 20. Размер вида равен 100. В режиме масштабирования, когда я прокручиваю до максимума, диапазон x составляет от 101 до 200 в представлении, последняя точка отображается как 5-я точка на виде. Принимая во внимание, что если я использую ваш код, чтобы установить положение масштаба, чтобы выделить последнюю точку данных, диапазон x станет 180-240, а выделенная последняя точка данных будет видна как первый диапазон.

Почему значения paintviewmin и paintviewmax меняются?

Изображения while scrolling

while setting scaleview

1 Ответ

0 голосов
/ 13 июня 2019

Вам необходимо рассчитать смещение от DataPoint dp.XValue, может быть, так:

Axis ax = chart.ChartAreas[0].AxisX;
var size = ax.ScaleView.ViewMaximum - ax.ScaleView.ViewMinimum;
ax.ScaleView.Position = dp.XValue - size / 2.0;

Пример:

enter image description here

Обновление: Когда отображаются меньшие наборы данных, автоматически добавленные поля портят простой расчет, приведенный выше. Чтобы избежать этого, вы можете добавить:

chart.ChartAreas[0].AxisX.IsMarginVisible = false;
...