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.
This commit is contained in:
@@ -8,3 +8,4 @@ DataTableParsingEngine/bin
|
||||
DataTableParsingEngine/obj
|
||||
SetupProject/bin
|
||||
SetupProject/obj
|
||||
.vs/
|
||||
@@ -174,6 +174,8 @@
|
||||
<DependentUpon>FrmReportSettings.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Holiday.cs" />
|
||||
<Compile Include="Log.cs" />
|
||||
<Compile Include="Logger.cs" />
|
||||
<Compile Include="NewModifyRecord.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logs any error related to uncaught thread exceptions.
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logs any unhandled exceptions that fires.
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to log anything from information for the user to errors that don't cause a total application failure.
|
||||
/// </summary>
|
||||
/// <param name="message">The message to log for future use.</param>
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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\";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="date">Date and time of the event.</param>
|
||||
/// <param name="source">The class or form name that generated the message.</param>
|
||||
/// <param name="message">Log message.</param>
|
||||
/// <param name="level">The log's level.</param>
|
||||
/// <returns>A Log object to optionally store for later use by the calling code.</returns>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="logFilePath"></param>
|
||||
/// <returns></returns>
|
||||
public List<Log> ReadLogFile(string logFilePath = null)
|
||||
{
|
||||
var logs = new List<Log>();
|
||||
//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<Log>));
|
||||
var myFileStream = new FileStream(logFilePath, FileMode.Open);
|
||||
var stream = new StreamReader(myFileStream, Encoding.UTF8);
|
||||
logs = (List<Log>)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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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")]
|
||||
|
||||
+49
-23
@@ -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
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -109,7 +109,8 @@ namespace DataTableParsingEngine
|
||||
AdSpecialRow = 2,
|
||||
RepeatedRow = 3,
|
||||
MemberRow = 4,
|
||||
HeaderRow = 5
|
||||
HeaderRow = 5,
|
||||
UnAssigned = 6
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
/// </summary>
|
||||
/// <param name="table">The DataGridView to parse.</param>
|
||||
/// <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)
|
||||
/// <param name="fullScan">True to force a full scan of all rows beginning at the starting index.</param>
|
||||
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 updatesOccured = false;
|
||||
if (table.ColumnCount < Enum.GetNames(typeof(SalesTableColumns)).Length)
|
||||
{
|
||||
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)
|
||||
{
|
||||
//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)...
|
||||
var currentRowAttribute = parser.GetRowAttribute(table.Rows[i]);
|
||||
//Get the previous row's status.
|
||||
var previousRow = RowParser.RowAttribute.UnAssigned;
|
||||
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)
|
||||
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)
|
||||
{
|
||||
//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)
|
||||
{
|
||||
//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.
|
||||
dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false;
|
||||
dataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false;
|
||||
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.
|
||||
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)
|
||||
if (nextRow == 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;
|
||||
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);
|
||||
}
|
||||
//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)
|
||||
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)
|
||||
{
|
||||
//Set the current row and check for changes.
|
||||
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;
|
||||
//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;
|
||||
}
|
||||
}
|
||||
else if (rowStatus == RowParser.RowAttribute.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)
|
||||
{
|
||||
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.
|
||||
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;
|
||||
//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 - 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);
|
||||
//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 the current row is the first row in the data grid, therefore it can't be a member row so remove all coloring.
|
||||
if (currentRowAttribute == RowParser.RowAttribute.MemberRow)
|
||||
{
|
||||
//Check to see if the previous row is a header row.
|
||||
if (previousRow == RowParser.RowAttribute.HeaderRow)
|
||||
{
|
||||
//Set the previous row as a header.
|
||||
if (!(bool)table.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue ||
|
||||
(bool)table.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue)
|
||||
{
|
||||
//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);
|
||||
}
|
||||
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)
|
||||
{
|
||||
//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);
|
||||
}
|
||||
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)
|
||||
{
|
||||
//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)
|
||||
{
|
||||
//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);
|
||||
}
|
||||
table.Rows[i].Cells[isHeaderColumn].Value = false;
|
||||
table.Rows[i].Cells[isMemberColumn].Value = true;
|
||||
table.Rows[i].DefaultCellStyle.BackColor = TableColors.MemberRow;
|
||||
}
|
||||
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);
|
||||
table.Rows[i].Cells[isHeaderColumn].Value = false;
|
||||
table.Rows[i].Cells[isMemberColumn].Value = false;
|
||||
table.Rows[i].DefaultCellStyle.BackColor = default(Color);
|
||||
}
|
||||
}
|
||||
else if (rowStatus == RowParser.RowAttribute.AdSpecialRow)
|
||||
else
|
||||
{
|
||||
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)
|
||||
if ((bool)table.Rows[i].Cells[isHeaderColumn].EditedFormattedValue ||
|
||||
(bool)table.Rows[i].Cells[isMemberColumn].EditedFormattedValue)
|
||||
{
|
||||
//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);
|
||||
//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);
|
||||
}
|
||||
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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user