diff --git a/C968Project/Views/AddModifyProductScreen.Designer.cs b/C968Project/Views/AddModifyProductScreen.Designer.cs index 40b488b..6379c07 100644 --- a/C968Project/Views/AddModifyProductScreen.Designer.cs +++ b/C968Project/Views/AddModifyProductScreen.Designer.cs @@ -28,6 +28,7 @@ /// private void InitializeComponent() { + components = new System.ComponentModel.Container(); screenLabel = new Label(); idLabel = new Label(); idTextBox = new TextBox(); @@ -51,8 +52,10 @@ deleteButton = new Button(); cancelButton = new Button(); saveButton = new Button(); + errorProvider1 = new ErrorProvider(components); ((System.ComponentModel.ISupportInitialize)allPartsDataGridView).BeginInit(); ((System.ComponentModel.ISupportInitialize)associatedPartsDataGridView).BeginInit(); + ((System.ComponentModel.ISupportInitialize)errorProvider1).BeginInit(); SuspendLayout(); // // screenLabel @@ -97,6 +100,7 @@ nameTextBox.Name = "nameTextBox"; nameTextBox.Size = new Size(153, 23); nameTextBox.TabIndex = 5; + nameTextBox.TextChanged += nameTextBox_TextChanged; // // label2 // @@ -113,6 +117,7 @@ inventoryTextBox.Name = "inventoryTextBox"; inventoryTextBox.Size = new Size(153, 23); inventoryTextBox.TabIndex = 7; + inventoryTextBox.TextChanged += inventoryTextBox_TextChanged; // // label3 // @@ -129,6 +134,7 @@ priceTextBox.Name = "priceTextBox"; priceTextBox.Size = new Size(153, 23); priceTextBox.TabIndex = 9; + priceTextBox.TextChanged += priceTextBox_TextChanged; // // label7 // @@ -145,6 +151,7 @@ minTextBox.Name = "minTextBox"; minTextBox.Size = new Size(69, 23); minTextBox.TabIndex = 18; + minTextBox.TextChanged += minTextBox_TextChanged; // // label6 // @@ -161,6 +168,7 @@ maxTextBox.Name = "maxTextBox"; maxTextBox.Size = new Size(69, 23); maxTextBox.TabIndex = 16; + maxTextBox.TextChanged += maxTextBox_TextChanged; // // searchButton // @@ -252,6 +260,10 @@ saveButton.UseVisualStyleBackColor = true; saveButton.Click += saveButton_Click; // + // errorProvider1 + // + errorProvider1.ContainerControl = this; + // // AddModifyProductScreen // AutoScaleDimensions = new SizeF(7F, 15F); @@ -286,6 +298,7 @@ Text = "Product"; ((System.ComponentModel.ISupportInitialize)allPartsDataGridView).EndInit(); ((System.ComponentModel.ISupportInitialize)associatedPartsDataGridView).EndInit(); + ((System.ComponentModel.ISupportInitialize)errorProvider1).EndInit(); ResumeLayout(false); PerformLayout(); } @@ -315,5 +328,6 @@ private Button deleteButton; private Button cancelButton; private Button saveButton; + private ErrorProvider errorProvider1; } } \ No newline at end of file diff --git a/C968Project/Views/AddModifyProductScreen.cs b/C968Project/Views/AddModifyProductScreen.cs index 395de4d..e06a0d2 100644 --- a/C968Project/Views/AddModifyProductScreen.cs +++ b/C968Project/Views/AddModifyProductScreen.cs @@ -15,6 +15,15 @@ namespace C968Project.Views private ScreenOption _screenOption; private Product? _currentProduct; + private bool _isNameValid = false; + private bool _isInventoryValid = false; + private bool _isPriceValid = false; + private bool _isMinValid = false; + private bool _isMaxValid = false; + + private int _validatedMin = 0; + private int _validatedMax = 0; + public AddModifyProductScreen(ScreenOption screenOption, Product? product = null) { @@ -35,6 +44,8 @@ namespace C968Project.Views } allPartsDataGridView.DataSource = Program.Inventory.Parts; + + ValidateInputs(); } private void PopulateProductData(Product product) @@ -106,16 +117,19 @@ namespace C968Project.Views private void saveButton_Click(object sender, EventArgs e) { - if (_screenOption is ScreenOption.ADD) + if (ValidateInputs()) { - AddProduct(); - Close(); - } + if (_screenOption is ScreenOption.ADD) + { + AddProduct(); + Close(); + } - if (_screenOption is ScreenOption.MODIFY) - { - ModifyProduct(); - Close(); + if (_screenOption is ScreenOption.MODIFY) + { + ModifyProduct(); + Close(); + } } } @@ -135,7 +149,7 @@ namespace C968Project.Views Part part = Program.Inventory.LookupPart(allPartsDataGridView.CurrentCell.RowIndex); if (part is null) return; - + if (_currentProduct.AssociatedParts.Contains(part)) { @@ -154,6 +168,7 @@ namespace C968Project.Views return; } + if (!Helpers.ConfirmDelete()) return; Part part = _currentProduct.LookupAssociatedPart(associatedPartsDataGridView.CurrentCell.RowIndex); if (part is null || !_currentProduct.AssociatedParts.Contains(part)) @@ -164,5 +179,152 @@ namespace C968Project.Views _currentProduct.RemoveAssociatedPart(_currentProduct.AssociatedParts.IndexOf(part)); } + + private void nameTextBox_TextChanged(object sender, EventArgs e) + { + ValidateName(); + } + + private void ValidateName() + { + if (nameTextBox.Text == string.Empty) + { + errorProvider1.SetError(nameTextBox, "Please enter a product name"); + _isNameValid = false; + } + else + { + errorProvider1.SetError(nameTextBox, ""); + _isNameValid = true; + } + + Helpers.SetTextBoxValidationState(nameTextBox, _isNameValid); + } + + private void inventoryTextBox_TextChanged(object sender, EventArgs e) + { + ValidateInventory(); + } + + private void ValidateInventory() + { + int inventory = 0; + + if (inventoryTextBox.Text != string.Empty && int.TryParse(inventoryTextBox.Text, out inventory)) + { + if (_isMinValid && _isMaxValid) + { + if (inventory > _validatedMax) + { + errorProvider1.SetError(inventoryTextBox, $"Must be less than Max: {_validatedMax}"); + _isInventoryValid = false; + } + else if (inventory < _validatedMin) + { + errorProvider1.SetError(inventoryTextBox, $"Must be greater than Min: {_validatedMin}"); + _isInventoryValid = false; + } + else + { + errorProvider1.SetError(inventoryTextBox, ""); + _isInventoryValid = true; + } + } + else + { + errorProvider1.SetError(inventoryTextBox, $"Min and Max values must be set"); + _isInventoryValid = false; + } + } + else + { + _isInventoryValid = false; + errorProvider1.SetError(inventoryTextBox, "Field must contain an integer value"); + } + + Helpers.SetTextBoxValidationState(inventoryTextBox, _isInventoryValid); + } + + private void priceTextBox_TextChanged(object sender, EventArgs e) + { + ValidatePrice(); + } + + private void ValidatePrice() + { + float price = 0f; + + if (priceTextBox.Text != string.Empty && float.TryParse(priceTextBox.Text, out price)) + { + _isPriceValid = true; + errorProvider1.SetError(priceTextBox, ""); + } + else + { + _isPriceValid = false; + errorProvider1.SetError(priceTextBox, "Field must contain a floating point number"); + } + + Helpers.SetTextBoxValidationState(priceTextBox, _isPriceValid); + } + + private void maxTextBox_TextChanged(object sender, EventArgs e) + { + ValidateMax(); + } + + private void ValidateMax() + { + int max = 0; + if (maxTextBox.Text != string.Empty && int.TryParse(maxTextBox.Text, out max)) + { + _isMaxValid = true; + errorProvider1.SetError(maxTextBox, ""); + _validatedMax = max; + } + else + { + _isMaxValid = false; + errorProvider1.SetError(maxTextBox, "Field must contain an integer value"); + } + + ValidateInventory(); + Helpers.SetTextBoxValidationState(maxTextBox, _isMaxValid); + } + + private void minTextBox_TextChanged(object sender, EventArgs e) + { + ValidateMin(); + } + + private void ValidateMin() + { + int min = 0; + if (minTextBox.Text != string.Empty && int.TryParse(minTextBox.Text, out min)) + { + _isMinValid = true; + errorProvider1.SetError(minTextBox, ""); + _validatedMin = min; + } + else + { + _isMinValid = false; + errorProvider1.SetError(minTextBox, "Field must contain an integer value"); + } + + ValidateInventory(); + Helpers.SetTextBoxValidationState(minTextBox, _isMinValid); + } + + private bool ValidateInputs() + { + ValidateName(); + ValidateInventory(); + ValidatePrice(); + ValidateMin(); + ValidateMax(); + + return _isNameValid && _isInventoryValid && _isPriceValid && _isMinValid && _isMaxValid; + } } } diff --git a/C968Project/Views/AddModifyProductScreen.resx b/C968Project/Views/AddModifyProductScreen.resx index 42d55f9..6bcea65 100644 --- a/C968Project/Views/AddModifyProductScreen.resx +++ b/C968Project/Views/AddModifyProductScreen.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + True