In a recent [CodeReview](https://codereview.stackexchange.com/questions/96012/product-manager-managing-product-listings-and-prices) I presented a Product Manager that manages product listings and prices. Based on the great feedback I have refactored the mentioned Prompt and validator class and want feedback about the code and naming.

**Utilities/ProductValidator.cs**

    namespace Ferienaufgabe_2.Utilities
    {
    class ProductValidator
    {
        public bool IsValidPriceFormat(string value)
        {
            decimal result;
            return (decimal.TryParse(value, out result) && result >= 0 );
        }
    }
    }


**View/PriceDialog.cs**

    using Ferienaufgabe_2.Utilities;
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace Ferienaufgabe_2.View
    {
    class PriceDialog
    {
        private ProductValidator ProductValidator { get; set; }
        private Form DialogBox { get; set; }
        private Label TextLabel { get; set; }
        private TextBox InputBox { get; set; }
        private Button ButtonConfirmation { get; set; }

        private const string DefaultTextInputBox = "z.B.: 10,00";
        private const string MessageInvalidPriceFormat = "Ungültige Preiseingabe! Z.B.: 10,00";
        private const string TextOfLabel = "Preis:";
        private const string TextOfConfirmButton = "Prozess abschliessen";

        public PriceDialog()
        {
            this.InitializeComponent();
            this.DesignComponent();
            this.AddEventsToComponent();
            this.AddComponentToDialog();
        }

        private void InitializeComponent()
        {
            this.ProductValidator = new ProductValidator();
            this.DialogBox = new Form();
            this.TextLabel = new Label();
            this.InputBox = new TextBox();
            this.ButtonConfirmation = new Button();
        }

        private void DesignComponent()
        {
            this.DialogBox.Width = 300;
            this.DialogBox.Height = 120;
            this.DialogBox.StartPosition = FormStartPosition.CenterParent;
            this.DialogBox.FormBorderStyle = FormBorderStyle.None;

            this.TextLabel.Location = new Point(110, 15);
            this.TextLabel.Text = TextOfLabel;
            this.TextLabel.Font = new Font("Arial", 18);

            this.InputBox.Location = new Point(40, (this.TextLabel.Location.Y + this.TextLabel.Height + 10));
            this.InputBox.Width = 205;
            this.InputBox.Text = DefaultTextInputBox;
            this.InputBox.ForeColor = Color.Gray;

            this.ButtonConfirmation.Location = new Point(40, (this.InputBox.Location.Y + this.InputBox.Height + 10));
            this.ButtonConfirmation.Width = InputBox.Width;
            this.ButtonConfirmation.Text = TextOfConfirmButton;
        }

        private void AddEventsToComponent()
        {
            this.InputBox.KeyUp += (sender, e) => {
                if (e.KeyCode == Keys.Enter && this.ProductValidator.IsValidPriceFormat(this.InputBox.Text))
                {
                    this.DialogBox.Close();
                }
                else if (e.KeyCode == Keys.Enter)
                {
                    this.TextLabel.Focus(); // Otherwise MessageBox cannot be canceled via {enter}
                    MessageBox.Show(MessageInvalidPriceFormat);
                }
            };

            this.ButtonConfirmation.Click += (sender, e) => {
                if (this.ProductValidator.IsValidPriceFormat(InputBox.Text))
                {
                    this.DialogBox.Close();
                }
                else
                {
                    this.TextLabel.Focus(); // Otherwise MessageBox cannot be canceled via {enter}
                    MessageBox.Show(MessageInvalidPriceFormat);
                }
            };

            this.InputBox.GotFocus += (sender, e) =>
            {
                if (this.InputBox.Text == DefaultTextInputBox)
                {
                    this.InputBox.Text = "";
                    this.InputBox.ForeColor = Color.Black;
                }
            };
            this.InputBox.LostFocus += (sender, e) =>
            {
                if (this.InputBox.Text.Trim().Length == 0)
                {
                    this.InputBox.Text = DefaultTextInputBox;
                    this.InputBox.ForeColor = Color.Gray;
                }
            };
        }

        private void AddComponentToDialog()
        {
            this.DialogBox.Controls.Add(this.TextLabel);
            this.DialogBox.Controls.Add(this.InputBox);
            this.DialogBox.Controls.Add(this.ButtonConfirmation);
        }

        public decimal Show()
        {
            this.DialogBox.ShowDialog();
            // This goes well anytime due to a check in the dispose actions.
            return Convert.ToDecimal(this.InputBox.Text);
        }
    }
    }