System.ArgumentOutOfRangeException при попытке изменить цвет ячейки в dataGridView
Я пытаюсь создать приложение для управления событиями. У меня есть окно с календарем на месяц. Вот так выглядит DataGridView:
Каждая ячейка представляет день месяца, и если на этот день запланировано еще одно событие, ячейка должна быть зеленого цвета. Я использую следующий сеттер:
public IList<Event> _EventsByMonth
{//this setter populates and colors the table
set
{
eventsByMonth = value;
dgvEventsByMonth.Rows.Add("", "", "", "", "", "", "");
dgvEventsByMonth.Rows.Add("", "", "", "", "", "", "");
dgvEventsByMonth.Rows.Add("", "", "", "", "", "", "");
dgvEventsByMonth.Rows.Add("", "", "", "", "", "", "");
dgvEventsByMonth.Rows.Add("", "", "", "", "", "", "");
//dgvEventsByMonth.Rows.Add("", "", "", "", "", "", "");
foreach (DataGridViewRow row in dgvEventsByMonth.Rows)
{
row.Height = (dgvEventsByMonth.ClientRectangle.Height - dgvEventsByMonth.ColumnHeadersHeight) / dgvEventsByMonth.Rows.Count;
}
if (eventsByMonth.Count != 0)
{
DateTime aux = new DateTime();
mapMonthDaysToEvents();
{
//in case the first event in the list is recurrent, the following method is necessary
aux = getNextOccurrenceDateOrStartDate(eventsByMonth[0]);
//I need to know which is the first weekday of the month
aux = aux.AddDays(1 - eventsByMonth[0].startDatetime.Day);
}
int firstWeekDayOfTheMonth = (int)aux.DayOfWeek;
int numberOfDays = DateTime.DaysInMonth(aux.Year, aux.Month);
for (int i = 0, DaysIterator = 1; DaysIterator <= numberOfDays; i++)
{
for (int j = 0; j < 7; j++)
{
//go over the uncovered days at the beginning of the calendar
while (i == 0 && j + 1 < firstWeekDayOfTheMonth)
{
j += 1;
}
dgvEventsByMonth.Rows[i].Cells[j].Value = DaysIterator;
//TODO check for events in that day. if any, color the cell
/*if (mappingOfMonthDaysToEventsByMonth[DaysIterator] != null)
{
dgvEventsByDay.Rows[i].Cells[j].Style.BackColor = Color.Green;
}*/
DaysIterator++;
}
}
}
dgvEventsByMonth.Refresh();
}
}
Помимо установки частного поля eventsByMonth, оно также должно заполнить и раскрасить сетку данных. Приведенное выше изображение окна календаря появилось, когда был прокомментирован следующий фрагмент кода:
//TODO check for events in that day. if any, color the cell
/*if (mappingOfMonthDaysToEventsByMonth[DaysIterator] != null)
{
dgvEventsByDay.Rows[i].Cells[j].Style.BackColor = Color.Green;
}*/
Следующее исключение было выдано, когда тот же код был некомментирован:
Exception thrown: 'System.ArgumentOutOfRangeException' in mscorlib.dll
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>EventManagementApplication.vshost.exe</AppDomain><Exception><ExceptionType>System.ArgumentOutOfRangeException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index</Message><StackTrace> at System.Collections.ArrayList.get_Item(Int32 index)
at System.Windows.Forms.DataGridViewCellCollection.get_Item(Int32 index)
at EventManagementApplication.CalendarView.set__EventsByMonth(IList`1 value) in D:\probleme in C C++ Java PHP Python\probleme in C C++ Java PHP Python\C#\EventManagementApplication\EventManagementApplication\View\CalendarView.cs:line 225
В чем проблема, учитывая тот факт, что заявление dgvEventsByMonth.Rows[i].Cells[j].Value = DaysIterator;
выше проблемный фрагмент никогда не выбрасывает исключение?
Когда выдается исключение, я ==3, j==5, DaysIterator==23.
Должен ли я попробовать другой метод, чтобы покрасить ячейку? Я не хочу застрять на этом. Для меня важнее заставить вещи работать, чем решать подобные проблемы.
2 ответа
Вы перебираете dgvEventsByMonth, но устанавливаете стиль для ячейки в dgvEventsByDay. Насколько я понимаю, его нужно заменить
По дампам трассировки и стека это должно происходить из ссылочного параметра индекса в DataGridView. В видимом нам коде нет ничего, что гарантировало бы dgvEventsByDay
имеет то же количество строк и столбцов, что и dgvEventsByMonth
, поэтому я бы предположил, что это максимальная строка, индексы столбцов меньше (3,5).
Предположительно (mappingOfMonthDaysToEventsByMonth[DaysIterator] != null)
test не всегда возвращается к истине, и это не удалось, потому что это был первый раз, когда он пытался установить задний цвет за пределами своих истинных границ.