c# - How can I paint selected rows in a DataGridView based on the values in two of the cells? -


i populating datagridview semicolon-delimited text file so:

private void existingappntmntrecs_load(object sender, eventargs e) {     datatable dt = separatedvalsfiletodatatable(appointments_file_name, ";");     datagridviewexistingappntmntrecs.datasource = dt; }  // 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 = 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();                 (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; } 

what want color rows have enddate value within 2 months of current date yellow, within 1 month orange, , date in past (meaning have lapsed) red.

there postpaint event may work, don't know how examine cell contents within row in event handler:

private void datagridviewexistingappntmntrecs_rowpostpaint(object sender, datagridviewrowpostpainteventargs e) {     // now? } 

here contents of file read (bogus/test data, header row prepended):

person;phone;email;org;addr1;addr2;city;st8;zip;visitnum;success;adsizeloc;meetingloc;meetingdate;meetingtime;adbeginmonth;adbeginyear;adendmonth;adendyear;notes b.b. king;2221113333;bbking@blues.com;virtuosos;1234 wayback lane;;chicago;il;98765;1;false;full page inside front cover;same org address;4/5/2017 2:03:12 pm;9:00 am;may;2017;may;2018;lucille name linda ronstadt;55577889999;rhondalinstadt@eaglet.com;eagles singer;la canada;;los angeles;ca;99988;1;false;full page inside cover;same org address;4/5/2017 2:05:23 pm;9:00 am;may;2017;may;2018;she had stuff 

if adendmonth + adendyear date equates 2 months or less away, entire row should yellow; if 1 month or less away, orange; if today or in past, paint red. finally, if 1 of rolling stones running app, paint black.

here pseudocode postpaint event, "todo:" don't know do:

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 } 

if goal simply, highlight rows fall within dates, changing rows background color may easier option. repainting rows may unnecessary. solution changes rows background color depending on dates in “endmonth” , “endyear” columns.

the cell formatting option however, fire , placing “coloring” checks every time cell changed or displayed unnecessary. if rows have been “colored”, things when new rows added or values in “endmonth” or “endyear” columns changed.

below code loops through datagridview , sets each row color based on criteria described. logic rows color straightforward (minus paint black). if date greater 2 months forward today’s date leave background color white. if date greater 1 month less 2 months color row yellow… etc.

i used similar approach read text file , create datatable. hope helps.

datatable dt; string filepath = @"d:\test\artist.txt"; char delimiter = ';';  public form1() {   initializecomponent(); }  private void form1_load(object sender, eventargs e) {   dt = gettablefromfile(filepath, delimiter);   datagridviewexistingappntmntrecs.datasource = dt;   updatedatagridcolors(); }  private datatable gettablefromfile(string filepath, char delimiter) {   list<string[]> allartists = getartistlist(filepath, delimiter);   datatable dt = gettablecolumns(allartists[0]);   int totalcols = dt.columns.count;   datarow dr;   (int = 1; < allartists.count; i++) {     string[] curartist = allartists[i];     dr = dt.newrow();     (int j = 0; j < totalcols; j++) {       dr[j] = curartist[j].tostring();     }     dt.rows.add(dr);   }   return dt; }  private list<string[]> getartistlist(string infilepath, char indelimiter) {   string pathtofile = infilepath;   char delimiter = indelimiter;   list<string[]> liststringarrays = file.readalllines(pathtofile).select(x => x.split(delimiter)).tolist();   return liststringarrays; }  private datatable gettablecolumns(string[] allheaders) {   datatable dt = new datatable();   foreach (string curheader in allheaders) {     dt.columns.add(curheader, typeof(string));   }   return dt; }  private color getcolorforrow(datarowview dr) {   // paint black ;-)   if (dr[0].tostring().equals("rolling stones")) {     return color.black;   }   datetime rowdate;   datetime datenow = datetime.now;   datetime twomonthslimit = datenow.addmonths(2);   datetime onemonthlimit = datenow.addmonths(1);   if (dr != null) {     string rowstringmonth = dr[17].tostring();     string rowstringyear = dr[18].tostring();     string rowstringdate = "1/" + rowstringmonth + "/" + rowstringyear;     if (datetime.tryparse(rowstringdate, out rowdate)) {       if (rowdate > twomonthslimit)         return color.white;       if (rowdate > onemonthlimit)         return color.yellow;       if (rowdate > datenow)         return color.orange;       if (rowdate.month == datenow.month && rowdate.year == datenow.year)         return color.orange;       // row date less todays month date       return color.red;     } // else date time parse unsuccessful - ignoring   }   // date null   return color.white; }  private void updatedatagridcolors() {   color rowcolor;   datarowview dr;   foreach (datagridviewrow dgvr in datagridviewexistingappntmntrecs.rows) {     dr = dgvr.databounditem datarowview;     if (dr != null) {       rowcolor = getcolorforrow(dr);       dgvr.defaultcellstyle.backcolor = rowcolor;       if (rowcolor == color.black)         dgvr.defaultcellstyle.forecolor = color.white;     }   } }  private void datagridviewexistingappntmntrecs_cellvaluechanged(object sender, datagridviewcelleventargs e) {   if (e.columnindex == 17 || e.columnindex == 18) {     //messagebox.show("end date changed");     updatedatagridcolors();   } }  private void datagridviewexistingappntmntrecs_rowsadded(object sender, datagridviewrowsaddedeventargs e) {   updatedatagridcolors(); } 

Comments