using System; using System.Drawing; using System.Windows.Forms; namespace DataTableParsingEngine { public class TableGroupParser { /// /// Paints rows according to their RowAttribute and detects whether or not they are part of a group. /// This function offers a faster method of determining all of this by starting at the row index that /// fired the row leave even. As opposed to the PaintRowGroups function which spins through all the /// DataGridView's rows. /// /// The starting index (the row that fired the RowLeave event) /// The DataGridView to parse. public static void PaintRowGroupsFromIndex(int startingIndex, DataGridView dataGridView) { //Underflow protection for the lazy. if (startingIndex < 0) { return; } var parser = new RowParser(); var isHeaderColumn = (int)SalesTableColumns.IsHeaderRow; var isMemberColumn = (int)SalesTableColumns.IsMemberRow; var isDirtyColumn = (int)SalesTableColumns.IsDirty; if (dataGridView.ColumnCount < Enum.GetNames(typeof(SalesTableColumns)).Length) { isHeaderColumn = (int)InventoryTableColumns.IsHeaderRow; isMemberColumn = (int)InventoryTableColumns.IsMemberRow; isDirtyColumn = (int)InventoryTableColumns.IsDirty; } //Spin through the dataGridView rows starting at the row that fired the event. for (var i = startingIndex; i < (dataGridView.RowCount - 1); i++) { //Get the status of the current row. var rowStatus = parser.GetRowAttribute(dataGridView.Rows[i]); //IF the current row is a header row... if (rowStatus == RowParser.RowAttribute.HeaderRow) { //Then check to see if the next row is a row header. rowStatus = parser.GetRowAttribute(dataGridView.Rows[i + 1]); //IF so, color code this row as White, since it is not a true group header. if (rowStatus == RowParser.RowAttribute.HeaderRow) { //Clear the current row of its attributes. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); return; } //IF the current row is not the first row in the data grid (index zero)... if (i > 0) { //The start by checking the previous row's status. rowStatus = parser.GetRowAttribute(dataGridView.Rows[i - 1]); //IF the previous row is a header row AND has color coding saying it is a group header, then clear the previous row's color and apply it to this row (i). if (rowStatus == RowParser.RowAttribute.HeaderRow && (bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue) { //Clear the previous row of its attributes. dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; //This condition means the user changed the members of a group, so the old header row needs to be updated in the database. dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); //Check the next row to see if its a member row before declaring the current row a header row. rowStatus = parser.GetRowAttribute(dataGridView.Rows[i + 1]); if (rowStatus != RowParser.RowAttribute.MemberRow) { //Clear the coloring from the current row. dataGridView.Rows[i].Cells[isHeaderColumn].Value = true; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); return; } //Set the current row as a header row. dataGridView.Rows[i].Cells[isHeaderColumn].Value = true; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.HeaderRow; return; } //IF the previous row is a header row OR if the previous row is index zero AND a member row, clear its coloring. if (rowStatus == RowParser.RowAttribute.HeaderRow || rowStatus == RowParser.RowAttribute.MemberRow && (i - 1) == 0) { //Set the current row and check for changes. if ((bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear the previous row of its attributes. dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); } //Then check to see if the next row is a member row rowStatus = parser.GetRowAttribute(dataGridView.Rows[i + 1]); if (rowStatus == RowParser.RowAttribute.MemberRow) { //Set the current row and check for changes. if (!(bool)dataGridView.Rows[i].Cells[isHeaderColumn].EditedFormattedValue) { dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } dataGridView.Rows[i].Cells[isHeaderColumn].Value = true; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.HeaderRow; //Set the next row as a member row. if (!(bool)dataGridView.Rows[i + 1].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i + 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i + 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } dataGridView.Rows[i + 1].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i + 1].Cells[isMemberColumn].Value = true; dataGridView.Rows[i + 1].DefaultCellStyle.BackColor = TableColors.MemberRow; } //IF previous row is Incomplete, then call the stable PaintRowGroups function. else if (rowStatus == RowParser.RowAttribute.IncompleteRow) { //PaintRowGroups(dataGridView); } } else { //Then check to see if the next row is a member row rowStatus = parser.GetRowAttribute(dataGridView.Rows[i + 1]); if (rowStatus != RowParser.RowAttribute.MemberRow) continue; //Set the current row and check for changes. if (!(bool)dataGridView.Rows[i].Cells[isHeaderColumn].EditedFormattedValue) { dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } dataGridView.Rows[i].Cells[isHeaderColumn].Value = true; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; //Set the next row as a member row. if (!(bool)dataGridView.Rows[i + 1].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i + 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i + 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } dataGridView.Rows[i + 1].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i + 1].Cells[isMemberColumn].Value = true; dataGridView.Rows[i + 1].DefaultCellStyle.BackColor = TableColors.MemberRow; } } else if (rowStatus == RowParser.RowAttribute.MemberRow) { if (i > 0) { //Check the previous row. rowStatus = parser.GetRowAttribute(dataGridView.Rows[i - 1]); //IF the previous row is a member row AND is the first row in the data grid, then remove the coloring from it and the current row (i). if (rowStatus == RowParser.RowAttribute.MemberRow && (i - 1) == 0) { //Clear the previous row of its attributes. if ((bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) { //And mark it as dirty if those attributes have been set for whatever reason. dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); //Check for changes in the current row. if ((bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear the current row of its attributes. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); } //IF the previous row is a member row AND it also has color coding suggesting that it is a member of a group, then add the current row (i) as well. else if (rowStatus == RowParser.RowAttribute.MemberRow && (bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) { //Check for changes in the current row. if (!(bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Set the current row as a member row. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = true; dataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } //IF the previous row is simply a member row with no coloring at all, then remove the coloring from the current row (i). else if (rowStatus == RowParser.RowAttribute.MemberRow || rowStatus == RowParser.RowAttribute.AdSpecialRow) { //Check for changes in the current row. if ((bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear the current row of its attributes. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); } //IF the previous row is a header row, then color it as a group header and color the current row as a member of said group. else if (rowStatus == RowParser.RowAttribute.HeaderRow && !(bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue) { //Set the previous row as a header row. if (!(bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = true; dataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = TableColors.HeaderRow; //This condition means the user created a group so the newly made header row will need to be updated in the database as well. dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; //Check for changes in the current row. if (!(bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Set the current row as a member row. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = true; dataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } else if (rowStatus == RowParser.RowAttribute.HeaderRow) { //Check for changes in the current row. if (!(bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Set the current row as a member row. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = true; dataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } //IF the previous row is incomplete, then call the stable PaintRowGroups function. else if (rowStatus == RowParser.RowAttribute.IncompleteRow) { //PaintRowGroups(dataGridView); } } //ELSE the current row is the first row in the data grid, therefore it can't be a member row so remove all coloring. else { //Clear the current row of its attributes. if (!(bool)dataGridView.Rows[0].Cells[isMemberColumn].EditedFormattedValue) { //If the row thinks that it's a member row then set it to dirty so the changes can be shown. dataGridView.Rows[0].Cells[isDirtyColumn].Value = true; dataGridView.Rows[0].HeaderCell.Style.BackColor = TableColors.PendingEdit; } dataGridView.Rows[0].Cells[isHeaderColumn].Value = false; dataGridView.Rows[0].Cells[isMemberColumn].Value = false; dataGridView.Rows[0].DefaultCellStyle.BackColor = default(Color); } } else if (rowStatus == RowParser.RowAttribute.AdSpecialRow) { if (i == 0) return; dataGridView.Rows[startingIndex].DefaultCellStyle.BackColor = TableColors.AdSpecial; //Get the previous row's attribute. rowStatus = parser.GetRowAttribute(dataGridView.Rows[i - 1]); if (rowStatus == RowParser.RowAttribute.HeaderRow) { //Check to see if the previous row sees itself as a header row, if so mark it dirty. if ((bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue) { dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear its color coding. dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); } //Next get the status of the next row. rowStatus = parser.GetRowAttribute(dataGridView.Rows[i + 1]); if (rowStatus == RowParser.RowAttribute.MemberRow) { //Check to see if the next row thinks it is a member row. if (!(bool)dataGridView.Rows[i + 1].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i + 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i + 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear its color coding. dataGridView.Rows[i + 1].Cells[isMemberColumn].Value = false; dataGridView.Rows[i + 1].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i + 1].DefaultCellStyle.BackColor = default(Color); } } } } public static void PaintRowGroups(DataGridView table) { } public static void PaintInventoryRowGroups(int startingIndex, DataGridView inventoryDataGridView, DataGridView masterDataGridView) { var isHeaderColumn = (int)InventoryTableColumns.IsHeaderRow; var isMemberColumn = (int)InventoryTableColumns.IsMemberRow; var isDirtyColumn = (int)InventoryTableColumns.IsDirty; var masterHeaderColumn = (int)SalesTableColumns.IsHeaderRow; var masterMemberColumn = (int)SalesTableColumns.IsMemberRow; var parser = new RowParser(); //Spin through the dataGridView rows starting at the row that fired the event. for (var i = startingIndex; i < (inventoryDataGridView.RowCount - 1); i++) { //Get the status of the current row. var rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i]); //IF the current row is a header row... if (rowStatus == RowParser.RowAttribute.HeaderRow) { //Then check to see if the next row is a row header. rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i + 1]); //IF so, color code this row as White, since it is not a true group header. if (rowStatus == RowParser.RowAttribute.HeaderRow) { //Clear the current row of its attributes. inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); return; } //IF the current row is not the first row in the data grid (index zero)... if (i > 0) { //The start by checking the previous row's status. rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i - 1]); //IF the previous row is a header row AND has color coding saying it is a group header, then clear the previous row's color and apply it to this row (i). if (rowStatus == RowParser.RowAttribute.HeaderRow && (bool)masterDataGridView.Rows[i - 1].Cells[masterHeaderColumn].EditedFormattedValue) { //Clear the previous row of its attributes. inventoryDataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; //This condition means the user changed the members of a group, so the old header row needs to be updated in the database. inventoryDataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; inventoryDataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); //Check the next row to see if its a member row before declaring the current row a header row. rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i + 1]); if (rowStatus != RowParser.RowAttribute.MemberRow) { //Clear the coloring from the current row. inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = true; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); return; } //Set the current row as a header row. inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = true; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.HeaderRow; return; } //IF the previous row is a header row OR if the previous row is index zero AND a member row, clear its coloring. if (rowStatus == RowParser.RowAttribute.HeaderRow || rowStatus == RowParser.RowAttribute.MemberRow && (i - 1) == 0) { //Set the current row and check for changes. if ((bool)masterDataGridView.Rows[i - 1].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear the previous row of its attributes. inventoryDataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); } //Then check to see if the next row is a member row rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i + 1]); if (rowStatus == RowParser.RowAttribute.MemberRow) { //Set the current row and check for changes. if (!(bool)masterDataGridView.Rows[i].Cells[masterHeaderColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = true; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.HeaderRow; //Set the next row as a member row. if (!(bool)masterDataGridView.Rows[i + 1].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i + 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i + 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } inventoryDataGridView.Rows[i + 1].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i + 1].Cells[isMemberColumn].Value = true; inventoryDataGridView.Rows[i + 1].DefaultCellStyle.BackColor = TableColors.MemberRow; } //IF previous row is Incomplete, then call the stable PaintRowGroups function. else if (rowStatus == RowParser.RowAttribute.IncompleteRow) { //PaintRowGroups(dataGridView); } } else { //Then check to see if the next row is a member row rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i + 1]); if (rowStatus != RowParser.RowAttribute.MemberRow) continue; //Set the current row and check for changes. if (!(bool)masterDataGridView.Rows[i].Cells[masterHeaderColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = true; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; //Set the next row as a member row. if (!(bool)masterDataGridView.Rows[i + 1].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i + 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i + 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } inventoryDataGridView.Rows[i + 1].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i + 1].Cells[isMemberColumn].Value = true; inventoryDataGridView.Rows[i + 1].DefaultCellStyle.BackColor = TableColors.MemberRow; } } else if (rowStatus == RowParser.RowAttribute.MemberRow) { if (i > 0) { //Check the previous row. rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i - 1]); //IF the previous row is a member row AND is the first row in the data grid, then remove the coloring from it and the current row (i). if (rowStatus == RowParser.RowAttribute.MemberRow && (i - 1) == 0) { //Clear the previous row of its attributes. if ((bool)masterDataGridView.Rows[i - 1].Cells[masterMemberColumn].EditedFormattedValue) { //And mark it as dirty if those attributes have been set for whatever reason. inventoryDataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } inventoryDataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); //Check for changes in the current row. if ((bool)masterDataGridView.Rows[i].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear the current row of its attributes. inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); } //IF the previous row is a member row AND it also has color coding suggesting that it is a member of a group, then add the current row (i) as well. else if (rowStatus == RowParser.RowAttribute.MemberRow && (bool)masterDataGridView.Rows[i - 1].Cells[masterMemberColumn].EditedFormattedValue) { //Check for changes in the current row. if (!(bool)masterDataGridView.Rows[i].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Set the current row as a member row. inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = true; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } //IF the previous row is simply a member row with no coloring at all, then remove the coloring from the current row (i). else if (rowStatus == RowParser.RowAttribute.MemberRow || rowStatus == RowParser.RowAttribute.AdSpecialRow) { //Check for changes in the current row. if ((bool)masterDataGridView.Rows[i].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear the current row of its attributes. inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); } //IF the previous row is a header row, then color it as a group header and color the current row as a member of said group. else if (rowStatus == RowParser.RowAttribute.HeaderRow && !(bool)masterDataGridView.Rows[i - 1].Cells[masterHeaderColumn].EditedFormattedValue) { //Set the previous row as a header row. if (!(bool)masterDataGridView.Rows[i - 1].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } inventoryDataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = true; inventoryDataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i - 1].DefaultCellStyle.BackColor = TableColors.HeaderRow; //This condition means the user created a group so the newly made header row will need to be updated in the database as well. inventoryDataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; //Check for changes in the current row. if (!(bool)masterDataGridView.Rows[i].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Set the current row as a member row. inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = true; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } else if (rowStatus == RowParser.RowAttribute.HeaderRow) { //Check for changes in the current row. if (!(bool)masterDataGridView.Rows[i].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Set the current row as a member row. inventoryDataGridView.Rows[i].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i].Cells[isMemberColumn].Value = true; inventoryDataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } //IF the previous row is incomplete, then call the stable PaintRowGroups function. else if (rowStatus == RowParser.RowAttribute.IncompleteRow) { //PaintRowGroups(dataGridView); } } //ELSE the current row is the first row in the data grid, therefore it can't be a member row so remove all coloring. else { //Clear the current row of its attributes. if (!(bool)masterDataGridView.Rows[0].Cells[masterMemberColumn].EditedFormattedValue) { //If the row thinks that it's a member row then set it to dirty so the changes can be shown. inventoryDataGridView.Rows[0].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[0].HeaderCell.Style.BackColor = TableColors.PendingEdit; } inventoryDataGridView.Rows[0].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[0].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[0].DefaultCellStyle.BackColor = default(Color); } } else if (rowStatus == RowParser.RowAttribute.AdSpecialRow) { if (i == 0) return; inventoryDataGridView.Rows[startingIndex].DefaultCellStyle.BackColor = TableColors.AdSpecial; //Get the previous row's attribute. rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i - 1]); if (rowStatus == RowParser.RowAttribute.HeaderRow) { //Check to see if the previous row sees itself as a header row, if so mark it dirty. if ((bool)masterDataGridView.Rows[i - 1].Cells[masterHeaderColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear its color coding. inventoryDataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); } //Next get the status of the next row. rowStatus = parser.GetRowAttribute(masterDataGridView.Rows[i + 1]); if (rowStatus == RowParser.RowAttribute.MemberRow) { //Check to see if the next row thinks it is a member row. if (!(bool)masterDataGridView.Rows[i + 1].Cells[masterMemberColumn].EditedFormattedValue) { inventoryDataGridView.Rows[i + 1].Cells[isDirtyColumn].Value = true; inventoryDataGridView.Rows[i + 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; } //Clear its color coding. inventoryDataGridView.Rows[i + 1].Cells[isMemberColumn].Value = false; inventoryDataGridView.Rows[i + 1].Cells[isHeaderColumn].Value = false; inventoryDataGridView.Rows[i + 1].DefaultCellStyle.BackColor = default(Color); } } } } public enum SalesTableColumns { Id = 0, AdItem = 1, Sold = 2, SalePrice = 3, TotalSales = 4, Cost = 5, ProfitReturn = 6, TotalProfitReturn = 7, IsHeaderRow = 8, IsMemberRow = 9, IsDirty = 10 } public enum InventoryTableColumns { Id = 0, AdItem = 1, BeginningInventory = 2, Recieved = 3, Total = 4, EndingInventory = 5, IsHeaderRow = 6, IsMemberRow = 7, IsDirty = 8 } public enum InvoiceTableColumns { Id = 0, InvoiceDate = 1, Supplier = 2, InvoiceNumber = 3, InvoiceNetAmountAtCost = 4, InvoiceNote = 5, IsDirty = 6 } } }