Как серия диаграмм C # связывает недостающие точки на экране? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть приложение C # Windows Forms, в котором есть экран, предназначенный для отображения Graph с использованием класса DataVisualization.Charting.Chart, где ось X состоит из DateTime, а ось Y состоит из целых чисел (цельявляется представление использования памяти в МБ во времени некоторых других процессов).Итак, я хочу отобразить это в формате Непрерывная функция .Но когда я установил тип объекта DataVisualization.Charting.Series на SeriesChartType.Line, форма очень странным образом построит график, см. Изображение ниже:

enter image description here

и когда я устанавливаю тип серии объектов на SeriesChartType.Point, отображается график:

enter image description here

Обратите внимание, что есть многоточек, которые не указаны, и это нормально, потому что между этими временными интервалами нет реестра использования памяти.Единственная проблема, на которую я здесь жалуюсь, заключается в том, что в режиме Line график строится таким странным образом.Код для генерации этих графиков:

private void CarregaSerieMemoria()
    {
        // this InvokeRequired is because it is called in a separeted Thread, the graph creation happens in the Else block
        if (this.InvokeRequired)
        {
            VoidVoidDelegate d = new VoidVoidDelegate(CarregaSerieMemoria);
            this.Invoke(d);
        }
        else
        {
            try {
                // Data table containing the Memory Usage history
                foreach (DataRow row in Dados.dsComponentes.Tables["MemoryHistory"].Rows)
                {
                    string proc = row["NomeProcesso"].ToString();
                    if (!string.IsNullOrEmpty(proc))
                    {
                        string dataStr = row["TimeStamp"].ToString();
                        string memoriaStr = row["Memoria"].ToString();
                        DateTime data;
                        int memoria;
                        try
                        {
                            data = DateTime.ParseExact(dataStr, "yyyyMMdd-HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
                            memoria = int.Parse(memoriaStr) / 1000;
                        }
                        catch (FormatException)
                        {
                            continue;
                        }
                        if (TemSerieProc(proc))
                        { // if there is already a Series object with proc name
                            Series s = this.chartMemory.Series.Where(x => x.Name.Equals(proc)).FirstOrDefault();
                            s.Points.AddXY(data, memoria);
                        }
                        else
                        {   // else creates a new Series object and add this current point (data,memoria)
                            Series s = DefineNovaSerie(proc);
                            s.XValueType = ChartValueType.DateTime;
                            s.Points.AddXY(data, memoria);
                            this.chartMemory.Series.Add(s);
                        }
                    }
                }

                chartMemory.ChartAreas[0].AxisX.LabelStyle.Format = "dd/MM/yyyy HH:mm:ss";
                chartMemory.ChartAreas[0].AxisX.Interval = 30;
                chartMemory.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Minutes;
                chartMemory.ChartAreas[0].AxisX.IntervalOffset = 1;
                chartMemory.ChartAreas[0].AxisX.Minimum = graphDateBegin.ToOADate();
                chartMemory.ChartAreas[0].AxisX.Maximum = graphDateEnd.AddHours(24).ToOADate();

                chartMemory.ChartAreas[0].AxisX.MajorGrid.LineWidth = 0;
                chartMemory.ChartAreas[0].AxisY.MajorGrid.LineWidth = 0;
                chartMemory.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
                chartMemory.ChartAreas[0].AxisY.ScaleView.Zoomable = true;

                chartMemory.ChartAreas[0].AxisX.Title = "Horário";
                chartMemory.ChartAreas[0].AxisY.Title = "Memória (MegaBytes)";

                chartMemory.MouseWheel += chartMemory_MouseWheel;
                chartMemory.MouseClick += chartMemory_MouseClick;
                chartMemory.Visible = true;
                labelLoad.Visible = false;
                btnReload.Visible = true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }

    private Series DefineNovaSerie(string proc)
    {

        Series temp = new Series(proc);

        temp.ChartType = SeriesChartType.Line;
        //temp.MarkerSize = 10;
        temp.Color = GetNextColor(nextColorInt++);

        return temp;
    }

1 Ответ

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

Вы заполняете диаграмму из неупорядоченных данных.Ваша ось x - это дата, поэтому ваши данные должны быть упорядочены по дате при добавлении точки на график.Вот пример (не проверенный), как вы можете решить проблему, отсортировав данные из таблицы данных в поле TimeStamp.

var dataTable = Dados.dsComponentes.Tables["MemoryHistory"];
var orderedDataView = new DataView(dataTable);
orderedDataView.Sort = "TimeStamp";
foreach (DataRow row in orderedDataView.ToTable().Rows)
{
    //rest of code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...