Я заполняю DataGridView текстовым файлом, разделенным точкой с запятой, например:
private void ExistingAppntmntRecs_Load(object sender, EventArgs e)
{
DataTable dt = SeparatedValsFileToDataTable(APPOINTMENTS_FILE_NAME, ";");
dataGridViewExistingAppntmntRecs.DataSource = dt;
}
// from http://stackoverflow.com/questions/39434405/read-csv-to-datatable-and-fill-a-datagridview (Frank)
public static DataTable SeparatedValsFileToDataTable(string filename, string separatorChar)
{
var table = new DataTable("Filecsv");
using (var sr = new StreamReader(filename, Encoding.Default))
{
string line;
var i = 0;
while (sr.Peek() >= 0)
{
try
{
line = sr.ReadLine();
if (string.IsNullOrEmpty(line)) continue;
var values = line.Split(new[] { separatorChar }, StringSplitOptions.None);
var row = table.NewRow();
for (var colNum = 0; colNum < values.Length; colNum++)
{
var value = values[colNum];
if (i == 0)
{
table.Columns.Add(value, typeof(String));
}
else
{ row[table.Columns[colNum]] = value; }
}
if (i != 0) table.Rows.Add(row);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
i++;
}
}
return table;
}
Что я хочу сделать сейчас, так это покрасить строки, которые имеют значение EndDate в пределах двух месяцев от текущей даты желтым цветом, в течение одного месяца оранжевым, а те, у которых дата в прошлом (что означает, что они истекли) красным.
Существует событие PostPaint, которое может работать, но я не знаю, как проверить содержимое ячейки в строке в этом обработчике событий:
private void dataGridViewExistingAppntmntRecs_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
// What now?
}
Вот содержимое прочитанного файла (фальшивые/тестовые данные, с добавленной строкой заголовка):
person;phone;email;org;addr1;addr2;city;st8;zip;visitNum;success;adSizeLoc;meetingLoc;meetingDate;meetingTime;adBeginMonth;adBeginYear;adEndMonth;adEndYear;Notes
B.B. King;2221113333;[email protected];Virtuosos;1234 Wayback Lane;;Chicago;IL;98765;1;false;Full Page Inside Front Cover;Same as Org Address;4/5/2017 2:03:12 PM;9:00 am;May;2017;May;2018;Lucille was her name
Linda Ronstadt;55577889999;[email protected];Eagles Singer;La Canada;;Los Angeles;CA;99988;1;false;Full page Inside Back Cover;Same as Org Address;4/5/2017 2:05:23 PM;9:00 am;May;2017;May;2018;She had some good stuff
Если дата adEndMonth + adEndYear соответствует 2 месяцам или менее, вся строка должна быть желтой; если осталось 1 месяц или меньше, оранжевый; если сегодня или в прошлом, покрасьте его в красный цвет. Наконец, если один из Rolling Stones использует приложение, покрасьте его в черный цвет.
Вот некоторый псевдокод для события PostPaint с «TODO:», где я не знаю, что делать:
private void dataGridViewExistingAppntmntRecs_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
DateTime twoMonthsLimit = DateTime.Now.AddMonths(2);
DateTime oneMonthLimit = DateTime.Now.AddMonths(1);
int endYear = // TODO: assign adEndYear value
int endMonth = // TODO: assign adEndMonth value
DateTime endDate = new DateTime(endYear, endMonth, 1);
if (twoMonthsLimit > endDate) // TODO: paint row yellow
if (oneMonthLimit > endDate) // TODO: paint row orange
if (endDate < DateTime.Now) // TODO: paint row red
}
CellFormatting
и в качестве альтернативы вместо использования краски вы можете просто изменить все строкиbackcolor
. Затем добавьтеfor
илиforeach
в зависимости от того, что вы предпочитаете, чтобы зациклить все строки. - person P. Pat   schedule 06.04.2017Double
, а неDateTime
. Может быть, сделать что-то вродеDateTime cellvalue = Convert.ToDateTime(dataGridView1.Rows[i].Cells[1].Value).AddMonths(1);
внутри циклаfor
, а затем попробовать сравнить это сendDate
и посмотреть, вызывает ли это событие? Попробую протестировать и посмотреть, что у меня получится. - person P. Pat   schedule 06.04.2017