diff --git a/AdvertsingProfitControl/NewModifyRecord.cs b/AdvertsingProfitControl/NewModifyRecord.cs index c5f160a..25a9908 100644 --- a/AdvertsingProfitControl/NewModifyRecord.cs +++ b/AdvertsingProfitControl/NewModifyRecord.cs @@ -599,7 +599,7 @@ namespace AdvertsingProfitControl var parser = new RowParsing(); if (parser.GetRowAttribute(dataGridView.Rows[e.RowIndex]) == RowAttribute.AdSpecialRow) { - _adSpecialIndex = e.RowIndex; + _adSpecialIndex = e.RowIndex; return; } //Section one (1) detected. @@ -717,6 +717,7 @@ namespace AdvertsingProfitControl } //If the ad item entered in the first cell is in the gUsedAdItems collection, then remove it from there. _usedAdItems[0].Remove(dataGridView.Rows[currentRowIndex].Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue.ToString()); + FlagRowsAsDirty(dataGridView, currentRowIndex); } else if (currentRowIndex < _adSpecialIndex) { @@ -750,6 +751,8 @@ namespace AdvertsingProfitControl } //If the ad item entered in the first cell is in the gUsedAdItems collection, then remove it from there. _usedAdItems[0].Remove(dataGridView.Rows[currentRowIndex].Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue.ToString()); + //Mark the rows as dirty before decrementing the _adSpecialIndex since this wouldn't account for the fact that the current row hasn't been cleared yet. + FlagRowsAsDirty(dataGridView, currentRowIndex, _adSpecialIndex); //Also decrement the _adSpecialIndex so that it points to the correct row. _adSpecialIndex--; } @@ -781,6 +784,7 @@ namespace AdvertsingProfitControl } //If the ad item entered in the first cell is in the gUsedAdItems collection, then remove it from there. _usedAdItems[1].Remove(dataGridView.Rows[currentRowIndex].Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue.ToString()); + FlagRowsAsDirty(dataGridView, currentRowIndex); } else if (currentRowIndex == _adSpecialIndex) { @@ -860,11 +864,31 @@ namespace AdvertsingProfitControl } e.Cancel = true; } - //Mark all rows under the row that just got deleted as dirty. + } + + private void FlagRowsAsDirty(DataGridView dataGridView, int currentRowIndex, int adSpecialIndex = -1) + { + //Check to see if the user started to add a row but then decided against it, does not mark the form dirty. if (dataGridView.Rows.Count != inventoryDataGridView.Rows.Count || dataGridView.Rows.Count != actualSalesDataGridView.Rows.Count) return; - for (var index = currentRowIndex; currentRowIndex < dataGridView.Rows.Count; index++) + //Mark all rows under the row that just got deleted as dirty. + _isFormDirty = true; + for (var index = currentRowIndex; index < dataGridView.Rows.Count; index++) { + //Do not color code the NewRow just break, we're done. + if (dataGridView.Rows[index].IsNewRow) break; + //Do not color code the Ad Special Row, just for preference. + if (index == adSpecialIndex) + { + //Clear it's row color coding just in-case the user clears more than one row. + projectionsDataGridView.Rows[index].Cells[(int)SalesTableColumns.IsDirty].Value = false; + projectionsDataGridView.Rows[index].HeaderCell.Style.BackColor = DefaultBackColor; + inventoryDataGridView.Rows[index].Cells[(int)InventoryTableColumns.IsDirty].Value = false; + inventoryDataGridView.Rows[index].HeaderCell.Style.BackColor = DefaultBackColor; + actualSalesDataGridView.Rows[index].Cells[(int)SalesTableColumns.IsDirty].Value = false; + actualSalesDataGridView.Rows[index].HeaderCell.Style.BackColor = DefaultBackColor; + continue; + } projectionsDataGridView.Rows[index].Cells[(int)SalesTableColumns.IsDirty].Value = true; projectionsDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; inventoryDataGridView.Rows[index].Cells[(int)InventoryTableColumns.IsDirty].Value = true; @@ -1016,9 +1040,80 @@ namespace AdvertsingProfitControl } else { - _adSpecialIndex = e.RowIndex; - //Since this is the ad special row don't give it any color coding. - dataGridView.Rows[e.RowIndex].HeaderCell.Style.BackColor = DefaultBackColor; + //Check to see if the ad special index has changed. + if (_adSpecialIndex == -1) + { + //Check to see if there is an ID in the row and warn the user about the row deletion. + if ( + dataGridView.Rows[e.RowIndex].Cells[(int) SalesTableColumns.Id].EditedFormattedValue + .ToString() != string.Empty) + { + var result = + MessageBox.Show( + @"Performing this operation will clear '" + _beginningCellValue + + @"' from the database. Do you wish to continue?", + @"Delete " + _beginningCellValue + @" Permanently", MessageBoxButtons.YesNo, + MessageBoxIcon.Information); + + if (result == DialogResult.Yes) + { + var dbT = new DatabaseTracker(); + var dbW = new DatabaseWriter(dbT.DatabaseConnectionString); + if (!dbW.DeleteApcRow( + int.Parse( + projectionsDataGridView.Rows[e.RowIndex].Cells[ + (int) SalesTableColumns.Id].EditedFormattedValue.ToString()), + int.Parse( + inventoryDataGridView.Rows[e.RowIndex].Cells[ + (int) InventoryTableColumns.Id].EditedFormattedValue.ToString()), + int.Parse( + actualSalesDataGridView.Rows[e.RowIndex].Cells[ + (int) SalesTableColumns.Id].EditedFormattedValue.ToString()))) + { + //Error out, it failed to be cleared. + MessageBox.Show( + @"Failed to delete '" + _beginningCellValue + + @"' from the database, cannot replace ad item with " + userInput + @"'.", + @"Failed to Delete Row", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.Cancel = true; + return; + } + } + else + { + e.Cancel = true; + return; + } + } + //Flag the rows under the changed row as dirty. + FlagRowsAsDirty(dataGridView, e.RowIndex + 1); + //_beginningCellValue has the ad item that was destroyed. + _usedAdItems[0].Remove(_beginningCellValue); + //Now update the UsedAdItemCollection + for (var i = e.RowIndex + 1; i < _usedAdItems[0].Count; i++) + { + //Wow this seems to work... well one shot baby! + _usedAdItems[1].Add(_usedAdItems[0][i]); + _usedAdItems[0].RemoveAt(e.RowIndex + 1); + } + //Mark row as Ad Special. + projectionsDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = + ApplicationColors.AdSpecial; + projectionsDataGridView.Rows[e.RowIndex].Cells[(int) SalesTableColumns.IsDirty].Value = + false; + inventoryDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = + ApplicationColors.AdSpecial; + inventoryDataGridView.Rows[e.RowIndex].Cells[(int) InventoryTableColumns.IsDirty].Value + = false; + actualSalesDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = + ApplicationColors.AdSpecial; + actualSalesDataGridView.Rows[e.RowIndex].Cells[(int) SalesTableColumns.IsDirty].Value = + false; + ClearRow(e.RowIndex); + _adSpecialIndex = e.RowIndex; + //Since this is the ad special row don't give it any color coding. + dataGridView.Rows[e.RowIndex].HeaderCell.Style.BackColor = DefaultBackColor; + } } //Force a refresh so the cell's text updates and displays for the user. dataGridView.RefreshEdit(); @@ -1463,9 +1558,64 @@ namespace AdvertsingProfitControl } else { - _adSpecialIndex = e.RowIndex; - //Since this is the ad special row don't give it any color coding. - dataGridView.Rows[e.RowIndex].HeaderCell.Style.BackColor = DefaultBackColor; + //Check to see if the ad special index has changed. + if (e.RowIndex != _adSpecialIndex && _adSpecialIndex == -1) + { + //Check to see if there is an ID in the row and warn the user about the row deletion. + if (dataGridView.Rows[e.RowIndex].Cells[(int)InventoryTableColumns.Id].EditedFormattedValue.ToString() != string.Empty) + { + var result = MessageBox.Show(@"Performing this operation will clear '" + _beginningCellValue + @"' from the database. Do you wish to continue?", @"Delete " + _beginningCellValue + @" Permanently", MessageBoxButtons.YesNo, MessageBoxIcon.Information); + + if (result == DialogResult.Yes) + { + var dbT = new DatabaseTracker(); + var dbW = new DatabaseWriter(dbT.DatabaseConnectionString); + if (!dbW.DeleteApcRow( + int.Parse( + projectionsDataGridView.Rows[e.RowIndex].Cells[ + (int)SalesTableColumns.Id].EditedFormattedValue.ToString()), + int.Parse( + inventoryDataGridView.Rows[e.RowIndex].Cells[ + (int)InventoryTableColumns.Id].EditedFormattedValue.ToString()), + int.Parse( + actualSalesDataGridView.Rows[e.RowIndex].Cells[ + (int)SalesTableColumns.Id].EditedFormattedValue.ToString()))) + { + //Error out, it failed to be cleared. + MessageBox.Show(@"Failed to delete '" + _beginningCellValue + @"' from the database, cannot replace ad item with " + userInput + @"'.", @"Failed to Delete Row", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.Cancel = true; + return; + } + } + else + { + e.Cancel = true; + return; + } + } + //Flag the rows under the changed row as dirty. + FlagRowsAsDirty(dataGridView, e.RowIndex + 1); + //_beginningCellValue has the ad item that was destroyed. + _usedAdItems[0].Remove(_beginningCellValue); + //Now update the UsedAdItemCollection + for (var i = e.RowIndex + 1; i < _usedAdItems[0].Count; i++) + { + //Wow this seems to work... well one shot baby! + _usedAdItems[1].Add(_usedAdItems[0][i]); + _usedAdItems[0].RemoveAt(e.RowIndex + 1); + } + //Mark row as Ad Special. + projectionsDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = ApplicationColors.AdSpecial; + projectionsDataGridView.Rows[e.RowIndex].Cells[(int)SalesTableColumns.IsDirty].Value = false; + inventoryDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = ApplicationColors.AdSpecial; + inventoryDataGridView.Rows[e.RowIndex].Cells[(int)InventoryTableColumns.IsDirty].Value = false; + actualSalesDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = ApplicationColors.AdSpecial; + actualSalesDataGridView.Rows[e.RowIndex].Cells[(int)SalesTableColumns.IsDirty].Value = false; + ClearRow(e.RowIndex); + _adSpecialIndex = e.RowIndex; + //Since this is the ad special row don't give it any color coding. + dataGridView.Rows[e.RowIndex].HeaderCell.Style.BackColor = DefaultBackColor; + } } //Force a refresh so the cell's text updates and displays for the user. dataGridView.RefreshEdit(); @@ -4279,5 +4429,37 @@ namespace AdvertsingProfitControl actualSalesDataGridView.RowValidating += ValidateActualSalesRow; //END ENABLE EVENTS } + + private void ClearRow(int rowIndex) + { + foreach (DataGridViewCell cell in projectionsDataGridView.Rows[rowIndex].Cells) + { + if (cell.ColumnIndex == (int) SalesTableColumns.AdItem) continue; + var actualSalesCell = actualSalesDataGridView.Rows[rowIndex].Cells[cell.ColumnIndex]; + if (cell.ColumnIndex < (int) SalesTableColumns.IsHeaderRow) + { + cell.Value = string.Empty; + actualSalesCell.Value = string.Empty; + } + else + { + cell.Value = false; + actualSalesCell.Value = false; + } + } + + foreach (DataGridViewCell cell in inventoryDataGridView.Rows[rowIndex].Cells) + { + if (cell.ColumnIndex == (int)InventoryTableColumns.AdItem) continue; + if (cell.ColumnIndex < (int)InventoryTableColumns.IsHeaderRow) + { + cell.Value = string.Empty; + } + else + { + cell.Value = false; + } + } + } } } diff --git a/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.application b/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.application index a534414..50ad4ff 100644 --- a/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.application +++ b/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.application @@ -14,7 +14,7 @@ - qslhA++lVLBctd11zuiyGxsc1HQGD2NdhJMAlbYkvSA= + ffANB5BH9jvoyfR09JBLV4mTjMowgtoLxga6w/HpWLU= diff --git a/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.exe.manifest b/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.exe.manifest index f1e259e..328ede4 100644 --- a/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.exe.manifest +++ b/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.exe.manifest @@ -43,14 +43,14 @@ - + - hvMMYVQ3UshVHNWRVBHGms+WBonEb7cFKwhPKPfr7zw= + X7+5y23vASKIWqD7axQzZHiWBiU+8VPagqUiqgXGMTw=