#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, которое я установил, имеет правильное число!. Это действительно странно.
Фотографии:
Как вы можете видеть, значение есть, но когда я нажимаю 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 ;
}