From de1ba4af10a0d13b63d5ca196c4f21f4d821f274 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Mon, 18 Sep 2017 11:36:23 -0500 Subject: [PATCH] First stages of a new logging system being put in place. Updated the group parsing engine for the Projections and Actual Sales tables, and removed the method. Fixed the issue where changes to groups didn't mark the record manipulation form as dirty. --- .gitignore | 3 +- .../AdvertsingProfitControl.csproj | 2 + AdvertsingProfitControl/FrmMain.cs | 7 +- AdvertsingProfitControl/GlobalClasses.cs | 49 ++- AdvertsingProfitControl/Log.cs | 22 + AdvertsingProfitControl/Logger.cs | 104 +++++ AdvertsingProfitControl/NewModifyRecord.cs | 52 ++- .../Properties/AssemblyInfo.cs | 4 +- ...gProfitControl.csproj.FileListAbsolute.txt | 72 ++- .../Properties/AssemblyInfo.cs | 4 +- DataTableParsingEngine/RowParser.cs | 3 +- DataTableParsingEngine/TableGroupParser.cs | 415 +++++++----------- 12 files changed, 426 insertions(+), 311 deletions(-) create mode 100644 AdvertsingProfitControl/Log.cs create mode 100644 AdvertsingProfitControl/Logger.cs diff --git a/.gitignore b/.gitignore index 5779e47..1e2966a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ AdvertsingProfitControl/obj DataTableParsingEngine/bin DataTableParsingEngine/obj SetupProject/bin -SetupProject/obj \ No newline at end of file +SetupProject/obj +.vs/ \ No newline at end of file diff --git a/AdvertsingProfitControl/AdvertsingProfitControl.csproj b/AdvertsingProfitControl/AdvertsingProfitControl.csproj index 779bfde..0fadd12 100644 --- a/AdvertsingProfitControl/AdvertsingProfitControl.csproj +++ b/AdvertsingProfitControl/AdvertsingProfitControl.csproj @@ -174,6 +174,8 @@ FrmReportSettings.cs + + Form diff --git a/AdvertsingProfitControl/FrmMain.cs b/AdvertsingProfitControl/FrmMain.cs index 3bfb0fc..e2c6501 100644 --- a/AdvertsingProfitControl/FrmMain.cs +++ b/AdvertsingProfitControl/FrmMain.cs @@ -24,6 +24,11 @@ namespace AdvertsingProfitControl { InitializeComponent(); debugMainMenu.Visible = isDebug; + //var l = new Logger(); + //Logger.WriteLog(DateTime.Now, "Main Form", "Test Critical", Level.Info); + //Logger.WriteLog(DateTime.Now, "Main Form", "Test verbose", Level.Verbose); + //Logger.WriteLog(DateTime.Now, "Form Main", "Test Debug Message", Level.Debug); + //l.ReadLogFile(); } private void frmMain_Load(object sender, EventArgs e) @@ -1120,7 +1125,7 @@ namespace AdvertsingProfitControl private void testToolStripMenuItem_Click(object sender, EventArgs e) { - + } } } \ No newline at end of file diff --git a/AdvertsingProfitControl/GlobalClasses.cs b/AdvertsingProfitControl/GlobalClasses.cs index 7cc7d2f..fbc2cc9 100644 --- a/AdvertsingProfitControl/GlobalClasses.cs +++ b/AdvertsingProfitControl/GlobalClasses.cs @@ -6,17 +6,31 @@ namespace AdvertsingProfitControl { internal class GlobalClasses { - public static string LogFilePath = @"C:\Users\" + Environment.UserName + @"\AppData\Local\APC\"; + public static string LogFilePath = Path.GetPathRoot(Environment.SystemDirectory) + @"Users\" + Environment.UserName + @"\AppData\Local\APC\"; + public GlobalClasses() + { + //Check to make sure the directory exists and if it doesn't then create it. + if (Directory.Exists(Logger.LogFolderPath)) return; + try + { + Directory.CreateDirectory(Logger.LogFolderPath); + } + catch (IOException e) + { + MessageBox.Show(e.Message + Environment.NewLine + @"Advertising Profit Control will be forced to exit.", @"Failed to Create Log File Directory", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + /// + /// Logs any error related to uncaught thread exceptions. + /// + /// + /// public static void LogError(object sender, System.Threading.ThreadExceptionEventArgs e) { - if (!Directory.Exists(LogFilePath)) - { - Directory.CreateDirectory(LogFilePath); - } using ( var file = - new StreamWriter(@"C:\Users\" + Environment.UserName + @"\AppData\Local\APC\" + DateTime.Now.ToString("yy-MM-dd") + ".log", true)) + new StreamWriter(Logger.LogFolderPath + DateTime.Now.ToString("yy-MM-dd") + ".log", true)) { file.WriteLine(DateTime.Now + ": Unhandled Thread Exception:\n" + e.Exception.Message + Environment.NewLine); MessageBox.Show(@"An unhandled thread exception has occurred. Advertising Profit Control will be forced to exit.", @@ -25,29 +39,30 @@ namespace AdvertsingProfitControl } } + /// + /// Logs any unhandled exceptions that fires. + /// + /// + /// public static void LogError(object sender, UnhandledExceptionEventArgs e) { - if (!Directory.Exists(LogFilePath)) - { - Directory.CreateDirectory(LogFilePath); - } - using (var file = new StreamWriter(@"C:\Users\" + Environment.UserName + @"\AppData\Local\APC\" + DateTime.Now.ToString("yy-MM-dd") + ".log", true)) + using (var file = new StreamWriter(Path.GetPathRoot(Environment.SystemDirectory) + @"Users\" + Environment.UserName + @"\AppData\Local\APC\" + DateTime.Now.ToString("yy-MM-dd") + ".log", true)) { file.WriteLine(DateTime.Now + ": An unhandled exception occurred. \nException Object: " + e.ExceptionObject + Environment.NewLine); - MessageBox.Show(@"And unknown error has occurred. Advertising Profit Control will be forced to exit.", + MessageBox.Show(@"An unknown error has occurred. Advertising Profit Control will be forced to exit.", @"Fatal Error"); Application.Exit(); } } + /// + /// Used to log anything from information for the user to errors that don't cause a total application failure. + /// + /// The message to log for future use. public static void WriteToLog(string message) { - if (!Directory.Exists(LogFilePath)) - { - Directory.CreateDirectory(LogFilePath); - } using ( - var file = new StreamWriter(@"C:\Users\" + Environment.UserName + @"\AppData\Local\APC\Information.log", true)) + var file = new StreamWriter(Path.GetPathRoot(Environment.SystemDirectory) + @"Users\" + Environment.UserName + @"\AppData\Local\APC\Information.log", true)) { file.WriteLine(message); } diff --git a/AdvertsingProfitControl/Log.cs b/AdvertsingProfitControl/Log.cs new file mode 100644 index 0000000..1e3cad8 --- /dev/null +++ b/AdvertsingProfitControl/Log.cs @@ -0,0 +1,22 @@ +using System; + +namespace AdvertsingProfitControl +{ + public class Log + { + public DateTime Date { get; set; } + public string Source { get; set; } + public string Message { get; set; } + public Level Level { get; set; } + } + + public enum Level + { + Critical = 0, + Error = 1, + Warning = 2, + Info = 3, + Verbose = 4, + Debug = 5 + } +} diff --git a/AdvertsingProfitControl/Logger.cs b/AdvertsingProfitControl/Logger.cs new file mode 100644 index 0000000..7090aba --- /dev/null +++ b/AdvertsingProfitControl/Logger.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +namespace AdvertsingProfitControl +{ + internal class Logger + { + public static string LogFolderPath = Path.GetPathRoot(Environment.SystemDirectory) + @"Users\" + Environment.UserName + @"\AppData\Local\APC\"; + + /// + /// + /// + /// Date and time of the event. + /// The class or form name that generated the message. + /// Log message. + /// The log's level. + /// A Log object to optionally store for later use by the calling code. + public static Log WriteLog(DateTime date, string source, string message, Level level) + { + var log = new Log + { + Date = date, + Level = level, + Message = message, + Source = source + }; + //Check to see if the message level is a critical (0) error. + //If it is not then simply return the Log object to the calling code. + if (level == Level.Critical) + { + //If the message is critical then write it to disk and return the Log object created. + using (var file = new StreamWriter(LogFolderPath + DateTime.Now.ToString("yy-MM-dd") + ".log", true)) + { + file.WriteLine(SerializeLog(log)); + } + } + else + { + using (var file = new StreamWriter(LogFolderPath + "information.log", true)) + { + file.WriteLine(SerializeLog(log)); + } + } + return log; + } + + /// + /// + /// + /// + /// + public List ReadLogFile(string logFilePath = null) + { + var logs = new List(); + //Check to see if a specific log file has been passed in. + if (logFilePath == null) + { + //If no specific log file has been passed then check to see if the + //default information log exists. + if (!File.Exists(LogFolderPath + "information.log")) + { + //If it doesn't then return an empty list. + return logs; + } + logFilePath = LogFolderPath + "information.log"; + } + + var myDeserializer = new XmlSerializer(typeof(List)); + var myFileStream = new FileStream(logFilePath, FileMode.Open); + var stream = new StreamReader(myFileStream, Encoding.UTF8); + logs = (List)myDeserializer.Deserialize(stream); + myFileStream.Close(); + + return logs; + } + + private static string SerializeLog(Log log) + { + var serializer = new XmlSerializer(typeof(Log)); + string xml; + + using (var sw = new StringWriter()) + { + using (var writer = new XmlTextWriter(sw) {Formatting = Formatting.Indented}) + { + writer.WriteStartElement("Log"); + writer.WriteElementString("Date", log.Date.ToString("g")); + writer.WriteElementString("Level", log.Level.ToString()); + writer.WriteElementString("Source", log.Source); + writer.WriteElementString("Message", log.Message); + writer.Close(); + //serializer.Serialize(writer, log); + xml = sw.ToString(); + } + } + + return xml; + } + } +} diff --git a/AdvertsingProfitControl/NewModifyRecord.cs b/AdvertsingProfitControl/NewModifyRecord.cs index 72b18f0..538825f 100644 --- a/AdvertsingProfitControl/NewModifyRecord.cs +++ b/AdvertsingProfitControl/NewModifyRecord.cs @@ -520,11 +520,16 @@ namespace AdvertsingProfitControl //Paint the rows to identify what group they belong to. if (dataGridView != inventoryDataGridView) { - TableGroupParser.PaintRowGroupsFromIndex(e.RowIndex, dataGridView); + //Paint the groups and check if the form should be marked as dirty. + if (TableGroupParser.PaintRowGroups(dataGridView, e.RowIndex)) + { + _isFormDirty = true; + } + //TableGroupParser.PaintRowGroupsFromIndex(e.RowIndex, dataGridView); } else { - TableGroupParser.PaintInventoryRowGroups(e.RowIndex, inventoryDataGridView, actualSalesDataGridView); + //TODO: Update Inventory table parser. } //Add in used Ad Items to the list. if (userInput == string.Empty) return; @@ -1014,17 +1019,25 @@ namespace AdvertsingProfitControl return; } //Update the color coding of the other tables. - TableGroupParser.PaintRowGroupsFromIndex(e.RowIndex - 1, projectionsDataGridView); + //Paint the groups and check if the form should be marked as dirty. + if (TableGroupParser.PaintRowGroups(projectionsDataGridView, e.RowIndex, true)) + { + _isFormDirty = true; + } if (inventoryDataGridView.RowCount > e.RowIndex) { inventoryDataGridView.Rows[e.RowIndex].Cells[(int) TableGroupParser.InventoryTableColumns.AdItem].Value = userInput; } - TableGroupParser.PaintInventoryRowGroups(e.RowIndex - 1, inventoryDataGridView, actualSalesDataGridView); //TODO:CHANGED .PaintRowGroupsFromIndex(e.RowIndex - 1, inventoryDataGridView); + TableGroupParser.PaintInventoryRowGroups(e.RowIndex - 1, inventoryDataGridView, projectionsDataGridView); //TODO:CHANGED .PaintRowGroupsFromIndex(e.RowIndex - 1, inventoryDataGridView); if (actualSalesDataGridView.RowCount > e.RowIndex) { actualSalesDataGridView.Rows[e.RowIndex].Cells[(int) TableGroupParser.SalesTableColumns.AdItem].Value = userInput; } - TableGroupParser.PaintRowGroupsFromIndex(e.RowIndex - 1, actualSalesDataGridView); + //Paint the groups and check if the form should be marked as dirty. + if (TableGroupParser.PaintRowGroups(actualSalesDataGridView, e.RowIndex, true)) + { + _isFormDirty = true; + } } else { @@ -1392,7 +1405,7 @@ namespace AdvertsingProfitControl projectionsDataGridView.RefreshEdit(); inventoryDataGridView.RefreshEdit(); actualSalesDataGridView.RefreshEdit(); - TableGroupParser.PaintRowGroups(dataGridView); + TableGroupParser.PaintRowGroups(dataGridView, 0); } #endregion @@ -1532,17 +1545,25 @@ namespace AdvertsingProfitControl return; } //Update the color coding of the other tables. - TableGroupParser.PaintRowGroupsFromIndex(e.RowIndex - 1, projectionsDataGridView); + //Paint the groups and check if the form should be marked as dirty. + if (TableGroupParser.PaintRowGroups(projectionsDataGridView, e.RowIndex, true)) + { + _isFormDirty = true; + } if (inventoryDataGridView.RowCount > e.RowIndex) { inventoryDataGridView.Rows[e.RowIndex].Cells[(int)TableGroupParser.InventoryTableColumns.AdItem].Value = userInput; } - TableGroupParser.PaintInventoryRowGroups(e.RowIndex - 1, inventoryDataGridView, actualSalesDataGridView); //TODO:CHANGE .PaintRowGroupsFromIndex(e.RowIndex - 1, inventoryDataGridView); + TableGroupParser.PaintInventoryRowGroups(e.RowIndex - 1, inventoryDataGridView, projectionsDataGridView); //TODO:CHANGE .PaintRowGroupsFromIndex(e.RowIndex - 1, inventoryDataGridView); if (actualSalesDataGridView.RowCount > e.RowIndex) { actualSalesDataGridView.Rows[e.RowIndex].Cells[(int)TableGroupParser.SalesTableColumns.AdItem].Value = userInput; } - TableGroupParser.PaintRowGroupsFromIndex(e.RowIndex - 1, actualSalesDataGridView); + //Paint the groups and check if the form should be marked as dirty. + if (TableGroupParser.PaintRowGroups(actualSalesDataGridView, e.RowIndex, true)) + { + _isFormDirty = true; + } } else { @@ -1863,7 +1884,7 @@ out double beginningBinCount, out string newBinText)) projectionsDataGridView.RefreshEdit(); inventoryDataGridView.RefreshEdit(); actualSalesDataGridView.RefreshEdit(); - TableGroupParser.PaintInventoryRowGroups(0, inventoryDataGridView, actualSalesDataGridView); //TODO: CHANEG.PaintRowGroups(dataGridView); + TableGroupParser.PaintInventoryRowGroups(0, inventoryDataGridView, projectionsDataGridView); //TODO: CHANEG.PaintRowGroups(dataGridView); } #endregion @@ -2079,7 +2100,7 @@ out double beginningBinCount, out string newBinText)) projectionsDataGridView.RefreshEdit(); inventoryDataGridView.RefreshEdit(); actualSalesDataGridView.RefreshEdit(); - TableGroupParser.PaintRowGroups(dataGridView); + TableGroupParser.PaintRowGroups(dataGridView, 0); } #endregion @@ -2132,7 +2153,7 @@ out double beginningBinCount, out string newBinText)) Name = name, HeaderText = TextFormat.AddSpacesToSentence(name, false), ValueType = typeof(bool), - Visible = false, + //Visible = false, SortMode = DataGridViewColumnSortMode.NotSortable }; projectionsDataGridView.Columns.Add(column); @@ -3282,9 +3303,10 @@ out double beginningBinCount, out string newBinText)) try { //Force update all the data tables. - //TableGroupParser.PaintRowGroupsFromIndex(0, projectionsDataGridView); - //TableGroupParser.PaintRowGroupsFromIndex(0, inventoryDataGridView); - //TableGroupParser.PaintRowGroupsFromIndex(0, actualSalesDataGridView); + //Paint the groups and check if the form should be marked as dirty. + TableGroupParser.PaintRowGroups(projectionsDataGridView, 0, true); + TableGroupParser.PaintRowGroups(inventoryDataGridView, 0, true); + TableGroupParser.PaintRowGroups(actualSalesDataGridView, 0, true); using (var scope = new TransactionScope()) { SaveProjections(date); diff --git a/AdvertsingProfitControl/Properties/AssemblyInfo.cs b/AdvertsingProfitControl/Properties/AssemblyInfo.cs index 77a933c..6c6e9ec 100644 --- a/AdvertsingProfitControl/Properties/AssemblyInfo.cs +++ b/AdvertsingProfitControl/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // 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("3.1.2.0")] -[assembly: AssemblyFileVersion("3.1.2.0")] +[assembly: AssemblyVersion("3.2.0.0")] +[assembly: AssemblyFileVersion("3.2.0.0")] diff --git a/AdvertsingProfitControl/obj/Debug/AdvertsingProfitControl.csproj.FileListAbsolute.txt b/AdvertsingProfitControl/obj/Debug/AdvertsingProfitControl.csproj.FileListAbsolute.txt index e0b4939..bbf1245 100644 --- a/AdvertsingProfitControl/obj/Debug/AdvertsingProfitControl.csproj.FileListAbsolute.txt +++ b/AdvertsingProfitControl/obj/Debug/AdvertsingProfitControl.csproj.FileListAbsolute.txt @@ -1,23 +1,49 @@ -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.csprojResolveAssemblyReference.cache -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.DebugDatabaseConverter.resources -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmAddRecord.resources -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmMain.resources -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmLogConsole.resources -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmRegisterAdSpecial.resources -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.NewModifyRecord.resources -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.Properties.Resources.resources -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.csproj.GenerateResource.Cache -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\APCDatabase.accdb -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertsingProfitControl.exe.config -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertsingProfitControl.exe -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertsingProfitControl.pdb -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\EntityFramework.dll -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\EntityFramework.SqlServer.dll -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\HtmlRenderer.dll -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\HtmlRenderer.WinForms.dll -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\EntityFramework.xml -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\EntityFramework.SqlServer.xml -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\HtmlRenderer.pdb -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\HtmlRenderer.WinForms.pdb -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.exe -C:\Users\glmcc\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.pdb +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\APCDatabase.accdb +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\libeay32.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\libgcc_s_dw2-1.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\mingwm10.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\ssleay32.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\wkhtmltox0.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertsingProfitControl.exe.config +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertsingProfitControl.exe +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertsingProfitControl.pdb +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertisingProfitControlData.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Common.Logging.Core.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Common.Logging.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\DataTableParsingEngine.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\EntityFramework.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\EntityFramework.SqlServer.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Pechkin.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Spire.License.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Spire.Pdf.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Microsoft.mshtml.dll +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertisingProfitControlData.pdb +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\AdvertisingProfitControlData.dll.config +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\DataTableParsingEngine.pdb +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\DataTableParsingEngine.dll.config +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Common.Logging.pdb +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Common.Logging.xml +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Common.Logging.Core.pdb +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Common.Logging.Core.xml +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\EntityFramework.xml +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\EntityFramework.SqlServer.xml +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Spire.License.xml +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\bin\Debug\Spire.Pdf.xml +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.csprojResolveAssemblyReference.cache +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.AboutBox.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.DatabaseRecovery.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmAddRecord.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmChangeShrink.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmLogFileViewer.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmLoginForm.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmMain.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmLogConsole.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmManageAdItems.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmManageSuppliers.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmRegisterAdSpecial.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.FrmReportSettings.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.NewModifyRecord.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.Properties.Resources.resources +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.csproj.GenerateResource.Cache +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.exe +C:\Users\Crypto\Documents\Source Control\AdvertisingProfitControl\AdvertsingProfitControl\obj\Debug\AdvertsingProfitControl.pdb diff --git a/DataTableParsingEngine/Properties/AssemblyInfo.cs b/DataTableParsingEngine/Properties/AssemblyInfo.cs index 9925f96..52c44a9 100644 --- a/DataTableParsingEngine/Properties/AssemblyInfo.cs +++ b/DataTableParsingEngine/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // 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.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] +[assembly: AssemblyVersion("1.5.0.0")] +[assembly: AssemblyFileVersion("1.5.0.0")] diff --git a/DataTableParsingEngine/RowParser.cs b/DataTableParsingEngine/RowParser.cs index bdb3428..5ab40f2 100644 --- a/DataTableParsingEngine/RowParser.cs +++ b/DataTableParsingEngine/RowParser.cs @@ -109,7 +109,8 @@ namespace DataTableParsingEngine AdSpecialRow = 2, RepeatedRow = 3, MemberRow = 4, - HeaderRow = 5 + HeaderRow = 5, + UnAssigned = 6 } } } diff --git a/DataTableParsingEngine/TableGroupParser.cs b/DataTableParsingEngine/TableGroupParser.cs index 013bf67..8d80d6b 100644 --- a/DataTableParsingEngine/TableGroupParser.cs +++ b/DataTableParsingEngine/TableGroupParser.cs @@ -12,303 +12,225 @@ namespace DataTableParsingEngine /// fired the row leave even. As opposed to the PaintRowGroups function which spins through all the /// DataGridView's rows. /// + /// The DataGridView to parse. /// The starting index (the row that fired the RowLeave event) - /// The DataGridView to parse. - public static void PaintRowGroupsFromIndex(int startingIndex, DataGridView dataGridView) + /// True to force a full scan of all rows beginning at the starting index. + public static bool PaintRowGroups(DataGridView table, int startingIndex, bool fullScan = false) { - //Underflow protection for the lazy. - if (startingIndex < 0) - { - return; - } - var parser = new RowParser(); - var isHeaderColumn = (int)SalesTableColumns.IsHeaderRow; - var isMemberColumn = (int)SalesTableColumns.IsMemberRow; - var isDirtyColumn = (int)SalesTableColumns.IsDirty; - if (dataGridView.ColumnCount < Enum.GetNames(typeof(SalesTableColumns)).Length) + var isHeaderColumn = (int) SalesTableColumns.IsHeaderRow; + var isMemberColumn = (int) SalesTableColumns.IsMemberRow; + var isDirtyColumn = (int) SalesTableColumns.IsDirty; + var updatesOccured = false; + if (table.ColumnCount < Enum.GetNames(typeof(SalesTableColumns)).Length) { - isHeaderColumn = (int)InventoryTableColumns.IsHeaderRow; - isMemberColumn = (int)InventoryTableColumns.IsMemberRow; - isDirtyColumn = (int)InventoryTableColumns.IsDirty; + 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++) + for (var i = startingIndex; i < (table.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) + var currentRowAttribute = parser.GetRowAttribute(table.Rows[i]); + //Get the previous row's status. + var previousRow = RowParser.RowAttribute.UnAssigned; + if (i > 0) { - //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) + previousRow = parser.GetRowAttribute(table.Rows[i - 1]); + } + //Get the next row's attribute. + var nextRow = RowParser.RowAttribute.UnAssigned; + if ((i + 1) < table.RowCount) + { + nextRow = parser.GetRowAttribute(table.Rows[i + 1]); + } + //If current row is a header row... + if (currentRowAttribute == RowParser.RowAttribute.HeaderRow) + { + //...and the current row is index zero or the previous row is a header row + //then clear color coding from both. + if (previousRow == 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) + //Check the previous row's attributes to see if it needs to be marked for updating. + if ((bool) table.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue || + (bool) table.Rows[i - 1].Cells[isMemberColumn].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) + //The previous row had some attributes set, so mark the previous row for updating. + table.Rows[i - 1].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i - 1].DefaultCellStyle.BackColor = default(Color); + } + //Clear the previous row of its attributes. + table.Rows[i - 1].Cells[isHeaderColumn].Value = false; + table.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. + //Check the next row to see if its a member row before declaring the current row a header row. + if (nextRow == RowParser.RowAttribute.MemberRow) + { + if (!(bool)table.Rows[i].Cells[isHeaderColumn].EditedFormattedValue || + (bool) table.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { - //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; + //The current row had some attributes set, so mark the previous row for updating. + table.Rows[i].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); } //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) - { - //Set the current row and check for changes. - if ((bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) + table.Rows[i].Cells[isHeaderColumn].Value = true; + table.Rows[i].Cells[isMemberColumn].Value = false; + table.Rows[i].DefaultCellStyle.BackColor = TableColors.HeaderRow; + //Mark the next row as a member row. + if ((bool) table.Rows[i + 1].Cells[isHeaderColumn].EditedFormattedValue || + !(bool)table.Rows[i + 1].Cells[isMemberColumn].EditedFormattedValue) { - dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; - dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; + //The next row had some attributes set, so mark the previous row for updating. + table.Rows[i + 1].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i + 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i + 1].DefaultCellStyle.BackColor = default(Color); } - //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); + + table.Rows[i + 1].Cells[isHeaderColumn].Value = false; + table.Rows[i + 1].Cells[isMemberColumn].Value = true; + table.Rows[i + 1].DefaultCellStyle.BackColor = TableColors.MemberRow; } - //Then check to see if the next row is a member row - rowStatus = parser.GetRowAttribute(dataGridView.Rows[i + 1]); - if (rowStatus == RowParser.RowAttribute.MemberRow) + else { - //Set the current row and check for changes. - if (!(bool)dataGridView.Rows[i].Cells[isHeaderColumn].EditedFormattedValue) + //If the current row is not a member row then clear the current row of any attributes it may have. + if ((bool) table.Rows[i].Cells[isHeaderColumn].EditedFormattedValue || + (bool) table.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { - dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; - dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + //The current row had some attributes set, so mark the previous row for updating. + table.Rows[i].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); } - 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); + //Clear the current row's attributes. + table.Rows[i].Cells[isHeaderColumn].Value = false; + table.Rows[i].Cells[isMemberColumn].Value = false; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); + if (!fullScan) return updatesOccured; } } 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) continue; - //Set the current row and check for changes. - if (!(bool)dataGridView.Rows[i].Cells[isHeaderColumn].EditedFormattedValue) + //Else if check to see if the previous row exists. + if (previousRow == RowParser.RowAttribute.UnAssigned) { - dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; - dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + //This indicates that there is no previous row, so its safe to assume that + //we can simply continue on to the next row. + continue; } - 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) + if (nextRow == RowParser.RowAttribute.MemberRow) { - dataGridView.Rows[i + 1].Cells[isDirtyColumn].Value = true; - dataGridView.Rows[i + 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; + continue; } - 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 the current row is not a member row then clear the current row of any attributes it may have. + if ((bool)table.Rows[i].Cells[isHeaderColumn].EditedFormattedValue || + (bool)table.Rows[i].Cells[isMemberColumn].EditedFormattedValue) + { + //The current row had some attributes set, so mark the previous row for updating. + table.Rows[i].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); + } + //Clear the current row's attributes. + table.Rows[i].Cells[isHeaderColumn].Value = false; + table.Rows[i].Cells[isMemberColumn].Value = false; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); + if(!fullScan) return updatesOccured; } } - else if (rowStatus == RowParser.RowAttribute.MemberRow) + if (currentRowAttribute == RowParser.RowAttribute.MemberRow) { - if (i > 0) + //Check to see if the previous row is a header row. + if (previousRow == RowParser.RowAttribute.HeaderRow) { - //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) + //Set the previous row as a header. + if (!(bool)table.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue || + (bool)table.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) { - //Clear the previous row of its attributes. - if ((bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) - { - //And mark it as dirty if those attributes have been set for whatever reason. - 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 = 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); + //The current row had some attributes set, so mark the current row for updating. + table.Rows[i - 1].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i - 1].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) + table.Rows[i - 1].Cells[isHeaderColumn].Value = true; + table.Rows[i - 1].Cells[isMemberColumn].Value = false; + table.Rows[i - 1].DefaultCellStyle.BackColor = TableColors.HeaderRow; + //Mark current row as member row. + if ((bool)table.Rows[i].Cells[isHeaderColumn].EditedFormattedValue || + !(bool)table.Rows[i].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; + //The current row had some attributes set, so mark the current row for updating. + table.Rows[i].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); } - //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) + table.Rows[i].Cells[isHeaderColumn].Value = false; + table.Rows[i].Cells[isMemberColumn].Value = true; + table.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; + } + else if (previousRow == RowParser.RowAttribute.MemberRow) + { + //Check to see if the previous row is set as a member row. + if ((bool) table.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) { - //Check for changes in the current row. - if ((bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) + //Assume that the current row is part of the group. + if ((bool) table.Rows[i].Cells[isHeaderColumn].EditedFormattedValue || + !(bool) table.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { - dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; - dataGridView.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + //The current row had some attributes set, so mark the current row for updating. + table.Rows[i].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); } - //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); + table.Rows[i].Cells[isHeaderColumn].Value = false; + table.Rows[i].Cells[isMemberColumn].Value = true; + table.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow; } - //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) + else { - //Set the previous row as a header row. - if (!(bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) + if ((bool)table.Rows[i].Cells[isHeaderColumn].EditedFormattedValue || + (bool)table.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { - dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; - dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = TableColors.PendingEdit; + //The current row had some attributes set, so mark the current row for updating. + table.Rows[i].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); } - 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); + table.Rows[i].Cells[isHeaderColumn].Value = false; + table.Rows[i].Cells[isMemberColumn].Value = false; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); } } - //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. - if (!(bool)dataGridView.Rows[0].Cells[isMemberColumn].EditedFormattedValue) + if ((bool)table.Rows[i].Cells[isHeaderColumn].EditedFormattedValue || + (bool)table.Rows[i].Cells[isMemberColumn].EditedFormattedValue) { - //If the row thinks that it's a member row then set it to dirty so the changes can be shown. - dataGridView.Rows[0].Cells[isDirtyColumn].Value = true; - dataGridView.Rows[0].HeaderCell.Style.BackColor = TableColors.PendingEdit; + //The current row had some attributes set, so mark the current row for updating. + table.Rows[i].Cells[isDirtyColumn].Value = true; + updatesOccured = true; + table.Rows[i].HeaderCell.Style.BackColor = TableColors.PendingEdit; + table.Rows[i].DefaultCellStyle.BackColor = default(Color); } - 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); + table.Rows[i].Cells[isHeaderColumn].Value = false; + table.Rows[i].Cells[isMemberColumn].Value = false; } } } - } - - public static void PaintRowGroups(DataGridView table) - { + return updatesOccured; } public static void PaintInventoryRowGroups(int startingIndex, DataGridView inventoryDataGridView, @@ -408,11 +330,6 @@ namespace DataTableParsingEngine inventoryDataGridView.Rows[i + 1].Cells[isMemberColumn].Value = true; inventoryDataGridView.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 {