Fixed a bug preventing the user from moving a member of the ad special group on to the ad special row. Prevented the ad special row from being moved by drag and drop.

This commit is contained in:
2017-12-11 19:55:46 -06:00
parent 13af4ff791
commit 6ec32afc92
+111 -127
View File
@@ -1309,10 +1309,10 @@ namespace AdvertsingProfitControl
projectionsDataGridView.UserDeletingRow += UpdateUsedAdItemCollectionOnRowRemoving;
projectionsDataGridView.RowsRemoved += ProjectionRowRemoved;
projectionsDataGridView.EditingControlShowing += DisplayAutoCompleteOnEditingControlShowing;
//projectionsDataGridView.MouseMove += dataGridView1_MouseMove;
//projectionsDataGridView.MouseDown += dataGridView1_MouseDown;
//projectionsDataGridView.DragOver += dataGridView1_DragOver;
//projectionsDataGridView.DragDrop += dataGridView1_DragDrop;
projectionsDataGridView.MouseMove += DataGridViewMouseMove;
projectionsDataGridView.MouseDown += DataGridViewMouseDown;
projectionsDataGridView.DragOver += DataGridViewDragOver;
projectionsDataGridView.DragDrop += DataGridViewDragDrop;
}
else
{
@@ -1325,10 +1325,10 @@ namespace AdvertsingProfitControl
projectionsDataGridView.UserDeletingRow -= UpdateUsedAdItemCollectionOnRowRemoving;
projectionsDataGridView.RowsRemoved -= ProjectionRowRemoved;
projectionsDataGridView.EditingControlShowing -= DisplayAutoCompleteOnEditingControlShowing;
//projectionsDataGridView.MouseMove -= dataGridView1_MouseMove;
//projectionsDataGridView.MouseDown -= dataGridView1_MouseDown;
//projectionsDataGridView.DragOver -= dataGridView1_DragOver;
//projectionsDataGridView.DragDrop -= dataGridView1_DragDrop;
projectionsDataGridView.MouseMove -= DataGridViewMouseMove;
projectionsDataGridView.MouseDown -= DataGridViewMouseDown;
projectionsDataGridView.DragOver -= DataGridViewDragOver;
projectionsDataGridView.DragDrop -= DataGridViewDragDrop;
}
}
@@ -1810,6 +1810,10 @@ out double beginningBinCount, out string _))
inventoryDataGridView.UserDeletingRow += UpdateUsedAdItemCollectionOnRowRemoving;
inventoryDataGridView.RowsRemoved += InventoryRowRemoved;
inventoryDataGridView.EditingControlShowing += DisplayAutoCompleteOnEditingControlShowing;
inventoryDataGridView.MouseMove += DataGridViewMouseMove;
inventoryDataGridView.MouseDown += DataGridViewMouseDown;
inventoryDataGridView.DragOver += DataGridViewDragOver;
inventoryDataGridView.DragDrop += DataGridViewDragDrop;
}
else
{
@@ -1822,6 +1826,10 @@ out double beginningBinCount, out string _))
inventoryDataGridView.UserDeletingRow -= UpdateUsedAdItemCollectionOnRowRemoving;
inventoryDataGridView.RowsRemoved -= InventoryRowRemoved;
inventoryDataGridView.EditingControlShowing -= DisplayAutoCompleteOnEditingControlShowing;
inventoryDataGridView.MouseMove -= DataGridViewMouseMove;
inventoryDataGridView.MouseDown -= DataGridViewMouseDown;
inventoryDataGridView.DragOver -= DataGridViewDragOver;
inventoryDataGridView.DragDrop -= DataGridViewDragDrop;
}
}
@@ -2041,6 +2049,10 @@ out double beginningBinCount, out string _))
actualSalesDataGridView.UserDeletingRow += UpdateUsedAdItemCollectionOnRowRemoving;
actualSalesDataGridView.RowsRemoved += ActualSalesRowRemoved;
actualSalesDataGridView.EditingControlShowing += DisplayAutoCompleteOnEditingControlShowing;
actualSalesDataGridView.MouseMove += DataGridViewMouseMove;
actualSalesDataGridView.MouseDown += DataGridViewMouseDown;
actualSalesDataGridView.DragOver += DataGridViewDragOver;
actualSalesDataGridView.DragDrop += DataGridViewDragDrop;
}
else
{
@@ -2053,6 +2065,10 @@ out double beginningBinCount, out string _))
actualSalesDataGridView.UserDeletingRow -= UpdateUsedAdItemCollectionOnRowRemoving;
actualSalesDataGridView.RowsRemoved -= ActualSalesRowRemoved;
actualSalesDataGridView.EditingControlShowing -= DisplayAutoCompleteOnEditingControlShowing;
actualSalesDataGridView.MouseMove -= DataGridViewMouseMove;
actualSalesDataGridView.MouseDown -= DataGridViewMouseDown;
actualSalesDataGridView.DragOver -= DataGridViewDragOver;
actualSalesDataGridView.DragDrop -= DataGridViewDragDrop;
}
}
@@ -3068,6 +3084,14 @@ out double beginningBinCount, out string _))
projectionsDataGridView.Rows[index].Cells[1].Value = adSpecial.Name;
index++;
}
if (_adSpecialIndex == -1)
{
_usedAdItems[0].Add(projection.AdItem.Name);
}
else
{
_usedAdItems[1].Add(projection.AdItem.Name);
}
projectionsDataGridView.Rows.Add();
projectionsDataGridView.Rows[index].Cells[0].Value = projection.Id;
projectionsDataGridView.Rows[index].Cells[1].Value = projection.AdItem.Name;
@@ -4548,7 +4572,7 @@ out double beginningBinCount, out string _))
//Drag and drop functionality shamelessly ripped from StackOverflow.
//Reordering rows: http://stackoverflow.com/questions/1620947/how-could-i-drag-and-drop-datagridview-rows-under-each-other/1623968#1623968
private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
private void DataGridViewMouseMove(object sender, MouseEventArgs e)
{
var dataGridView = (DataGridView) sender;
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
@@ -4565,7 +4589,7 @@ out double beginningBinCount, out string _))
}
}
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
private void DataGridViewMouseDown(object sender, MouseEventArgs e)
{
var dataGridView = (DataGridView)sender;
// Get the index of the item the mouse is below.
@@ -4588,12 +4612,12 @@ out double beginningBinCount, out string _))
_dragBoxFromMouseDown = Rectangle.Empty;
}
private void dataGridView1_DragOver(object sender, DragEventArgs e)
private void DataGridViewDragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void dataGridView1_DragDrop(object sender, DragEventArgs e)
private void DataGridViewDragDrop(object sender, DragEventArgs e)
{
//Check if the item being dropped is actually a row object.
if (sender.GetType() != typeof(DataGridView)) return;
@@ -4622,142 +4646,102 @@ out double beginningBinCount, out string _))
{
_rowIndexOfItemUnderMouseToDrop--;
}
//Basic verification completed, now un-subscribe from the row add events.
projectionsDataGridView.RowsAdded -= DisplayRowNumbers;
inventoryDataGridView.RowsAdded -= DisplayRowNumbers;
actualSalesDataGridView.RowsAdded -= DisplayRowNumbers;
//And disable the row removed event, can't risk anything here.
projectionsDataGridView.RowsRemoved -= ProjectionRowRemoved;
inventoryDataGridView.RowsRemoved -= InventoryRowRemoved;
actualSalesDataGridView.RowsRemoved -= ActualSalesRowRemoved;
//Now check to see if the row is a header, member or ad special row.
//dataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
//dataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, rowToMove);
DragNonAttributedRow();
//For now prevent the ad special row from being moved.
if (rowToMove.Index == _adSpecialIndex)
{
return;
}
ToggleProjectionTableEvents(false);
ToggleInventoryEvents(false);
ToggleActualSalesEvents(false);
MoveDraggedRow();
ToggleProjectionTableEvents();
ToggleInventoryEvents();
ToggleActualSalesEvents();
}
private void DragNonAttributedRow()
private void MoveDraggedRow()
{
//Target Rows
var projectionsTargetRow = projectionsDataGridView.Rows[_rowIndexOfItemUnderMouseToDrop];
var inventoryTargetRow = inventoryDataGridView.Rows[_rowIndexOfItemUnderMouseToDrop];
var actualSalesTargetRow = actualSalesDataGridView.Rows[_rowIndexOfItemUnderMouseToDrop];
//Rows to be moved
var projectionRowToMove = projectionsDataGridView.Rows[_rowIndexFromMouseDown];
var inventoryRowToMove = inventoryDataGridView.Rows[_rowIndexFromMouseDown];
var actualSalesRowToMove = actualSalesDataGridView.Rows[_rowIndexFromMouseDown];
//Assume that the row to move is a regular row with now attributes.
//Begin by checking the attributes of the target row. (R -> R || A)
//Note: this if case will capture the ad special row as well.
//Check to see where the row is being dropped. This only needs to be considered
//if one row is greater then or less then the ad special index (assuming its set)
//and the target row is the opposite of the row being moved.
if (_adSpecialIndex != -1)
//The ad item being moved
var adItem = projectionsDataGridView.Rows[_rowIndexFromMouseDown].Cells[(int)TableGroupParser.SalesTableColumns.AdItem].EditedFormattedValue;
//Get the smallest and biggest row numbers.
var min = _rowIndexFromMouseDown > _rowIndexOfItemUnderMouseToDrop
? _rowIndexOfItemUnderMouseToDrop
: _rowIndexFromMouseDown;
var max = _rowIndexFromMouseDown > _rowIndexOfItemUnderMouseToDrop
? _rowIndexFromMouseDown
: _rowIndexOfItemUnderMouseToDrop;
//
if(_rowIndexFromMouseDown < _adSpecialIndex && _rowIndexOfItemUnderMouseToDrop > _adSpecialIndex)
{
//Make sure that the ad special group doesn't already contain the ad item that is about be dragged into it.
if (_usedAdItems[1].Contains(adItem))
{
if (_rowIndexFromMouseDown < _adSpecialIndex && _rowIndexOfItemUnderMouseToDrop > _adSpecialIndex)
{
//Moving the row to move into the Ad Special group.
_adSpecialIndex--;
_usedAdItems[0].Remove(
projectionRowToMove.Cells[(int) TableGroupParser.SalesTableColumns.AdItem]
.EditedFormattedValue.ToString());
_usedAdItems[1].Add(
projectionRowToMove.Cells[(int)TableGroupParser.SalesTableColumns.AdItem]
.EditedFormattedValue.ToString());
}
else if (_rowIndexFromMouseDown > _adSpecialIndex && _rowIndexOfItemUnderMouseToDrop < _adSpecialIndex)
{
//Moving the row to move OUT of the Ad Special group.
_adSpecialIndex++;
_usedAdItems[1].Remove(
projectionRowToMove.Cells[(int)TableGroupParser.SalesTableColumns.AdItem]
.EditedFormattedValue.ToString());
_usedAdItems[0].Add(
projectionRowToMove.Cells[(int)TableGroupParser.SalesTableColumns.AdItem]
.EditedFormattedValue.ToString());
}
else if (_rowIndexOfItemUnderMouseToDrop == _adSpecialIndex)
{
//Move the ad special row up by one row if the user tries dropping a row on it.
_adSpecialIndex--;
_usedAdItems[0].Remove(
projectionRowToMove.Cells[(int)TableGroupParser.SalesTableColumns.AdItem]
.EditedFormattedValue.ToString());
_usedAdItems[1].Add(
projectionRowToMove.Cells[(int)TableGroupParser.SalesTableColumns.AdItem]
.EditedFormattedValue.ToString());
}
MessageBox.Show(@"The ad special group already contains the ad item " + adItem + @".", @"Duplicate Ad Items Not Allowed", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//This row is simply a regular row, so simply drop the row to move into place.
projectionsDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
projectionsDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, projectionRowToMove);
inventoryDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
inventoryDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, inventoryRowToMove);
actualSalesDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
actualSalesDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, actualSalesRowToMove);
}
private void DragRow()
{
//var targetRow = dataGridView.Rows[_rowIndexOfItemUnderMouseToDrop];
//var targetIndex = targetRow.Index; //We need this as one the target row gets moved in the datagridview its index will change.
var projectionRowToMove = projectionsDataGridView.Rows[_rowIndexFromMouseDown];
var inventoryRowToMove = inventoryDataGridView.Rows[_rowIndexFromMouseDown];
var actualSalesRowToMove = actualSalesDataGridView.Rows[_rowIndexFromMouseDown];
//Assume that the row to move is a regular row with now attributes.
//Begin by checking the attributes of the target row. (R -> R || A)
//Note: this if case will capture the ad special row as well.
//If the target row is a header row, check to see where the row is being dropped. This only needs to be considered
//if one row is greater then or less then the ad special index (assuming its set)
//and the target row is the opposite of the row being moved.
if (_adSpecialIndex != -1)
//Move the ad item out of the regular group and into the ad special group.
_usedAdItems[0].Remove(adItem.ToString());
_usedAdItems[1].Add(adItem.ToString());
//Moving the row to move into the Ad Special group.
_adSpecialIndex--;
}
else if (_rowIndexFromMouseDown > _adSpecialIndex && _rowIndexOfItemUnderMouseToDrop < _adSpecialIndex)
{
//Make sure that section 1 doesn't already contain the ad item that is about be dragged into it.
if (_usedAdItems[0].Contains(adItem))
{
if (_rowIndexFromMouseDown < _adSpecialIndex && _rowIndexOfItemUnderMouseToDrop > _adSpecialIndex)
{
//Moving the row to move into the Ad Special group.
_adSpecialIndex--;
}
else if (_rowIndexFromMouseDown > _adSpecialIndex && _rowIndexOfItemUnderMouseToDrop < _adSpecialIndex)
{
//Moving the row to move OUT of the Ad Special group.
_adSpecialIndex++;
}
else if (_rowIndexOfItemUnderMouseToDrop == _adSpecialIndex)
{
//Move the ad special row up by one row if the user tries dropping a row on it.
_adSpecialIndex--;
}
MessageBox.Show(@"The group outside of the ad special group already contains the ad item " + adItem + @".", @"Duplicate Ad Items Not Allowed", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//This particular situation is similar to the non attributed row being dropped on a like row.
//Except that the target row has to have its "Header Row" attribute cleared, and color cleared.
//Then the row to move needs to be given that attribute.
////TODO: may not be necessary
//projectionsDataGridView.Rows[targetRow.Index].DefaultCellStyle.BackColor = default(Color);
//inventoryDataGridView.Rows[targetRow.Index].DefaultCellStyle.BackColor = default(Color);
//actualSalesDataGridView.Rows[targetRow.Index].DefaultCellStyle.BackColor = default(Color);
//Now move the rows around.
projectionsDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
projectionsDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, projectionRowToMove);
inventoryDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
inventoryDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, inventoryRowToMove);
actualSalesDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
actualSalesDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, actualSalesRowToMove);
//And mark the affected rows as dirty so their positions will be updated on save.
// MarkRowRangeForEditing(_rowIndexFromMouseDown, targetIndex);
//Move the ad item out of the ad special group and into the regular group.
_usedAdItems[1].Remove(adItem.ToString());
_usedAdItems[0].Add(adItem.ToString());
//Moving the row to move OUT of the Ad Special group.
_adSpecialIndex++;
}
else if (_rowIndexOfItemUnderMouseToDrop == _adSpecialIndex)
{
//Check to see if the row from the mouse down is already in the add special group.
if (!_usedAdItems[1].Contains(adItem) && _rowIndexFromMouseDown < _adSpecialIndex)
{
//Move the ad item out of the regular and into the ad special group.
_usedAdItems[0].Remove(adItem.ToString());
_usedAdItems[1].Add(adItem.ToString());
//Move the ad special row up by one row if the user tries dropping a row on it.
_adSpecialIndex--;
}
//Make sure that the ad special group doesn't already contain the ad item that is about be dragged into it.
else if (_usedAdItems[1].Contains(adItem))
{
MessageBox.Show(@"The ad special group already contains the ad item " + adItem + @".", @"Duplicate Ad Items Not Allowed", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
projectionsDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
projectionsDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, projectionRowToMove);
inventoryDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
inventoryDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, inventoryRowToMove);
actualSalesDataGridView.Rows.RemoveAt(_rowIndexFromMouseDown);
actualSalesDataGridView.Rows.Insert(_rowIndexOfItemUnderMouseToDrop, actualSalesRowToMove);
MarkRowRangeForEditing(min, max);
}
private void MarkRowRangeForEditing(int startingIndex, int endingIndex)
{
var parser = new RowParser();
//Mark the changed rows as dirty.
for (var i = startingIndex; i <= endingIndex; i++)
{
projectionsDataGridView.Rows[i].HeaderCell.Value = (i + 1).ToString();
inventoryDataGridView.Rows[i].HeaderCell.Value = (i + 1).ToString();
actualSalesDataGridView.Rows[i].HeaderCell.Value = (i + 1).ToString();
if (parser.GetRowAttribute(projectionsDataGridView.Rows[i]) == RowParser.RowAttribute.AdSpecialRow || projectionsDataGridView.Rows[i].IsNewRow)
if (i == _adSpecialIndex || projectionsDataGridView.Rows[i].IsNewRow)
{
continue;
}