From 8a446709771a71256533aa6aa455b6a87a6e1ee9 Mon Sep 17 00:00:00 2001 From: CreepyCrafter24 <33260128+CreepyCrafter24@users.noreply.github.com> Date: Sat, 29 Feb 2020 13:20:21 +0100 Subject: [PATCH] Upgrade EEPlus --- .idea/.gitignore | 0 .idea/.idea.GradeCalc/.idea/.gitignore | 2 + .idea/.idea.GradeCalc/.idea/discord.xml | 9 + .idea/.idea.GradeCalc/.idea/encodings.xml | 4 + .idea/.idea.GradeCalc/.idea/indexLayout.xml | 8 + .idea/.idea.GradeCalc/.idea/misc.xml | 87 ++++ .../.idea/projectSettingsUpdater.xml | 6 + .idea/.idea.GradeCalc/.idea/vcs.xml | 6 + GradeCalc/DataGridViewNumericUpDownCell.cs | 443 +++++++----------- GradeCalc/DataGridViewNumericUpDownColumn.cs | 230 ++++----- ...DataGridViewNumericUpDownEditingControl.cs | 179 +++---- GradeCalc/GradeCalc.csproj | 5 +- GradeCalc/MainForm.cs | 60 +-- GradeCalc/NCalcDoubleParser.cs | 56 +-- GradeCalc/packages.config | 2 +- 15 files changed, 510 insertions(+), 587 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/.idea.GradeCalc/.idea/.gitignore create mode 100644 .idea/.idea.GradeCalc/.idea/discord.xml create mode 100644 .idea/.idea.GradeCalc/.idea/encodings.xml create mode 100644 .idea/.idea.GradeCalc/.idea/indexLayout.xml create mode 100644 .idea/.idea.GradeCalc/.idea/misc.xml create mode 100644 .idea/.idea.GradeCalc/.idea/projectSettingsUpdater.xml create mode 100644 .idea/.idea.GradeCalc/.idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/.idea/.idea.GradeCalc/.idea/.gitignore b/.idea/.idea.GradeCalc/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/.idea/.idea.GradeCalc/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/.idea/.idea.GradeCalc/.idea/discord.xml b/.idea/.idea.GradeCalc/.idea/discord.xml new file mode 100644 index 0000000..59b11d1 --- /dev/null +++ b/.idea/.idea.GradeCalc/.idea/discord.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.GradeCalc/.idea/encodings.xml b/.idea/.idea.GradeCalc/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.GradeCalc/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.GradeCalc/.idea/indexLayout.xml b/.idea/.idea.GradeCalc/.idea/indexLayout.xml new file mode 100644 index 0000000..27ba142 --- /dev/null +++ b/.idea/.idea.GradeCalc/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.GradeCalc/.idea/misc.xml b/.idea/.idea.GradeCalc/.idea/misc.xml new file mode 100644 index 0000000..a02f39d --- /dev/null +++ b/.idea/.idea.GradeCalc/.idea/misc.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.GradeCalc/.idea/projectSettingsUpdater.xml b/.idea/.idea.GradeCalc/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..7515e76 --- /dev/null +++ b/.idea/.idea.GradeCalc/.idea/projectSettingsUpdater.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.GradeCalc/.idea/vcs.xml b/.idea/.idea.GradeCalc/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.GradeCalc/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/GradeCalc/DataGridViewNumericUpDownCell.cs b/GradeCalc/DataGridViewNumericUpDownCell.cs index 857dba0..0f1245c 100644 --- a/GradeCalc/DataGridViewNumericUpDownCell.cs +++ b/GradeCalc/DataGridViewNumericUpDownCell.cs @@ -3,25 +3,13 @@ using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Globalization; +using System.Runtime.InteropServices; using System.Windows.Forms; namespace GradeCalc { public class DataGridViewNumericUpDownCell : DataGridViewTextBoxCell { - // Used in KeyEntersEditMode function - [System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)] - private static extern short VkKeyScan(char key); - - // Used in TranslateAlignment function - private static readonly DataGridViewContentAlignment anyRight = DataGridViewContentAlignment.TopRight | - DataGridViewContentAlignment.MiddleRight | - DataGridViewContentAlignment.BottomRight; - - private static readonly DataGridViewContentAlignment anyCenter = DataGridViewContentAlignment.TopCenter | - DataGridViewContentAlignment.MiddleCenter | - DataGridViewContentAlignment.BottomCenter; - // Default dimensions of the static rendering bitmap used for the painting of the non-edited cells private const int DATAGRIDVIEWNUMERICUPDOWNCELL_defaultRenderingBitmapWidth = 100; @@ -34,7 +22,7 @@ namespace GradeCalc internal const decimal DATAGRIDVIEWNUMERICUPDOWNCELL_defaultIncrement = decimal.One; // Default value of the Maximum property - internal const decimal DATAGRIDVIEWNUMERICUPDOWNCELL_defaultMaximum = (decimal)100.0; + internal const decimal DATAGRIDVIEWNUMERICUPDOWNCELL_defaultMaximum = (decimal) 100.0; // Default value of the Minimum property internal const decimal DATAGRIDVIEWNUMERICUPDOWNCELL_defaultMinimum = decimal.Zero; @@ -42,36 +30,42 @@ namespace GradeCalc // Default value of the ThousandsSeparator property internal const bool DATAGRIDVIEWNUMERICUPDOWNCELL_defaultThousandsSeparator = false; + // Used in TranslateAlignment function + private static readonly DataGridViewContentAlignment anyRight = DataGridViewContentAlignment.TopRight | + DataGridViewContentAlignment.MiddleRight | + DataGridViewContentAlignment.BottomRight; + + private static readonly DataGridViewContentAlignment anyCenter = DataGridViewContentAlignment.TopCenter | + DataGridViewContentAlignment.MiddleCenter | + DataGridViewContentAlignment.BottomCenter; + // Type of this cell's editing control - private static Type defaultEditType = typeof(DataGridViewNumericUpDownEditingControl); + private static readonly Type defaultEditType = typeof(DataGridViewNumericUpDownEditingControl); // Type of this cell's value. The formatted value type is string, the same as the base class DataGridViewTextBoxCell - private static Type defaultValueType = typeof(decimal); + private static readonly Type defaultValueType = typeof(decimal); // The bitmap used to paint the non-edited cells via a call to NumericUpDown.DrawToBitmap - [ThreadStatic] - private static Bitmap renderingBitmap; + [ThreadStatic] private static Bitmap renderingBitmap; // The NumericUpDown control used to paint the non-edited cells via a call to NumericUpDown.DrawToBitmap - [ThreadStatic] - private static NumericUpDown paintingNumericUpDown; + [ThreadStatic] private static NumericUpDown paintingNumericUpDown; - private int decimalPlaces; // Caches the value of the DecimalPlaces property - private decimal increment; // Caches the value of the Increment property - private decimal minimum; // Caches the value of the Minimum property - private decimal maximum; // Caches the value of the Maximum property + private int decimalPlaces; // Caches the value of the DecimalPlaces property + private decimal increment; // Caches the value of the Increment property + private decimal maximum; // Caches the value of the Maximum property + private decimal minimum; // Caches the value of the Minimum property private bool thousandsSeparator; // Caches the value of the ThousandsSeparator property /// - /// Constructor for the DataGridViewNumericUpDownCell cell type + /// Constructor for the DataGridViewNumericUpDownCell cell type /// public DataGridViewNumericUpDownCell() { // Create a thread specific bitmap used for the painting of the non-edited cells if (renderingBitmap == null) - { - renderingBitmap = new Bitmap(DATAGRIDVIEWNUMERICUPDOWNCELL_defaultRenderingBitmapWidth, DATAGRIDVIEWNUMERICUPDOWNCELL_defaultRenderingBitmapHeight); - } + renderingBitmap = new Bitmap(DATAGRIDVIEWNUMERICUPDOWNCELL_defaultRenderingBitmapWidth, + DATAGRIDVIEWNUMERICUPDOWNCELL_defaultRenderingBitmapHeight); // Create a thread specific NumericUpDown control used for the painting of the non-edited cells if (paintingNumericUpDown == null) @@ -92,79 +86,64 @@ namespace GradeCalc } /// - /// The DecimalPlaces property replicates the one from the NumericUpDown control + /// The DecimalPlaces property replicates the one from the NumericUpDown control /// [ DefaultValue(DATAGRIDVIEWNUMERICUPDOWNCELL_defaultDecimalPlaces) ] public int DecimalPlaces { - get { - return decimalPlaces; - } + get => decimalPlaces; - set { + set + { if (value < 0 || value > 99) - { - throw new ArgumentOutOfRangeException("The DecimalPlaces property cannot be smaller than 0 or larger than 99."); - } + throw new ArgumentOutOfRangeException( + "The DecimalPlaces property cannot be smaller than 0 or larger than 99."); if (decimalPlaces != value) { SetDecimalPlaces(RowIndex, value); - OnCommonChange(); // Assure that the cell or column gets repainted and autosized if needed + OnCommonChange(); // Assure that the cell or column gets repainted and autosized if needed } } } /// - /// Returns the current DataGridView EditingControl as a DataGridViewNumericUpDownEditingControl control + /// Returns the current DataGridView EditingControl as a DataGridViewNumericUpDownEditingControl control /// - private DataGridViewNumericUpDownEditingControl EditingNumericUpDown - { - get { - return DataGridView.EditingControl as DataGridViewNumericUpDownEditingControl; - } - } + private DataGridViewNumericUpDownEditingControl EditingNumericUpDown => + DataGridView.EditingControl as DataGridViewNumericUpDownEditingControl; /// - /// Define the type of the cell's editing control + /// Define the type of the cell's editing control /// - public override Type EditType - { - get { - return defaultEditType; // the type is DataGridViewNumericUpDownEditingControl - } - } + public override Type EditType => defaultEditType; // the type is DataGridViewNumericUpDownEditingControl /// - /// The Increment property replicates the one from the NumericUpDown control + /// The Increment property replicates the one from the NumericUpDown control /// public decimal Increment { - get { - return increment; - } + get => increment; - set { - if (value < (decimal)0.0) - { + set + { + if (value < (decimal) 0.0) throw new ArgumentOutOfRangeException("The Increment property cannot be smaller than 0."); - } SetIncrement(RowIndex, value); // No call to OnCommonChange is needed since the increment value does not affect the rendering of the cell. } } /// - /// The Maximum property replicates the one from the NumericUpDown control + /// The Maximum property replicates the one from the NumericUpDown control /// public decimal Maximum { - get { - return maximum; - } + get => maximum; - set { + set + { if (maximum != value) { SetMaximum(RowIndex, value); @@ -174,15 +153,14 @@ namespace GradeCalc } /// - /// The Minimum property replicates the one from the NumericUpDown control + /// The Minimum property replicates the one from the NumericUpDown control /// public decimal Minimum { - get { - return minimum; - } + get => minimum; - set { + set + { if (minimum != value) { SetMinimum(RowIndex, value); @@ -192,18 +170,17 @@ namespace GradeCalc } /// - /// The ThousandsSeparator property replicates the one from the NumericUpDown control + /// The ThousandsSeparator property replicates the one from the NumericUpDown control /// [ DefaultValue(DATAGRIDVIEWNUMERICUPDOWNCELL_defaultThousandsSeparator) ] public bool ThousandsSeparator { - get { - return thousandsSeparator; - } + get => thousandsSeparator; - set { + set + { if (thousandsSeparator != value) { SetThousandsSeparator(RowIndex, value); @@ -213,22 +190,24 @@ namespace GradeCalc } /// - /// Returns the type of the cell's Value property + /// Returns the type of the cell's Value property /// public override Type ValueType { - get { + get + { Type valueType = base.ValueType; - if (valueType != null) - { - return valueType; - } + if (valueType != null) return valueType; return defaultValueType; } } + // Used in KeyEntersEditMode function + [DllImport("USER32.DLL", CharSet = CharSet.Auto)] + private static extern short VkKeyScan(char key); + /// - /// Clones a DataGridViewNumericUpDownCell cell, copies all the custom properties. + /// Clones a DataGridViewNumericUpDownCell cell, copies all the custom properties. /// public override object Clone() { @@ -245,24 +224,18 @@ namespace GradeCalc } /// - /// Returns the provided value constrained to be within the min and max. + /// Returns the provided value constrained to be within the min and max. /// private decimal Constrain(decimal value) { Debug.Assert(minimum <= maximum); - if (value < minimum) - { - value = minimum; - } - if (value > maximum) - { - value = maximum; - } + if (value < minimum) value = minimum; + if (value > maximum) value = maximum; return value; } /// - /// DetachEditingControl gets called by the DataGridView control when the editing session is ending + /// DetachEditingControl gets called by the DataGridView control when the editing session is ending /// [ EditorBrowsable(EditorBrowsableState.Advanced) @@ -271,9 +244,7 @@ namespace GradeCalc { DataGridView dataGridView = DataGridView; if (dataGridView == null || dataGridView.EditingControl == null) - { throw new InvalidOperationException("Cell is detached or its grid has no editing control."); - } NumericUpDown numericUpDown = dataGridView.EditingControl as NumericUpDown; if (numericUpDown != null) @@ -284,19 +255,17 @@ namespace GradeCalc // Here the undo buffer of the TextBox inside the NumericUpDown control gets cleared to avoid // interferences between the editing sessions. TextBox textBox = numericUpDown.Controls[1] as TextBox; - if (textBox != null) - { - textBox.ClearUndo(); - } + if (textBox != null) textBox.ClearUndo(); } base.DetachEditingControl(); } /// - /// Adjusts the location and size of the editing control given the alignment characteristics of the cell + /// Adjusts the location and size of the editing control given the alignment characteristics of the cell /// - private Rectangle GetAdjustedEditingControlBounds(Rectangle editingControlBounds, DataGridViewCellStyle cellStyle) + private Rectangle GetAdjustedEditingControlBounds(Rectangle editingControlBounds, + DataGridViewCellStyle cellStyle) { // Add a 1 pixel padding on the left and right of the editing control editingControlBounds.X += 1; @@ -305,7 +274,6 @@ namespace GradeCalc // Adjust the vertical location of the editing control: int preferredHeight = cellStyle.Font.Height + 3; if (preferredHeight < editingControlBounds.Height) - { switch (cellStyle.Alignment) { case DataGridViewContentAlignment.MiddleLeft: @@ -320,87 +288,81 @@ namespace GradeCalc editingControlBounds.Y += editingControlBounds.Height - preferredHeight; break; } - } return editingControlBounds; } /// - /// Customized implementation of the GetErrorIconBounds function in order to draw the potential - /// error icon next to the up/down buttons and not on top of them. + /// Customized implementation of the GetErrorIconBounds function in order to draw the potential + /// error icon next to the up/down buttons and not on top of them. /// - protected override Rectangle GetErrorIconBounds(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex) + protected override Rectangle GetErrorIconBounds(Graphics graphics, DataGridViewCellStyle cellStyle, + int rowIndex) { const int ButtonsWidth = 16; Rectangle errorIconBounds = base.GetErrorIconBounds(graphics, cellStyle, rowIndex); if (DataGridView.RightToLeft == RightToLeft.Yes) - { errorIconBounds.X = errorIconBounds.Left + ButtonsWidth; - } else - { errorIconBounds.X = errorIconBounds.Left - ButtonsWidth; - } return errorIconBounds; } /// - /// Customized implementation of the GetFormattedValue function in order to include the decimal and thousand separator - /// characters in the formatted representation of the cell value. + /// Customized implementation of the GetFormattedValue function in order to include the decimal and thousand separator + /// characters in the formatted representation of the cell value. /// protected override object GetFormattedValue(object value, - int rowIndex, - ref DataGridViewCellStyle cellStyle, - TypeConverter valueTypeConverter, - TypeConverter formattedValueTypeConverter, - DataGridViewDataErrorContexts context) + int rowIndex, + ref DataGridViewCellStyle cellStyle, + TypeConverter valueTypeConverter, + TypeConverter formattedValueTypeConverter, + DataGridViewDataErrorContexts context) { // By default, the base implementation converts the Decimal 1234.5 into the string "1234.5" - object formattedValue = base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context); + object formattedValue = base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, + formattedValueTypeConverter, context); string formattedNumber = formattedValue as string; if (!string.IsNullOrEmpty(formattedNumber) && value != null) { decimal unformattedDecimal = Convert.ToDecimal(value); decimal formattedDecimal = Convert.ToDecimal(formattedNumber); if (unformattedDecimal == formattedDecimal) - { // The base implementation of GetFormattedValue (which triggers the CellFormatting event) did nothing else than // the typical 1234.5 to "1234.5" conversion. But depending on the values of ThousandsSeparator and DecimalPlaces, // this may not be the actual string displayed. The real formatted value may be "1,234.500" - return formattedDecimal.ToString((ThousandsSeparator ? "N" : "F") + DecimalPlaces.ToString()); - } + return formattedDecimal.ToString((ThousandsSeparator ? "N" : "F") + DecimalPlaces); } return formattedValue; } /// - /// Custom implementation of the GetPreferredSize function. This implementation uses the preferred size of the base - /// DataGridViewTextBoxCell cell and adds room for the up/down buttons. + /// Custom implementation of the GetPreferredSize function. This implementation uses the preferred size of the base + /// DataGridViewTextBoxCell cell and adds room for the up/down buttons. /// - protected override Size GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize) + protected override Size GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex, + Size constraintSize) { - if (DataGridView == null) - { - return new Size(-1, -1); - } + if (DataGridView == null) return new Size(-1, -1); Size preferredSize = base.GetPreferredSize(graphics, cellStyle, rowIndex, constraintSize); if (constraintSize.Width == 0) { const int ButtonsWidth = 16; // Account for the width of the up/down buttons. - const int ButtonMargin = 8; // Account for some blank pixels between the text and buttons. + const int ButtonMargin = 8; // Account for some blank pixels between the text and buttons. preferredSize.Width += ButtonsWidth + ButtonMargin; } return preferredSize; } /// - /// Custom implementation of the InitializeEditingControl function. This function is called by the DataGridView control - /// at the beginning of an editing session. It makes sure that the properties of the NumericUpDown editing control are - /// set according to the cell properties. + /// Custom implementation of the InitializeEditingControl function. This function is called by the DataGridView control + /// at the beginning of an editing session. It makes sure that the properties of the NumericUpDown editing control are + /// set according to the cell properties. /// - public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) + public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, + DataGridViewCellStyle dataGridViewCellStyle) { base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); NumericUpDown numericUpDown = DataGridView.EditingControl as NumericUpDown; @@ -414,20 +376,16 @@ namespace GradeCalc numericUpDown.ThousandsSeparator = ThousandsSeparator; string initialFormattedValueStr = initialFormattedValue as string; if (initialFormattedValueStr == null) - { numericUpDown.Text = string.Empty; - } else - { numericUpDown.Text = initialFormattedValueStr; - } } } /// - /// Custom implementation of the KeyEntersEditMode function. This function is called by the DataGridView control - /// to decide whether a keystroke must start an editing session or not. In this case, a new session is started when - /// a digit or negative sign key is hit. + /// Custom implementation of the KeyEntersEditMode function. This function is called by the DataGridView control + /// to decide whether a keystroke must start an editing session or not. In this case, a new session is started when + /// a digit or negative sign key is hit. /// public override bool KeyEntersEditMode(KeyEventArgs e) { @@ -435,83 +393,74 @@ namespace GradeCalc Keys negativeSignKey = Keys.None; string negativeSignStr = numberFormatInfo.NegativeSign; if (!string.IsNullOrEmpty(negativeSignStr) && negativeSignStr.Length == 1) - { - negativeSignKey = (Keys)VkKeyScan(negativeSignStr[0]); - } + negativeSignKey = (Keys) VkKeyScan(negativeSignStr[0]); - if ((char.IsDigit((char)e.KeyCode) || - e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9 || + if ((char.IsDigit((char) e.KeyCode) || + (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) || negativeSignKey == e.KeyCode || Keys.Subtract == e.KeyCode) && !e.Shift && !e.Alt && !e.Control) - { return true; - } return false; } /// - /// Called when a cell characteristic that affects its rendering and/or preferred size has changed. - /// This implementation only takes care of repainting the cells. The DataGridView's autosizing methods - /// also need to be called in cases where some grid elements autosize. + /// Called when a cell characteristic that affects its rendering and/or preferred size has changed. + /// This implementation only takes care of repainting the cells. The DataGridView's autosizing methods + /// also need to be called in cases where some grid elements autosize. /// private void OnCommonChange() { if (DataGridView != null && !DataGridView.IsDisposed && !DataGridView.Disposing) { if (RowIndex == -1) - { // Invalidate and autosize column DataGridView.InvalidateColumn(ColumnIndex); - // TODO: Add code to autosize the cell's column, the rows, the column headers - // and the row headers depending on their autosize settings. - // The DataGridView control does not expose a public method that takes care of this. - } + // TODO: Add code to autosize the cell's column, the rows, the column headers + // and the row headers depending on their autosize settings. + // The DataGridView control does not expose a public method that takes care of this. else - { // The DataGridView control exposes a public method called UpdateCellValue // that invalidates the cell so that it gets repainted and also triggers all // the necessary autosizing: the cell's column and/or row, the column headers // and the row headers are autosized depending on their autosize settings. DataGridView.UpdateCellValue(ColumnIndex, RowIndex); - } } } /// - /// Determines whether this cell, at the given row index, shows the grid's editing control or not. - /// The row index needs to be provided as a parameter because this cell may be shared among multiple rows. + /// Determines whether this cell, at the given row index, shows the grid's editing control or not. + /// The row index needs to be provided as a parameter because this cell may be shared among multiple rows. /// private bool OwnsEditingNumericUpDown(int rowIndex) { - if (rowIndex == -1 || DataGridView == null) - { - return false; - } - DataGridViewNumericUpDownEditingControl numericUpDownEditingControl = DataGridView.EditingControl as DataGridViewNumericUpDownEditingControl; - return numericUpDownEditingControl != null && rowIndex == ((IDataGridViewEditingControl)numericUpDownEditingControl).EditingControlRowIndex; + if (rowIndex == -1 || DataGridView == null) return false; + DataGridViewNumericUpDownEditingControl numericUpDownEditingControl = + DataGridView.EditingControl as DataGridViewNumericUpDownEditingControl; + return numericUpDownEditingControl != null && rowIndex == + ((IDataGridViewEditingControl) numericUpDownEditingControl).EditingControlRowIndex; } /// - /// Custom paints the cell. The base implementation of the DataGridViewTextBoxCell type is called first, - /// dropping the icon error and content foreground parts. Those two parts are painted by this custom implementation. - /// In this sample, the non-edited NumericUpDown control is painted by using a call to Control.DrawToBitmap. This is - /// an easy solution for painting controls but it's not necessarily the most performant. An alternative would be to paint - /// the NumericUpDown control piece by piece (text and up/down buttons). + /// Custom paints the cell. The base implementation of the DataGridViewTextBoxCell type is called first, + /// dropping the icon error and content foreground parts. Those two parts are painted by this custom implementation. + /// In this sample, the non-edited NumericUpDown control is painted by using a call to Control.DrawToBitmap. This is + /// an easy solution for painting controls but it's not necessarily the most performant. An alternative would be to + /// paint + /// the NumericUpDown control piece by piece (text and up/down buttons). /// - protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, - object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, - DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) + protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, + DataGridViewElementStates cellState, + object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, + DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { - if (DataGridView == null) - { - return; - } + if (DataGridView == null) return; // First paint the borders and background of the cell. - base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, - paintParts & ~(DataGridViewPaintParts.ErrorIcon | DataGridViewPaintParts.ContentForeground)); + base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, + cellStyle, advancedBorderStyle, + paintParts & ~(DataGridViewPaintParts.ErrorIcon | DataGridViewPaintParts.ContentForeground)); Point ptCurrentCell = DataGridView.CurrentCellAddress; bool cellCurrent = ptCurrentCell.X == ColumnIndex && ptCurrentCell.Y == rowIndex; @@ -533,13 +482,9 @@ namespace GradeCalc if (cellStyle.Padding != Padding.Empty) { if (DataGridView.RightToLeft == RightToLeft.Yes) - { valBounds.Offset(cellStyle.Padding.Right, cellStyle.Padding.Top); - } else - { valBounds.Offset(cellStyle.Padding.Left, cellStyle.Padding.Top); - } valBounds.Width -= cellStyle.Padding.Horizontal; valBounds.Height -= cellStyle.Padding.Vertical; } @@ -557,9 +502,7 @@ namespace GradeCalc } // Make sure the NumericUpDown control is parented to a visible control if (paintingNumericUpDown.Parent == null || !paintingNumericUpDown.Parent.Visible) - { paintingNumericUpDown.Parent = DataGridView; - } // Set all the relevant properties paintingNumericUpDown.TextAlign = TranslateAlignment(cellStyle.Alignment); paintingNumericUpDown.DecimalPlaces = DecimalPlaces; @@ -573,20 +516,14 @@ namespace GradeCalc Color backColor; if (PartPainted(paintParts, DataGridViewPaintParts.SelectionBackground) && cellSelected) - { backColor = cellStyle.SelectionBackColor; - } else - { backColor = cellStyle.BackColor; - } if (PartPainted(paintParts, DataGridViewPaintParts.Background)) { if (backColor.A < 255) - { // The NumericUpDown control does not support transparent back colors backColor = Color.FromArgb(255, backColor); - } paintingNumericUpDown.BackColor = backColor; } // Finally paint the NumericUpDown control @@ -595,67 +532,60 @@ namespace GradeCalc { paintingNumericUpDown.DrawToBitmap(renderingBitmap, srcRect); graphics.DrawImage(renderingBitmap, new Rectangle(valBounds.Location, valBounds.Size), - srcRect, GraphicsUnit.Pixel); + srcRect, GraphicsUnit.Pixel); } } if (PartPainted(paintParts, DataGridViewPaintParts.ErrorIcon)) - { // Paint the potential error icon on top of the NumericUpDown control base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, - cellStyle, advancedBorderStyle, DataGridViewPaintParts.ErrorIcon); - } + cellStyle, advancedBorderStyle, DataGridViewPaintParts.ErrorIcon); } } /// - /// Little utility function called by the Paint function to see if a particular part needs to be painted. + /// Little utility function called by the Paint function to see if a particular part needs to be painted. /// - private static bool PartPainted(DataGridViewPaintParts paintParts, DataGridViewPaintParts paintPart) - { - return (paintParts & paintPart) != 0; - } + private static bool PartPainted(DataGridViewPaintParts paintParts, DataGridViewPaintParts paintPart) => + (paintParts & paintPart) != 0; /// - /// Custom implementation of the PositionEditingControl method called by the DataGridView control when it - /// needs to relocate and/or resize the editing control. + /// Custom implementation of the PositionEditingControl method called by the DataGridView control when it + /// needs to relocate and/or resize the editing control. /// public override void PositionEditingControl(bool setLocation, - bool setSize, - Rectangle cellBounds, - Rectangle cellClip, - DataGridViewCellStyle cellStyle, - bool singleVerticalBorderAdded, - bool singleHorizontalBorderAdded, - bool isFirstDisplayedColumn, - bool isFirstDisplayedRow) + bool setSize, + Rectangle cellBounds, + Rectangle cellClip, + DataGridViewCellStyle cellStyle, + bool singleVerticalBorderAdded, + bool singleHorizontalBorderAdded, + bool isFirstDisplayedColumn, + bool isFirstDisplayedRow) { Rectangle editingControlBounds = PositionEditingPanel(cellBounds, - cellClip, - cellStyle, - singleVerticalBorderAdded, - singleHorizontalBorderAdded, - isFirstDisplayedColumn, - isFirstDisplayedRow); + cellClip, + cellStyle, + singleVerticalBorderAdded, + singleHorizontalBorderAdded, + isFirstDisplayedColumn, + isFirstDisplayedRow); editingControlBounds = GetAdjustedEditingControlBounds(editingControlBounds, cellStyle); DataGridView.EditingControl.Location = new Point(editingControlBounds.X, editingControlBounds.Y); DataGridView.EditingControl.Size = new Size(editingControlBounds.Width, editingControlBounds.Height); } /// - /// Utility function that sets a new value for the DecimalPlaces property of the cell. This function is used by - /// the cell and column DecimalPlaces property. The column uses this method instead of the DecimalPlaces - /// property for performance reasons. This way the column can invalidate the entire column at once instead of - /// invalidating each cell of the column individually. A row index needs to be provided as a parameter because - /// this cell may be shared among multiple rows. + /// Utility function that sets a new value for the DecimalPlaces property of the cell. This function is used by + /// the cell and column DecimalPlaces property. The column uses this method instead of the DecimalPlaces + /// property for performance reasons. This way the column can invalidate the entire column at once instead of + /// invalidating each cell of the column individually. A row index needs to be provided as a parameter because + /// this cell may be shared among multiple rows. /// internal void SetDecimalPlaces(int rowIndex, int value) { Debug.Assert(value >= 0 && value <= 99); decimalPlaces = value; - if (OwnsEditingNumericUpDown(rowIndex)) - { - EditingNumericUpDown.DecimalPlaces = value; - } + if (OwnsEditingNumericUpDown(rowIndex)) EditingNumericUpDown.DecimalPlaces = value; } /// Utility function that sets a new value for the Increment property of the cell. This function is used by @@ -663,12 +593,9 @@ namespace GradeCalc /// this cell may be shared among multiple rows. internal void SetIncrement(int rowIndex, decimal value) { - Debug.Assert(value >= (decimal)0.0); + Debug.Assert(value >= (decimal) 0.0); increment = value; - if (OwnsEditingNumericUpDown(rowIndex)) - { - EditingNumericUpDown.Increment = value; - } + if (OwnsEditingNumericUpDown(rowIndex)) EditingNumericUpDown.Increment = value; } /// Utility function that sets a new value for the Maximum property of the cell. This function is used by @@ -679,25 +606,16 @@ namespace GradeCalc internal void SetMaximum(int rowIndex, decimal value) { maximum = value; - if (minimum > maximum) - { - minimum = maximum; - } + if (minimum > maximum) minimum = maximum; object cellValue = GetValue(rowIndex); if (cellValue != null) { decimal currentValue = Convert.ToDecimal(cellValue); decimal constrainedValue = Constrain(currentValue); - if (constrainedValue != currentValue) - { - SetValue(rowIndex, constrainedValue); - } + if (constrainedValue != currentValue) SetValue(rowIndex, constrainedValue); } Debug.Assert(maximum == value); - if (OwnsEditingNumericUpDown(rowIndex)) - { - EditingNumericUpDown.Maximum = value; - } + if (OwnsEditingNumericUpDown(rowIndex)) EditingNumericUpDown.Maximum = value; } /// Utility function that sets a new value for the Minimum property of the cell. This function is used by @@ -708,25 +626,16 @@ namespace GradeCalc internal void SetMinimum(int rowIndex, decimal value) { minimum = value; - if (minimum > maximum) - { - maximum = value; - } + if (minimum > maximum) maximum = value; object cellValue = GetValue(rowIndex); if (cellValue != null) { decimal currentValue = Convert.ToDecimal(cellValue); decimal constrainedValue = Constrain(currentValue); - if (constrainedValue != currentValue) - { - SetValue(rowIndex, constrainedValue); - } + if (constrainedValue != currentValue) SetValue(rowIndex, constrainedValue); } Debug.Assert(minimum == value); - if (OwnsEditingNumericUpDown(rowIndex)) - { - EditingNumericUpDown.Minimum = value; - } + if (OwnsEditingNumericUpDown(rowIndex)) EditingNumericUpDown.Minimum = value; } /// Utility function that sets a new value for the ThousandsSeparator property of the cell. This function is used by @@ -737,38 +646,28 @@ namespace GradeCalc internal void SetThousandsSeparator(int rowIndex, bool value) { thousandsSeparator = value; - if (OwnsEditingNumericUpDown(rowIndex)) - { - EditingNumericUpDown.ThousandsSeparator = value; - } + if (OwnsEditingNumericUpDown(rowIndex)) EditingNumericUpDown.ThousandsSeparator = value; } /// - /// Returns a standard textual representation of the cell. + /// Returns a standard textual representation of the cell. /// - public override string ToString() - { - return "DataGridViewNumericUpDownCell { ColumnIndex=" + ColumnIndex.ToString(CultureInfo.CurrentCulture) + ", RowIndex=" + RowIndex.ToString(CultureInfo.CurrentCulture) + " }"; - } + public override string ToString() => "DataGridViewNumericUpDownCell { ColumnIndex=" + + ColumnIndex.ToString(CultureInfo.CurrentCulture) + ", RowIndex=" + + RowIndex.ToString(CultureInfo.CurrentCulture) + " }"; /// - /// Little utility function used by both the cell and column types to translate a DataGridViewContentAlignment value into - /// a HorizontalAlignment value. + /// Little utility function used by both the cell and column types to translate a DataGridViewContentAlignment value + /// into + /// a HorizontalAlignment value. /// internal static HorizontalAlignment TranslateAlignment(DataGridViewContentAlignment align) { if ((align & anyRight) != 0) - { return HorizontalAlignment.Right; - } - else if ((align & anyCenter) != 0) - { + if ((align & anyCenter) != 0) return HorizontalAlignment.Center; - } - else - { - return HorizontalAlignment.Left; - } + return HorizontalAlignment.Left; } } } \ No newline at end of file diff --git a/GradeCalc/DataGridViewNumericUpDownColumn.cs b/GradeCalc/DataGridViewNumericUpDownColumn.cs index 28cf13c..6b6b834 100644 --- a/GradeCalc/DataGridViewNumericUpDownColumn.cs +++ b/GradeCalc/DataGridViewNumericUpDownColumn.cs @@ -7,61 +7,55 @@ using System.Windows.Forms; namespace GradeCalc { /// - /// Custom column type dedicated to the DataGridViewNumericUpDownCell cell type. + /// Custom column type dedicated to the DataGridViewNumericUpDownCell cell type. /// public class DataGridViewNumericUpDownColumn : DataGridViewColumn { /// - /// Constructor for the DataGridViewNumericUpDownColumn class. + /// Constructor for the DataGridViewNumericUpDownColumn class. /// public DataGridViewNumericUpDownColumn() : base(new DataGridViewNumericUpDownCell()) { } /// - /// Represents the implicit cell that gets cloned when adding rows to the grid. + /// Represents the implicit cell that gets cloned when adding rows to the grid. /// - [ - Browsable(false), - DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) - ] + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public override DataGridViewCell CellTemplate { - get { - return base.CellTemplate; - } - set { + get => base.CellTemplate; + set + { DataGridViewNumericUpDownCell dataGridViewNumericUpDownCell = value as DataGridViewNumericUpDownCell; if (value != null && dataGridViewNumericUpDownCell == null) - { - throw new InvalidCastException("Value provided for CellTemplate must be of type DataGridViewNumericUpDownElements.DataGridViewNumericUpDownCell or derive from it."); - } + throw new InvalidCastException( + "Value provided for CellTemplate must be of type DataGridViewNumericUpDownElements.DataGridViewNumericUpDownCell or derive from it."); base.CellTemplate = value; } } /// - /// Replicates the DecimalPlaces property of the DataGridViewNumericUpDownCell cell type. + /// Replicates the DecimalPlaces property of the DataGridViewNumericUpDownCell cell type. /// - [ - Category("Appearance"), - DefaultValue(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultDecimalPlaces), - Description("Indicates the number of decimal places to display.") - ] + [Category("Appearance")] + [DefaultValue(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultDecimalPlaces)] + [Description("Indicates the number of decimal places to display.")] public int DecimalPlaces { - get { + get + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); return NumericUpDownCellTemplate.DecimalPlaces; } - set { + set + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); // Update the template cell so that subsequent cloned cells use the new value. NumericUpDownCellTemplate.DecimalPlaces = value; if (DataGridView != null) @@ -74,13 +68,12 @@ namespace GradeCalc // Be careful not to unshare rows unnecessarily. // This could have severe performance repercussions. DataGridViewRow dataGridViewRow = dataGridViewRows.SharedRow(rowIndex); - DataGridViewNumericUpDownCell dataGridViewCell = dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; + DataGridViewNumericUpDownCell dataGridViewCell = + dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; if (dataGridViewCell != null) - { // Call the internal SetDecimalPlaces method instead of the property to avoid invalidation // of each cell. The whole column is invalidated later in a single operation for better performance. dataGridViewCell.SetDecimalPlaces(rowIndex, value); - } } DataGridView.InvalidateColumn(Index); // TODO: Call the grid's autosizing methods to autosize the column, rows, column headers / row headers as needed. @@ -89,26 +82,24 @@ namespace GradeCalc } /// - /// Replicates the Increment property of the DataGridViewNumericUpDownCell cell type. + /// Replicates the Increment property of the DataGridViewNumericUpDownCell cell type. /// - [ - Category("Data"), - Description("Indicates the amount to increment or decrement on each button click.") - ] + [Category("Data")] + [Description("Indicates the amount to increment or decrement on each button click.")] public decimal Increment { - get { + get + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); return NumericUpDownCellTemplate.Increment; } - set { + set + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); NumericUpDownCellTemplate.Increment = value; if (DataGridView != null) { @@ -117,44 +108,34 @@ namespace GradeCalc for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) { DataGridViewRow dataGridViewRow = dataGridViewRows.SharedRow(rowIndex); - DataGridViewNumericUpDownCell dataGridViewCell = dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; - if (dataGridViewCell != null) - { - dataGridViewCell.SetIncrement(rowIndex, value); - } + DataGridViewNumericUpDownCell dataGridViewCell = + dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; + if (dataGridViewCell != null) dataGridViewCell.SetIncrement(rowIndex, value); } } } } - /// Indicates whether the Increment property should be persisted. - private bool ShouldSerializeIncrement() - { - return !Increment.Equals(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultIncrement); - } - /// - /// Replicates the Maximum property of the DataGridViewNumericUpDownCell cell type. + /// Replicates the Maximum property of the DataGridViewNumericUpDownCell cell type. /// - [ - Category("Data"), - Description("Indicates the maximum value for the numeric up-down cells."), - RefreshProperties(RefreshProperties.All) - ] + [Category("Data")] + [Description("Indicates the maximum value for the numeric up-down cells.")] + [RefreshProperties(RefreshProperties.All)] public decimal Maximum { - get { + get + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); return NumericUpDownCellTemplate.Maximum; } - set { + set + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); NumericUpDownCellTemplate.Maximum = value; if (DataGridView != null) { @@ -163,11 +144,9 @@ namespace GradeCalc for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) { DataGridViewRow dataGridViewRow = dataGridViewRows.SharedRow(rowIndex); - DataGridViewNumericUpDownCell dataGridViewCell = dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; - if (dataGridViewCell != null) - { - dataGridViewCell.SetMaximum(rowIndex, value); - } + DataGridViewNumericUpDownCell dataGridViewCell = + dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; + if (dataGridViewCell != null) dataGridViewCell.SetMaximum(rowIndex, value); } DataGridView.InvalidateColumn(Index); // TODO: This column and/or grid rows may need to be autosized depending on their @@ -177,34 +156,26 @@ namespace GradeCalc } } - /// Indicates whether the Maximum property should be persisted. - private bool ShouldSerializeMaximum() - { - return !Maximum.Equals(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultMaximum); - } - /// - /// Replicates the Minimum property of the DataGridViewNumericUpDownCell cell type. + /// Replicates the Minimum property of the DataGridViewNumericUpDownCell cell type. /// - [ - Category("Data"), - Description("Indicates the minimum value for the numeric up-down cells."), - RefreshProperties(RefreshProperties.All) - ] + [Category("Data")] + [Description("Indicates the minimum value for the numeric up-down cells.")] + [RefreshProperties(RefreshProperties.All)] public decimal Minimum { - get { + get + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); return NumericUpDownCellTemplate.Minimum; } - set { + set + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); NumericUpDownCellTemplate.Minimum = value; if (DataGridView != null) { @@ -213,11 +184,9 @@ namespace GradeCalc for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) { DataGridViewRow dataGridViewRow = dataGridViewRows.SharedRow(rowIndex); - DataGridViewNumericUpDownCell dataGridViewCell = dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; - if (dataGridViewCell != null) - { - dataGridViewCell.SetMinimum(rowIndex, value); - } + DataGridViewNumericUpDownCell dataGridViewCell = + dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; + if (dataGridViewCell != null) dataGridViewCell.SetMinimum(rowIndex, value); } DataGridView.InvalidateColumn(Index); // TODO: This column and/or grid rows may need to be autosized depending on their @@ -227,34 +196,26 @@ namespace GradeCalc } } - /// Indicates whether the Maximum property should be persisted. - private bool ShouldSerializeMinimum() - { - return !Minimum.Equals(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultMinimum); - } - /// - /// Replicates the ThousandsSeparator property of the DataGridViewNumericUpDownCell cell type. + /// Replicates the ThousandsSeparator property of the DataGridViewNumericUpDownCell cell type. /// - [ - Category("Data"), - DefaultValue(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultThousandsSeparator), - Description("Indicates whether the thousands separator will be inserted between every three decimal digits.") - ] + [Category("Data")] + [DefaultValue(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultThousandsSeparator)] + [Description("Indicates whether the thousands separator will be inserted between every three decimal digits.")] public bool ThousandsSeparator { - get { + get + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); return NumericUpDownCellTemplate.ThousandsSeparator; } - set { + set + { if (NumericUpDownCellTemplate == null) - { - throw new InvalidOperationException("Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); - } + throw new InvalidOperationException( + "Operation cannot be completed because this DataGridViewColumn does not have a CellTemplate."); NumericUpDownCellTemplate.ThousandsSeparator = value; if (DataGridView != null) { @@ -263,11 +224,9 @@ namespace GradeCalc for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) { DataGridViewRow dataGridViewRow = dataGridViewRows.SharedRow(rowIndex); - DataGridViewNumericUpDownCell dataGridViewCell = dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; - if (dataGridViewCell != null) - { - dataGridViewCell.SetThousandsSeparator(rowIndex, value); - } + DataGridViewNumericUpDownCell dataGridViewCell = + dataGridViewRow.Cells[Index] as DataGridViewNumericUpDownCell; + if (dataGridViewCell != null) dataGridViewCell.SetThousandsSeparator(rowIndex, value); } DataGridView.InvalidateColumn(Index); // TODO: This column and/or grid rows may need to be autosized depending on their @@ -278,17 +237,24 @@ namespace GradeCalc } /// - /// Small utility function that returns the template cell as a DataGridViewNumericUpDownCell + /// Small utility function that returns the template cell as a DataGridViewNumericUpDownCell /// - private DataGridViewNumericUpDownCell NumericUpDownCellTemplate - { - get { - return (DataGridViewNumericUpDownCell)CellTemplate; - } - } + private DataGridViewNumericUpDownCell NumericUpDownCellTemplate => (DataGridViewNumericUpDownCell) CellTemplate; + + /// Indicates whether the Increment property should be persisted. + private bool ShouldSerializeIncrement() => + !Increment.Equals(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultIncrement); + + /// Indicates whether the Maximum property should be persisted. + private bool ShouldSerializeMaximum() => + !Maximum.Equals(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultMaximum); + + /// Indicates whether the Maximum property should be persisted. + private bool ShouldSerializeMinimum() => + !Minimum.Equals(DataGridViewNumericUpDownCell.DATAGRIDVIEWNUMERICUPDOWNCELL_defaultMinimum); /// - /// Returns a standard compact string representation of the column. + /// Returns a standard compact string representation of the column. /// public override string ToString() { diff --git a/GradeCalc/DataGridViewNumericUpDownEditingControl.cs b/GradeCalc/DataGridViewNumericUpDownEditingControl.cs index e571415..cb5188a 100644 --- a/GradeCalc/DataGridViewNumericUpDownEditingControl.cs +++ b/GradeCalc/DataGridViewNumericUpDownEditingControl.cs @@ -1,115 +1,79 @@ using System; using System.Drawing; +using System.Globalization; +using System.Runtime.InteropServices; using System.Windows.Forms; namespace GradeCalc { /// - /// Defines the editing control for the DataGridViewNumericUpDownCell custom cell type. + /// Defines the editing control for the DataGridViewNumericUpDownCell custom cell type. /// internal class DataGridViewNumericUpDownEditingControl : NumericUpDown, IDataGridViewEditingControl { - // Needed to forward keyboard messages to the child TextBox control. - [System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)] - private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); - // The grid that owns this editing control private DataGridView dataGridView; + // Stores the row index in which the editing control resides + // Stores whether the editing control's value has changed or not private bool valueChanged; - // Stores the row index in which the editing control resides - private int rowIndex; - /// - /// Constructor of the editing control class + /// Constructor of the editing control class /// - public DataGridViewNumericUpDownEditingControl() - { - // The editing control must not be part of the tabbing loop - TabStop = false; - } + // The editing control must not be part of the tabbing loop + public DataGridViewNumericUpDownEditingControl() => TabStop = false; // Beginning of the IDataGridViewEditingControl interface implementation /// - /// Property which caches the grid that uses this editing control + /// Property which caches the grid that uses this editing control /// public virtual DataGridView EditingControlDataGridView { - get { - return dataGridView; - } - set { - dataGridView = value; - } + get => dataGridView; + set => dataGridView = value; } /// - /// Property which represents the current formatted value of the editing control + /// Property which represents the current formatted value of the editing control /// public virtual object EditingControlFormattedValue { - get { - return GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting); - } - set { - Text = (string)value; - } + get => GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting); + set => Text = (string) value; } /// - /// Property which represents the row in which the editing control resides + /// Property which represents the row in which the editing control resides /// - public virtual int EditingControlRowIndex - { - get { - return rowIndex; - } - set { - rowIndex = value; - } - } + public virtual int EditingControlRowIndex { get; set; } /// - /// Property which indicates whether the value of the editing control has changed or not + /// Property which indicates whether the value of the editing control has changed or not /// public virtual bool EditingControlValueChanged { - get { - return valueChanged; - } - set { - valueChanged = value; - } + get => valueChanged; + set => valueChanged = value; } /// - /// Property which determines which cursor must be used for the editing panel, - /// i.e. the parent of the editing control. + /// Property which determines which cursor must be used for the editing panel, + /// i.e. the parent of the editing control. /// - public virtual Cursor EditingPanelCursor - { - get { - return Cursors.Default; - } - } + public virtual Cursor EditingPanelCursor => Cursors.Default; /// - /// Property which indicates whether the editing control needs to be repositioned - /// when its value changes. + /// Property which indicates whether the editing control needs to be repositioned + /// when its value changes. /// - public virtual bool RepositionEditingControlOnValueChange - { - get { - return false; - } - } + public virtual bool RepositionEditingControlOnValueChange => false; /// - /// Method called by the grid before the editing control is shown so it can adapt to the - /// provided cell style. + /// Method called by the grid before the editing control is shown so it can adapt to the + /// provided cell style. /// public virtual void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) { @@ -130,8 +94,8 @@ namespace GradeCalc } /// - /// Method called by the grid on keystrokes to determine if the editing control is - /// interested in the key or not. + /// Method called by the grid on keystrokes to determine if the editing control is + /// interested in the key or not. /// public virtual bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey) { @@ -141,15 +105,13 @@ namespace GradeCalc { TextBox textBox = Controls[1] as TextBox; if (textBox != null) - { // If the end of the selection is at the end of the string, // let the DataGridView treat the key message - if (RightToLeft == RightToLeft.No && !(textBox.SelectionLength == 0 && textBox.SelectionStart == textBox.Text.Length) || - RightToLeft == RightToLeft.Yes && !(textBox.SelectionLength == 0 && textBox.SelectionStart == 0)) - { + if ((RightToLeft == RightToLeft.No && + !(textBox.SelectionLength == 0 && textBox.SelectionStart == textBox.Text.Length)) || + (RightToLeft == RightToLeft.Yes && + !(textBox.SelectionLength == 0 && textBox.SelectionStart == 0))) return true; - } - } break; } @@ -157,35 +119,27 @@ namespace GradeCalc { TextBox textBox = Controls[1] as TextBox; if (textBox != null) - { // If the end of the selection is at the begining of the string // or if the entire text is selected and we did not start editing, // send this character to the dataGridView, else process the key message - if (RightToLeft == RightToLeft.No && !(textBox.SelectionLength == 0 && textBox.SelectionStart == 0) || - RightToLeft == RightToLeft.Yes && !(textBox.SelectionLength == 0 && textBox.SelectionStart == textBox.Text.Length)) - { + if ((RightToLeft == RightToLeft.No && + !(textBox.SelectionLength == 0 && textBox.SelectionStart == 0)) || + (RightToLeft == RightToLeft.Yes && + !(textBox.SelectionLength == 0 && textBox.SelectionStart == textBox.Text.Length))) return true; - } - } break; } case Keys.Down: // If the current value hasn't reached its minimum yet, handle the key. Otherwise let // the grid handle it. - if (Value > Minimum) - { - return true; - } + if (Value > Minimum) return true; break; case Keys.Up: // If the current value hasn't reached its maximum yet, handle the key. Otherwise let // the grid handle it. - if (Value < Maximum) - { - return true; - } + if (Value < Maximum) return true; break; case Keys.Home: @@ -194,12 +148,8 @@ namespace GradeCalc // Let the grid handle the key if the entire text is selected. TextBox textBox = Controls[1] as TextBox; if (textBox != null) - { if (textBox.SelectionLength != textBox.Text.Length) - { return true; - } - } break; } @@ -208,13 +158,9 @@ namespace GradeCalc // Let the grid handle the key if the carret is at the end of the text. TextBox textBox = Controls[1] as TextBox; if (textBox != null) - { if (textBox.SelectionLength > 0 || textBox.SelectionStart < textBox.Text.Length) - { return true; - } - } break; } } @@ -222,7 +168,7 @@ namespace GradeCalc } /// - /// Returns the current value of the editing control. + /// Returns the current value of the editing control. /// public virtual object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) { @@ -231,7 +177,7 @@ namespace GradeCalc { // Prevent the Value from being set to Maximum or Minimum when the cell is being painted. UserEdit = (context & DataGridViewDataErrorContexts.Display) == 0; - return Value.ToString((ThousandsSeparator ? "N" : "F") + DecimalPlaces.ToString()); + return Value.ToString((ThousandsSeparator ? "N" : "F") + DecimalPlaces); } finally { @@ -240,8 +186,8 @@ namespace GradeCalc } /// - /// Called by the grid to give the editing control a chance to prepare itself for - /// the editing session. + /// Called by the grid to give the editing control a chance to prepare itself for + /// the editing session. /// public virtual void PrepareEditingControlForEdit(bool selectAll) { @@ -249,23 +195,23 @@ namespace GradeCalc if (textBox != null) { if (selectAll) - { textBox.SelectAll(); - } else - { // Do not select all the text, but // position the caret at the end of the text textBox.SelectionStart = textBox.Text.Length; - } } } + // Needed to forward keyboard messages to the child TextBox control. + [DllImport("USER32.DLL", CharSet = CharSet.Auto)] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + // End of the IDataGridViewEditingControl interface implementation /// - /// Small utility function that updates the local dirty state and - /// notifies the grid of the value change. + /// Small utility function that updates the local dirty state and + /// notifies the grid of the value change. /// private void NotifyDataGridViewOfValueChange() { @@ -277,8 +223,8 @@ namespace GradeCalc } /// - /// Listen to the KeyPress notification to know when the value changed, and - /// notify the grid of the change. + /// Listen to the KeyPress notification to know when the value changed, and + /// notify the grid of the change. /// protected override void OnKeyPress(KeyPressEventArgs e) { @@ -293,47 +239,37 @@ namespace GradeCalc } else { - System.Globalization.NumberFormatInfo numberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat; + NumberFormatInfo numberFormatInfo = CultureInfo.CurrentCulture.NumberFormat; string decimalSeparatorStr = numberFormatInfo.NumberDecimalSeparator; string groupSeparatorStr = numberFormatInfo.NumberGroupSeparator; string negativeSignStr = numberFormatInfo.NegativeSign; if (!string.IsNullOrEmpty(decimalSeparatorStr) && decimalSeparatorStr.Length == 1) - { notifyValueChange = decimalSeparatorStr[0] == e.KeyChar; - } if (!notifyValueChange && !string.IsNullOrEmpty(groupSeparatorStr) && groupSeparatorStr.Length == 1) - { notifyValueChange = groupSeparatorStr[0] == e.KeyChar; - } if (!notifyValueChange && !string.IsNullOrEmpty(negativeSignStr) && negativeSignStr.Length == 1) - { notifyValueChange = negativeSignStr[0] == e.KeyChar; - } } if (notifyValueChange) - { // Let the DataGridView know about the value change NotifyDataGridViewOfValueChange(); - } } /// - /// Listen to the ValueChanged notification to forward the change to the grid. + /// Listen to the ValueChanged notification to forward the change to the grid. /// protected override void OnValueChanged(EventArgs e) { base.OnValueChanged(e); if (Focused) - { // Let the DataGridView know about the value change NotifyDataGridViewOfValueChange(); - } } /// - /// A few keyboard messages need to be forwarded to the inner textbox of the - /// NumericUpDown control so that the first character pressed appears in it. + /// A few keyboard messages need to be forwarded to the inner textbox of the + /// NumericUpDown control so that the first character pressed appears in it. /// protected override bool ProcessKeyEventArgs(ref Message m) { @@ -343,10 +279,7 @@ namespace GradeCalc SendMessage(textBox.Handle, m.Msg, m.WParam, m.LParam); return true; } - else - { - return base.ProcessKeyEventArgs(ref m); - } + return base.ProcessKeyEventArgs(ref m); } } } \ No newline at end of file diff --git a/GradeCalc/GradeCalc.csproj b/GradeCalc/GradeCalc.csproj index 0045321..4f7307b 100644 --- a/GradeCalc/GradeCalc.csproj +++ b/GradeCalc/GradeCalc.csproj @@ -58,8 +58,9 @@ ..\packages\Antlr4.Runtime.4.6.6\lib\net45\Antlr4.Runtime.dll - - ..\packages\EPPlus.4.5.3.2\lib\net40\EPPlus.dll + + ..\packages\EPPlus.4.5.3.3\lib\net40\EPPlus.dll + True ..\packages\NCalc2.2.1.0\lib\net46\NCalc2.dll diff --git a/GradeCalc/MainForm.cs b/GradeCalc/MainForm.cs index 6833be1..46dbe4f 100644 --- a/GradeCalc/MainForm.cs +++ b/GradeCalc/MainForm.cs @@ -1,21 +1,23 @@ -using NCalc2; -using System; +using System; using System.Collections.Generic; using System.ComponentModel; +using System.Drawing; +using System.IO; using System.Linq; using System.Windows.Forms; +using NCalc2; using OfficeOpenXml; -using System.IO; -using System.Drawing; using OfficeOpenXml.Style; namespace GradeCalc { public partial class MainForm : Form { - private List taskColumns = new List(); - private DataGridViewTextBoxColumn nameColumn; - private DataGridViewTextBoxColumn gradeColumn; + private readonly DataGridViewTextBoxColumn gradeColumn; + private readonly DataGridViewTextBoxColumn nameColumn; + + private readonly List + taskColumns = new List(); public MainForm() { @@ -32,15 +34,17 @@ namespace GradeCalc tasksNum_ValueChanged(null, null); } - int round(double val) => (int)Math.Round(val); - Color getColor(double x, double max) => Color.FromArgb(round(255 * (1 - (x / max))), round(255 * (x / max)), 0); + private int round(double val) => (int) Math.Round(val); + + private Color getColor(double x, double max) => + Color.FromArgb(round(255 * (1 - (x / max))), round(255 * (x / max)), 0); private void calcButton_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in dataGridView.Rows) { row.Cells[nameColumn.Name].Style.BackColor = Color.White; - DataGridViewTextBoxCell gradeCell = (DataGridViewTextBoxCell)row.Cells[gradeColumn.Name]; + DataGridViewTextBoxCell gradeCell = (DataGridViewTextBoxCell) row.Cells[gradeColumn.Name]; try { Expression ex = new Expression(algorithmBox.Text); @@ -48,20 +52,21 @@ namespace GradeCalc decimal totalScore = 0; taskColumns.ForEach(s => { - DataGridViewNumericUpDownCell cell = (DataGridViewNumericUpDownCell)row.Cells[s.Name]; - if (!string.IsNullOrWhiteSpace((string)cell.FormattedValue)) + DataGridViewNumericUpDownCell cell = (DataGridViewNumericUpDownCell) row.Cells[s.Name]; + if (!string.IsNullOrWhiteSpace((string) cell.FormattedValue)) { maxScore += cell.Maximum; - totalScore += decimal.Parse((string)cell.FormattedValue); - ex.Parameters["score"] = decimal.Parse((string)cell.FormattedValue); + totalScore += decimal.Parse((string) cell.FormattedValue); + ex.Parameters["score"] = decimal.Parse((string) cell.FormattedValue); ex.Parameters["maxScore"] = cell.Maximum; - cell.Style.BackColor = getColor((float)NCalcDoubleParser.Parse(ex.Evaluate()), 1); + cell.Style.BackColor = getColor((float) NCalcDoubleParser.Parse(ex.Evaluate()), 1); } }); - ex.Parameters["score"] = (double)totalScore; - ex.Parameters["maxScore"] = (double)maxScore; + ex.Parameters["score"] = (double) totalScore; + ex.Parameters["maxScore"] = (double) maxScore; double grade = 6 - (NCalcDoubleParser.Parse(ex.Evaluate()) * 5); - gradeCell.Value = (grade.ToString().Length > 13 ? grade.ToString().Remove(13) : grade.ToString()) + " " + texGrade(grade); + gradeCell.Value = (grade.ToString().Length > 13 ? grade.ToString().Remove(13) : grade.ToString()) + + " " + texGrade(grade); gradeCell.Style.BackColor = getColor(grade - 1, 5); } catch (Exception e1) @@ -86,7 +91,7 @@ namespace GradeCalc DataGridViewNumericUpDownColumn clm = new DataGridViewNumericUpDownColumn(); clm.Minimum = 0; clm.Maximum = 10; - clm.Name = "Task " + (taskColumns.Count + 1).ToString(); + clm.Name = "Task " + (taskColumns.Count + 1); dataGridView.Columns.Add(clm); taskColumns.Add(clm); } @@ -95,8 +100,9 @@ namespace GradeCalc private string texGrade(double g) { - double gGrade = (new double[] { -0.5, 0, 0.5 }).OrderBy(x => Math.Abs(x - (g - round(g)) + 1)).First(); - return ((char)('A' + round(g) - 1)).ToString() + ((g == 1 || gGrade == -0.5) ? "+" : (g == 6 || gGrade == 0.5) ? "-" : ""); + double gGrade = new[] {-0.5, 0, 0.5}.OrderBy(x => Math.Abs((x - (g - round(g))) + 1)).First(); + return (char) (('A' + round(g)) - 1) + + (g == 1 || gGrade == -0.5 ? "+" : g == 6 || gGrade == 0.5 ? "-" : ""); } private void saveButton_Click(object sender, EventArgs e) @@ -106,11 +112,10 @@ namespace GradeCalc Filter = "Excel Spreadsheet|*.xlst" }; if (dialog.ShowDialog() == DialogResult.OK) - { using (ExcelPackage excel = new ExcelPackage()) { ExcelWorksheet worksheet = excel.Workbook.Worksheets.Add("Worksheet1"); - List headerRow = new List() + List headerRow = new List { dataGridView.Columns.OfType().Select(s => s.HeaderText).ToArray() }; @@ -130,13 +135,14 @@ namespace GradeCalc foreach (DataGridViewCell cell in s.Cells) { worksheet.Cells[cell.RowIndex + 2, cell.ColumnIndex + 1].Value = cell.Value.ToString(); - worksheet.Cells[cell.RowIndex + 2, cell.ColumnIndex + 1].Style.Fill.PatternType = ExcelFillStyle.Solid; - worksheet.Cells[cell.RowIndex + 2, cell.ColumnIndex + 1].Style.Fill.BackgroundColor.SetColor(cell.Style.BackColor); + worksheet.Cells[cell.RowIndex + 2, cell.ColumnIndex + 1].Style.Fill.PatternType = + ExcelFillStyle.Solid; + worksheet.Cells[cell.RowIndex + 2, cell.ColumnIndex + 1].Style.Fill.BackgroundColor + .SetColor(cell.Style.BackColor); } }); excel.SaveAs(new FileInfo(dialog.FileName)); } - } } } -} +} \ No newline at end of file diff --git a/GradeCalc/NCalcDoubleParser.cs b/GradeCalc/NCalcDoubleParser.cs index e66568d..0c416d9 100644 --- a/GradeCalc/NCalcDoubleParser.cs +++ b/GradeCalc/NCalcDoubleParser.cs @@ -1,40 +1,36 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace GradeCalc { - static class NCalcDoubleParser + internal static class NCalcDoubleParser { public static double Parse(object NCalcOutput) { if (NCalcOutput.GetType() == typeof(bool)) - return (bool)NCalcOutput ? 1 : 0; - else if (NCalcOutput.GetType() == typeof(byte)) - return (byte)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(sbyte)) - return (sbyte)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(short)) - return (short)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(ushort)) - return (ushort)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(int)) - return (int)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(uint)) - return (uint)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(long)) - return (long)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(ulong)) - return (ulong)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(float)) - return (float)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(double)) - return (double)NCalcOutput; - else if (NCalcOutput.GetType() == typeof(decimal)) - return (double)(decimal)NCalcOutput; - throw new ArgumentException("Type mismatch! (" + NCalcOutput.GetType().ToString() + ")"); + return (bool) NCalcOutput ? 1 : 0; + if (NCalcOutput.GetType() == typeof(byte)) + return (byte) NCalcOutput; + if (NCalcOutput.GetType() == typeof(sbyte)) + return (sbyte) NCalcOutput; + if (NCalcOutput.GetType() == typeof(short)) + return (short) NCalcOutput; + if (NCalcOutput.GetType() == typeof(ushort)) + return (ushort) NCalcOutput; + if (NCalcOutput.GetType() == typeof(int)) + return (int) NCalcOutput; + if (NCalcOutput.GetType() == typeof(uint)) + return (uint) NCalcOutput; + if (NCalcOutput.GetType() == typeof(long)) + return (long) NCalcOutput; + if (NCalcOutput.GetType() == typeof(ulong)) + return (ulong) NCalcOutput; + if (NCalcOutput.GetType() == typeof(float)) + return (float) NCalcOutput; + if (NCalcOutput.GetType() == typeof(double)) + return (double) NCalcOutput; + if (NCalcOutput.GetType() == typeof(decimal)) + return (double) (decimal) NCalcOutput; + throw new ArgumentException("Type mismatch! (" + NCalcOutput.GetType() + ")"); } } -} +} \ No newline at end of file diff --git a/GradeCalc/packages.config b/GradeCalc/packages.config index ca00a74..0351597 100644 --- a/GradeCalc/packages.config +++ b/GradeCalc/packages.config @@ -3,7 +3,7 @@ - +