Added a check for if the user changes an ad item to an ad special item. Fixed a bug that caused a crash when deleting a row in the APC tables (finally!).

This commit is contained in:
2017-02-12 00:52:04 -06:00
parent 13f0e5df35
commit 5bd80f0dce
3 changed files with 194 additions and 12 deletions
+184 -2
View File
@@ -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. //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()); _usedAdItems[0].Remove(dataGridView.Rows[currentRowIndex].Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue.ToString());
FlagRowsAsDirty(dataGridView, currentRowIndex);
} }
else if (currentRowIndex < _adSpecialIndex) 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. //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()); _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. //Also decrement the _adSpecialIndex so that it points to the correct row.
_adSpecialIndex--; _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. //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()); _usedAdItems[1].Remove(dataGridView.Rows[currentRowIndex].Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue.ToString());
FlagRowsAsDirty(dataGridView, currentRowIndex);
} }
else if (currentRowIndex == _adSpecialIndex) else if (currentRowIndex == _adSpecialIndex)
{ {
@@ -860,11 +864,31 @@ namespace AdvertsingProfitControl
} }
e.Cancel = true; 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 || if (dataGridView.Rows.Count != inventoryDataGridView.Rows.Count ||
dataGridView.Rows.Count != actualSalesDataGridView.Rows.Count) return; 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].Cells[(int)SalesTableColumns.IsDirty].Value = true;
projectionsDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; projectionsDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit;
inventoryDataGridView.Rows[index].Cells[(int)InventoryTableColumns.IsDirty].Value = true; inventoryDataGridView.Rows[index].Cells[(int)InventoryTableColumns.IsDirty].Value = true;
@@ -1016,10 +1040,81 @@ namespace AdvertsingProfitControl
} }
else else
{ {
//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; _adSpecialIndex = e.RowIndex;
//Since this is the ad special row don't give it any color coding. //Since this is the ad special row don't give it any color coding.
dataGridView.Rows[e.RowIndex].HeaderCell.Style.BackColor = DefaultBackColor; dataGridView.Rows[e.RowIndex].HeaderCell.Style.BackColor = DefaultBackColor;
} }
}
//Force a refresh so the cell's text updates and displays for the user. //Force a refresh so the cell's text updates and displays for the user.
dataGridView.RefreshEdit(); dataGridView.RefreshEdit();
return; return;
@@ -1463,10 +1558,65 @@ namespace AdvertsingProfitControl
} }
else else
{ {
//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; _adSpecialIndex = e.RowIndex;
//Since this is the ad special row don't give it any color coding. //Since this is the ad special row don't give it any color coding.
dataGridView.Rows[e.RowIndex].HeaderCell.Style.BackColor = DefaultBackColor; dataGridView.Rows[e.RowIndex].HeaderCell.Style.BackColor = DefaultBackColor;
} }
}
//Force a refresh so the cell's text updates and displays for the user. //Force a refresh so the cell's text updates and displays for the user.
dataGridView.RefreshEdit(); dataGridView.RefreshEdit();
return; return;
@@ -4279,5 +4429,37 @@ namespace AdvertsingProfitControl
actualSalesDataGridView.RowValidating += ValidateActualSalesRow; actualSalesDataGridView.RowValidating += ValidateActualSalesRow;
//END ENABLE EVENTS //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;
}
}
}
} }
} }
@@ -14,7 +14,7 @@
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms> </dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>qslhA++lVLBctd11zuiyGxsc1HQGD2NdhJMAlbYkvSA=</dsig:DigestValue> <dsig:DigestValue>ffANB5BH9jvoyfR09JBLV4mTjMowgtoLxga6w/HpWLU=</dsig:DigestValue>
</hash> </hash>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
@@ -43,14 +43,14 @@
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
<dependency> <dependency>
<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AdvertsingProfitControl.exe" size="3652096"> <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AdvertsingProfitControl.exe" size="3655168">
<assemblyIdentity name="AdvertsingProfitControl" version="1.9.2.0" language="neutral" processorArchitecture="amd64" /> <assemblyIdentity name="AdvertsingProfitControl" version="1.9.2.0" language="neutral" processorArchitecture="amd64" />
<hash> <hash>
<dsig:Transforms> <dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms> </dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>hvMMYVQ3UshVHNWRVBHGms+WBonEb7cFKwhPKPfr7zw=</dsig:DigestValue> <dsig:DigestValue>X7+5y23vASKIWqD7axQzZHiWBiU+8VPagqUiqgXGMTw=</dsig:DigestValue>
</hash> </hash>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>