Moved group table and row parsing into a separate DLL to clean up the main binary a bit. Added custom engine to detect for bin counts and updated the record form to total the bins for the user automatically. Updated the .gitignore file to include the necessary DLLs for the projects.
This commit is contained in:
@@ -0,0 +1,348 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DataTableParsingEngine
|
||||
{
|
||||
public class TableGroupParser
|
||||
{
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
/// <param name="startingIndex">The starting index (the row that fired the RowLeave event)</param>
|
||||
/// <param name="dataGridView">The DataGridView to parse.</param>
|
||||
public static void PaintRowGroupsFromIndex(int startingIndex, DataGridView dataGridView)
|
||||
{
|
||||
//Underflow protection for the lazy.
|
||||
if (startingIndex < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var parser = new RowParser();
|
||||
int isHeaderColumn;
|
||||
int isMemberColumn;
|
||||
int isDirtyColumn;
|
||||
if (dataGridView.Columns.Count == Enum.GetNames(typeof(SalesTableColumns)).Length)
|
||||
{
|
||||
isHeaderColumn = (int)SalesTableColumns.IsHeaderRow;
|
||||
isMemberColumn = (int)SalesTableColumns.IsMemberRow;
|
||||
isDirtyColumn = (int)SalesTableColumns.IsDirty;
|
||||
}
|
||||
else
|
||||
{
|
||||
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)
|
||||
{
|
||||
//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)
|
||||
{
|
||||
//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.
|
||||
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.
|
||||
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 companionDataGridView = null)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user