diff --git a/.gitignore b/.gitignore index 23053de..5779e47 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,10 @@ +!*.dll packages/ +AdvertisingProfitControlData/bin +AdvertisingProfitControlData/obj +AdvertsingProfitControl/bin +AdvertsingProfitControl/obj +DataTableParsingEngine/bin +DataTableParsingEngine/obj +SetupProject/bin +SetupProject/obj \ No newline at end of file diff --git a/AdvertsingProfitControl.sln b/AdvertsingProfitControl.sln index 58e82ca..a14930d 100644 --- a/AdvertsingProfitControl.sln +++ b/AdvertsingProfitControl.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26228.4 +VisualStudioVersion = 15.0.26403.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvertsingProfitControl", "AdvertsingProfitControl\AdvertsingProfitControl.csproj", "{4A45C665-5D02-4724-9CC5-C0C50CA44760}" EndProject @@ -9,6 +9,8 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "SetupProject", "SetupProjec EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvertisingProfitControlData", "AdvertisingProfitControlData\AdvertisingProfitControlData.csproj", "{E30F8B0E-DFF3-4AB7-8D0C-47BD11164E51}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataTableParsingEngine", "DataTableParsingEngine\DataTableParsingEngine.csproj", "{63CE4D0A-1F70-4692-B895-073A9B3AF5F2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -39,6 +41,14 @@ Global {E30F8B0E-DFF3-4AB7-8D0C-47BD11164E51}.Release|Any CPU.Build.0 = Release|Any CPU {E30F8B0E-DFF3-4AB7-8D0C-47BD11164E51}.Release|x86.ActiveCfg = Release|Any CPU {E30F8B0E-DFF3-4AB7-8D0C-47BD11164E51}.Release|x86.Build.0 = Release|Any CPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2}.Debug|x86.ActiveCfg = Debug|Any CPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2}.Debug|x86.Build.0 = Debug|Any CPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2}.Release|Any CPU.Build.0 = Release|Any CPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2}.Release|x86.ActiveCfg = Release|Any CPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AdvertsingProfitControl/AdvertsingProfitControl.csproj b/AdvertsingProfitControl/AdvertsingProfitControl.csproj index c3cb457..779bfde 100644 --- a/AdvertsingProfitControl/AdvertsingProfitControl.csproj +++ b/AdvertsingProfitControl/AdvertsingProfitControl.csproj @@ -125,8 +125,6 @@ AboutBox.cs - - Form @@ -210,7 +208,6 @@ FrmLogConsole.cs - @@ -316,6 +313,10 @@ {e30f8b0e-dff3-4ab7-8d0c-47bd11164e51} AdvertisingProfitControlData + + {63ce4d0a-1f70-4692-b895-073a9b3af5f2} + DataTableParsingEngine + +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/DataTableParsingEngine/DataTableParsingEngine.csproj b/DataTableParsingEngine/DataTableParsingEngine.csproj new file mode 100644 index 0000000..e8040b4 --- /dev/null +++ b/DataTableParsingEngine/DataTableParsingEngine.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {63CE4D0A-1F70-4692-B895-073A9B3AF5F2} + Library + Properties + DataTableParsingEngine + DataTableParsingEngine + v4.5 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll + + + ..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll + + + + + + + + + + + + + + + + + + + + + + {e30f8b0e-dff3-4ab7-8d0c-47bd11164e51} + AdvertisingProfitControlData + + + + + + + + \ No newline at end of file diff --git a/DataTableParsingEngine/Properties/AssemblyInfo.cs b/DataTableParsingEngine/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9e64455 --- /dev/null +++ b/DataTableParsingEngine/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DataTableParsingEngine")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DataTableParsingEngine")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("63ce4d0a-1f70-4692-b895-073a9b3af5f2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AdvertsingProfitControl/RowParsing.cs b/DataTableParsingEngine/RowParser.cs similarity index 64% rename from AdvertsingProfitControl/RowParsing.cs rename to DataTableParsingEngine/RowParser.cs index ec32762..bdb3428 100644 --- a/AdvertsingProfitControl/RowParsing.cs +++ b/DataTableParsingEngine/RowParser.cs @@ -1,18 +1,31 @@ using System; using System.Collections.Generic; -using System.Text.RegularExpressions; -using System.Windows.Forms; using System.Linq; +using System.Windows.Forms; +using AdvertisingProfitControlData; -namespace AdvertsingProfitControl +namespace DataTableParsingEngine { - internal class RowParsing + public class RowParser { - public static List AdSpecialGroups = new List(); - - public string CheckForGroupKeyWord(string cellContents) + /// + /// Clears and rebuilds the ad special list that is held in memory. + /// This is important as this prevents this engine from grabbing the + /// list from the database every time this class is called. Otherwise, + /// there would be noticeable lag getting the list from the SQL server. + /// + public static void BuildAdSpecialListings() { - var keyWord = "NoGroupFound"; + AdSpecialGroups.Clear(); + var db = new AdvertisingProfitControlDbContext(); + AdSpecialGroups.AddRange(db.AdSpecials.Select(x => x.Name)); + } + + private static readonly List AdSpecialGroups = new List(); + + private static string CheckForGroupKeyWord(string cellContents) + { + var keyWord = string.Empty; var query = from adI in AdSpecialGroups where adI.Equals(cellContents, StringComparison.InvariantCultureIgnoreCase) @@ -45,14 +58,14 @@ namespace AdvertsingProfitControl return RowAttribute.NewRow; } //Determine the range to use during the looping process. - var headerCellIndex = row.Cells.Count == Enum.GetNames(typeof(SalesTableColumns)).Length ? (int)SalesTableColumns.IsHeaderRow : (int)InventoryTableColumns.IsHeaderRow; + var headerCellIndex = row.Cells.Count == Enum.GetNames(typeof(TableGroupParser.SalesTableColumns)).Length ? (int)TableGroupParser.SalesTableColumns.IsHeaderRow : (int)TableGroupParser.InventoryTableColumns.IsHeaderRow; var rowContents = new List(); var rowAttribute = RowAttribute.MemberRow; //Get the contents of the row that's being examined and add then to a List array. var i = 0; foreach (DataGridViewCell cell in row.Cells) { - if (cell.ColumnIndex >= headerCellIndex || cell.ColumnIndex == 0) { i++; continue;} + if (cell.ColumnIndex >= headerCellIndex || cell.ColumnIndex == 0) { i++; continue; } //Strip all whitespace characters from the cell, this includes vertical tabs, newlines, and any number of spaces. var cellContentsStripped = new string(cell.EditedFormattedValue.ToString().Where(c => !char.IsWhiteSpace(c)).ToArray()); //Now remove all zeros, including any decimal points as these values are meaningless. @@ -63,7 +76,7 @@ namespace AdvertsingProfitControl rowContents.Add(cell.EditedFormattedValue.ToString()); } //If the first cell contains nothing, then return as IncompleteRow. - else if (cellContentsStripped == "" && i == (int) SalesTableColumns.AdItem) + else if (cellContentsStripped == "" && i == (int)TableGroupParser.SalesTableColumns.AdItem) { return RowAttribute.IncompleteRow; } @@ -80,7 +93,7 @@ namespace AdvertsingProfitControl { var keyWord = CheckForGroupKeyWord(rowContents[0]); //IF a keyword is found then declare this row an AdSpecialRow. - if (keyWord != "NoGroupFound") + if (keyWord != string.Empty) { return RowAttribute.AdSpecialRow; } @@ -89,51 +102,14 @@ namespace AdvertsingProfitControl return rowAttribute; } - public RowAttribute GetRowAttribute(object[] row) + public enum RowAttribute { - var rowAttribute = RowAttribute.MemberRow; - - - - return rowAttribute; + NewRow = 0, + IncompleteRow = 1, + AdSpecialRow = 2, + RepeatedRow = 3, + MemberRow = 4, + HeaderRow = 5 } - - public void PaintDataGridViewRowGroups(DataGridView dataGridView, DataGridView companionDataGridView = null, int startIndex = 0, - bool stopOnFirstFullGroupFound = false) - { - - - } - - /// - /// Checks for the presents of a repeat command using the Reg-ex engine. - /// If a repeat command is found it returns the line number the command - /// specifies to repeat. - /// - /// The contents of Cell[0] in the row being parsed. - /// Line number to be repeated, -1 if no command is found. - public int CheckForRepeatCommand(string rowCommandField) - { - const string repeatCommandPattern = @"^repeat( line)?:? [0-9]"; //Reference sheet: https://msdn.microsoft.com/en-us/library/az24scfc.aspx - var rgx = new Regex(repeatCommandPattern, RegexOptions.IgnoreCase); - var lineNumber = -1; - - if (!rgx.IsMatch(rowCommandField)) return lineNumber; - //Parse the string and retrieve the line number - var numbers = Regex.Split(rowCommandField, @"\D+"); - - lineNumber = int.Parse(numbers[1]); - return lineNumber; - } - } - - public enum RowAttribute - { - NewRow = 0, - IncompleteRow = 1, - AdSpecialRow = 2, - RepeatedRow = 3, - MemberRow = 4, - HeaderRow = 5 } } diff --git a/AdvertsingProfitControl/ApplicationColors.cs b/DataTableParsingEngine/TableColors.cs similarity index 64% rename from AdvertsingProfitControl/ApplicationColors.cs rename to DataTableParsingEngine/TableColors.cs index ddf64d5..5711bdd 100644 --- a/AdvertsingProfitControl/ApplicationColors.cs +++ b/DataTableParsingEngine/TableColors.cs @@ -1,11 +1,8 @@ using System.Drawing; -namespace AdvertsingProfitControl +namespace DataTableParsingEngine { - /// - /// Defines the colors to be used for the rows on the DataGridViews based on their state. - /// - public static class ApplicationColors + public class TableColors { public static Color EditingSaved = Color.ForestGreen; public static Color PendingEdit = Color.Yellow; diff --git a/AdvertsingProfitControl/AdvertisingProfitControlTableHelper.cs b/DataTableParsingEngine/TableGroupParser.cs similarity index 62% rename from AdvertsingProfitControl/AdvertisingProfitControlTableHelper.cs rename to DataTableParsingEngine/TableGroupParser.cs index 1967bd3..2815f17 100644 --- a/AdvertsingProfitControl/AdvertisingProfitControlTableHelper.cs +++ b/DataTableParsingEngine/TableGroupParser.cs @@ -2,9 +2,9 @@ using System.Drawing; using System.Windows.Forms; -namespace AdvertsingProfitControl +namespace DataTableParsingEngine { - internal class AdvertisingProfitControlTableHelper + public class TableGroupParser { /// /// Paints rows according to their RowAttribute and detects whether or not they are part of a group. @@ -14,28 +14,28 @@ namespace AdvertsingProfitControl /// /// The starting index (the row that fired the RowLeave event) /// The DataGridView to parse. - public void PaintRowGroupsFromIndex(int startingIndex, DataGridView dataGridView) + public static void PaintRowGroupsFromIndex(int startingIndex, DataGridView dataGridView) { //Underflow protection for the lazy. if (startingIndex < 0) { return; } - var parser = new RowParsing(); + 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; + 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; + 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++) @@ -43,17 +43,17 @@ namespace AdvertsingProfitControl //Get the status of the current row. var rowStatus = parser.GetRowAttribute(dataGridView.Rows[i]); //IF the current row is a header row... - if (rowStatus == RowAttribute.HeaderRow) + 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 == RowAttribute.HeaderRow) + 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 = Color.White; + dataGridView.Rows[i].DefaultCellStyle.BackColor = default(Color); return; } //IF the current row is not the first row in the data grid (index zero)... @@ -62,190 +62,190 @@ namespace AdvertsingProfitControl //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 == RowAttribute.HeaderRow && (bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue) + 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 = ApplicationColors.PendingEdit; - dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = Color.White; + 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 != RowAttribute.MemberRow) + 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 = Color.White; + 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 = Color.LightGray; + 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 == RowAttribute.HeaderRow || rowStatus == RowAttribute.MemberRow && (i - 1) == 0) + 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 = Color.White; + 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 == RowAttribute.MemberRow) + 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 = ApplicationColors.PendingEdit; + 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 = Color.LightGray; + 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 = ApplicationColors.PendingEdit; + 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 = Color.LightBlue; + dataGridView.Rows[i + 1].DefaultCellStyle.BackColor = TableColors.MemberRow; } //IF previous row is Incomplete, then call the stable PaintRowGroups function. - else if (rowStatus == RowAttribute.IncompleteRow) + else if (rowStatus == RowParser.RowAttribute.IncompleteRow) { - PaintRowGroups(dataGridView); + //PaintRowGroups(dataGridView); } } else { //Then check to see if the next row is a member row rowStatus = parser.GetRowAttribute(dataGridView.Rows[i + 1]); - if (rowStatus == RowAttribute.MemberRow) + 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 = ApplicationColors.PendingEdit; + 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 = Color.LightGray; + 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 = ApplicationColors.PendingEdit; + 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 = Color.LightBlue; + dataGridView.Rows[i + 1].DefaultCellStyle.BackColor = TableColors.MemberRow; } } } - else if (rowStatus == RowAttribute.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 == RowAttribute.MemberRow && (i - 1) == 0) + 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 = Color.White; + dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); //Check for changes in the current row. - if ((bool) dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) + if ((bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; - dataGridView.Rows[i].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + 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 = Color.White; + 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 == RowAttribute.MemberRow && (bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) + 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 = ApplicationColors.PendingEdit; + 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 = Color.LightBlue; + 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 == RowAttribute.MemberRow || rowStatus == RowAttribute.AdSpecialRow) + 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 = ApplicationColors.PendingEdit; + 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 = Color.White; + 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 == RowAttribute.HeaderRow && !(bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue) + 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 = ApplicationColors.PendingEdit; + 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 = Color.LightGray; + 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 = ApplicationColors.PendingEdit; + 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 = ApplicationColors.PendingEdit; + 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 = Color.LightBlue; + dataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } - else if (rowStatus == RowAttribute.HeaderRow) + 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 = ApplicationColors.PendingEdit; + 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 = Color.LightBlue; + dataGridView.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } //IF the previous row is incomplete, then call the stable PaintRowGroups function. - else if (rowStatus == RowAttribute.IncompleteRow) + else if (rowStatus == RowParser.RowAttribute.IncompleteRow) { - PaintRowGroups(dataGridView); + //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. @@ -254,167 +254,95 @@ namespace AdvertsingProfitControl //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 = Color.White; + dataGridView.Rows[0].DefaultCellStyle.BackColor = default(Color); } } - else if (rowStatus == RowAttribute.AdSpecialRow) + else if (rowStatus == RowParser.RowAttribute.AdSpecialRow) { - if(i == 0) return; - dataGridView.Rows[startingIndex].DefaultCellStyle.BackColor = Color.Silver; + 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 == RowAttribute.HeaderRow) + 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 = ApplicationColors.PendingEdit; + 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 = Color.White; + 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 == RowAttribute.MemberRow) + 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 = ApplicationColors.PendingEdit; + 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 = Color.White; + dataGridView.Rows[i + 1].DefaultCellStyle.BackColor = default(Color); } } } } - public void PaintRowGroups(DataGridView dataGridView) + public static void PaintRowGroups(DataGridView table) { - var parser = new RowParsing(); - var incompleteRowsFound = 0; - var lastHeaderIndex = -1; - var i = 0; - var adSpecialIndex = -1; + + } - foreach (DataGridViewRow row in dataGridView.Rows) - { - //Get the current row's status. - var rowType = parser.GetRowAttribute(row); - //If the current row is not a group header, the first row in the grid, or a new row and in fact a member row... - if (i != 0 && rowType == RowAttribute.MemberRow && !row.IsNewRow && rowType != RowAttribute.IncompleteRow) - { - //Remove all coloring on the current row. - dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White; + public static void PaintInventoryRowGroups(int startingIndex, DataGridView inventoryDataGridView, + DataGridView companionDataGridView = null) + { + + } - //Check to make sure the numbers are within bounds, errors occurs when an incomplete row is found at index zero (0), and the current row is one (1). - if ((i - (1 + incompleteRowsFound)) > 0) - { - //Check to see if the previous row is a header row by subtracting the number of rows that are (incomplete + 1) from the total number of rows (i). - //Adding one (1) to the incomplete count allows for checking the row right before the first incomplete row found so far to see if it's a header row. - if (parser.GetRowAttribute(dataGridView.Rows[i - (1 + incompleteRowsFound)]) == RowAttribute.HeaderRow) - { - row.DefaultCellStyle.BackColor = Color.LightBlue; //Group member - dataGridView.Rows[lastHeaderIndex].DefaultCellStyle.BackColor = Color.LightGray; //Group header - } - //Else if a header row was not found from the previous operation but a header row is set, then its safe to assume that this row can be a member. - else if (lastHeaderIndex >= 0) - { - //Check to make sure that the last header index is underneath the Ad Special Row OR that the current row (i) is before the Ad Special Index. - if (lastHeaderIndex > adSpecialIndex || i < adSpecialIndex) - { - //Assume that the current row is a member of that group header and color it as such. - row.DefaultCellStyle.BackColor = Color.LightBlue; - } - } - } - } - //If the current row is a potential group header AND the next row is as well remove the coloring from the current row, no need for checks. - else if (rowType == RowAttribute.HeaderRow && parser.GetRowAttribute(dataGridView.Rows[i + 1]) == RowAttribute.HeaderRow) - { - dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White; - } - //Check to see if this row is the first row, a header index row, AND the next row is a MemberRow. - else if (rowType == RowAttribute.HeaderRow && parser.GetRowAttribute(dataGridView.Rows[i + 1]) == RowAttribute.MemberRow && i == 0) - { - //IF so, set the last header index, and color code of this row along with the next row which is a MemberRow. - lastHeaderIndex = 0; - dataGridView.Rows[0].DefaultCellStyle.BackColor = Color.LightGray; - dataGridView.Rows[i + 1].DefaultCellStyle.BackColor = Color.LightBlue; - } - //Check to see if this row is a group header. - else if (rowType == RowAttribute.HeaderRow) - { - //If so, reset the incomplete rows found count, set the lastHeaderIndex to this row's index (i) and change it's color to white. - incompleteRowsFound = 0; - lastHeaderIndex = i; - dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White; - } - //If the current row is the first row in the grid AND is not a group header then remove all color from it, since its not allowed to be a header or a member. - else if (i == 0 && rowType == RowAttribute.MemberRow) - { - dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White; - } - //Mark an incomplete row to determine whether or not we found one and remove any coloring it may have, incomplete rows are not allowed to be members or headers. - if (rowType == RowAttribute.IncompleteRow) - { - incompleteRowsFound++; - dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White; - } - // - if (rowType == RowAttribute.AdSpecialRow) - { - adSpecialIndex = i; - dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.Silver; - } - i++; - }//end for-each - dataGridView.Refresh(); - }//End PaintRowGroups - } + 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 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 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 + public enum InvoiceTableColumns + { + Id = 0, + InvoiceDate = 1, + Supplier = 2, + InvoiceNumber = 3, + InvoiceNetAmountAtCost = 4, + InvoiceNote = 5, + IsDirty = 6 + } } } diff --git a/DataTableParsingEngine/packages.config b/DataTableParsingEngine/packages.config new file mode 100644 index 0000000..9e8db31 --- /dev/null +++ b/DataTableParsingEngine/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file