Диаграмма не загружается при первом запуске

#c# #winforms

#c# #winforms

Вопрос:

Я создаю диаграмму на основе данных GridView, поэтому, если пользователь выбирает строку в моем представлении сетки, я выполняю создание диаграммы как:

      private void dgvUserActivity_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                var dg = (DataGridView)sender;
                if (e.RowIndex == -1) return;
                var selectedrowindex = dg.SelectedCells[0].RowIndex;
                var selectedRow = dg.Rows[selectedrowindex];
    
                var selectedUserName = selectedRow.Cells["UserName"].Value.ToString();
    
                UserActivityAuditModel = UserActivityModel.UserActivityAuditList.Where(x => x.UserName == selectedUserName).ToList();
    
                ClearChartPoints();
                userChart.Titles.Clear();
                LoadChart(UserActivityAuditModel);
            }
  

Затем я загружаю диаграмму как:

  private void LoadChart(IList<UserActivityAuditViewModel> model)
        {
            //Filter info

            var selectedTime = new List<TimeSpan>();
            if (rdoLogOn.Checked)
            {
               selectedTime = model.Select(x => x.AverageLogOn).ToList();
            }
            else if (rdoLogOff.Checked)
            {
                selectedTime = model.Select(x => x.AverageLogOff).ToList();
            }
            else
            {
                selectedTime = model.Select(x => x.AverageTotalHours).ToList();
            }


            Axis XA = userChart.ChartAreas[0].AxisX;
            Axis YA = userChart.ChartAreas[0].AxisY;
            Series S1 = userChart.Series[0];
            S1.ChartType = SeriesChartType.Line;

            //Add or change Title
            var title = new Title();
            title.Font = new Font("Arial", 14, FontStyle.Bold);
            title.Text = Helpers.FirstCharToUpper(model.Select(x => x.UserName).FirstOrDefault());
            userChart.Titles.Add(title);

            var dates = model.Select(x => x.ActivityDate).ToList();

            var currentRegister = 0;
            foreach (DateTime d in dates)
            {
                var yValue = selectedTime[currentRegister].ToString();
                S1.Points.AddXY(d, yValue);
                currentRegister  ;
            }

            var dt = DateTime.Now;
            S1.LegendText = "Year "   dt.Year;

            // move to the bottom center:
            userChart.Legends[0].Docking = Docking.Bottom;
            userChart.Legends[0].Alignment = StringAlignment.Center;


            if (!rdoTotalHours.Checked)
            {
                S1.YValueType = ChartValueType.Time;
                XA.LabelStyle.Format = "mm:ss";
            }
            else
            {
              

            }

            S1.XValueType = ChartValueType.Date;
            XA.MajorGrid.Enabled = false;
            XA.LabelStyle.Format = "MMM";

            XA.IntervalType = DateTimeIntervalType.Months;
            XA.Interval = 1;


            YA.IsInterlaced = true;
            //YA.MajorGrid.Enabled = false;
            YA.InterlacedColor = Color.FromArgb(31, Color.LightSeaGreen);
        }
  

По какой-то причине в моем первом клике DataGridView он выполняет создание диаграммы, я ее отлаживаю, и проблема в этом foreach clause :

   foreach (DateTime d in dates)
                {
                    var yValue = selectedTime[currentRegister].ToString();
                    S1.Points.AddXY(d, yValue);
                    currentRegister  ;
                }
  

Значение есть, после S1.Points.AddXY(d, yValue); выполнения я отлаживаю точки, значение Y всегда равно 0, но значение Y, которое я установил, имеет правильное число!. Это действительно странно.

Фотографии:

Рисунок 1

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

введите описание изображения здесь

Вместо моего значения добавлено значение 0

Примечание: Как я уже говорил, это только первая загрузка, если я снова нажму на любую строку, она загрузится правильно, у кого-нибудь есть представление о том, что там происходит? С уважением

—-РЕДАКТИРОВАТЬ—-

Я получаю yValue из своей глобальной модели:

 public IList<UserActivityAuditViewModel> UserActivityAuditModel { get; set; } = new List<UserActivityAuditViewModel>();
  

Затем я назначаю ее в зависимости от некоторых переключателей в начале метода диаграммы:

     var selectedTime = new List<TimeSpan>();
    if (rdoLogOn.Checked)
    {
       selectedTime = model.Select(x => x.AverageLogOn).ToList();
    }
    else if (rdoLogOff.Checked)
    {
        selectedTime = model.Select(x => x.AverageLogOff).ToList();
    }
    else
    {
        selectedTime = model.Select(x => x.AverageTotalHours).ToList();
    }
  

и я использую этот TimeSpan список в yValue

Я создаю простой тест, вместо этого загружаю свое Y значение с TimeSpan помощью Я создаю список int как:

 var testList = new List<int>();
            testList.Add(1);
            testList.Add(2);
            testList.Add(3);
            testList.Add(4);
            testList.Add(5);
            testList.Add(6);
            testList.Add(7);
            testList.Add(8);
            testList.Add(9);
            testList.Add(10);
            testList.Add(11);
            testList.Add(12);
            testList.Add(13);
  

Затем я использую в foreach качестве

   foreach (DateTime d in dates)
        {
            var yValue = testList[currentRegister].ToString();
            S1.Points.AddXY(d, yValue);
            currentRegister  ;
        }
  

И теперь диаграмма загружается при первой загрузке, но я не могу понять, почему не работает с временным интервалом при первой загрузке, может у кого-нибудь есть представление о том, что происходит, и решение для этого?

Комментарии:

1. Странно, можете ли вы очистить решение, затем закрыть VS, затем вручную удалить свои папки obj, bin и файл suo, а затем вы можете воспроизвести его? Также, где объявлено значение yValue, каков его тип данных? Время, хм, я не думаю, что это сработает, если отметки по оси X являются датами

2. Это значение объявляется в верхней части метода, у меня есть глобальная модель, затем я получаю список этой модели как TimeSpan и использую его в foreach, я попробую это @JeremyThompson

3. Просто чтобы проверить теорию, попробуйте представить время в виде числа, например, 08.54 yValue.ToString().Substring(0,4).Replace(":",".");

4. БОЖЕ! Это работает.. почему ??, ну, он установил значение в Y, но это не мое значение, оно всегда устанавливается 12:00, я думаю, это происходит, потому что это не более промежутка времени @JeremyThompson

5. Например, он установил его как 8.54, но когда он пытается изменить формат на Time, я думаю, что в конце дня он изменится на 12, так что есть обходной путь для установки AddXY с временным интервалом при первой загрузке? @JeremyThompson

Ответ №1:

Я нашел проблему

Диаграммы не поддерживаются TimeSpan , поэтому по какой-то причине при первом отображении диаграммы он конфликтует с Chart данными. Итак, самое простое решение, которое я нашел, — преобразовать TimeSpan в DateTime, в конце дня мы используем YValueType as Time , поэтому он будет принимать time значение DateTime и отображать вместо даты:

 foreach (DateTime d in dates)
        {
            var datetime = new DateTime(0).AddSeconds(selectedTime[currentRegister].TotalSeconds);
            S1.Points.AddXY(d, datetime);
            currentRegister  ;
        }