File: System\Windows\Forms\Design\MaskedTextBoxTextEditorDropDown.cs
Web Access
Project: src\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
namespace System.Windows.Forms.Design;
 
internal class MaskedTextBoxTextEditorDropDown : UserControl
{
    private bool _cancel;
    private readonly MaskedTextBox _cloneMtb;
    private readonly ErrorProvider _errorProvider;
 
    public MaskedTextBoxTextEditorDropDown(MaskedTextBox maskedTextBox)
    {
        _cloneMtb = MaskedTextBoxDesigner.GetDesignMaskedTextBox(maskedTextBox);
        _errorProvider = new ErrorProvider();
        ((System.ComponentModel.ISupportInitialize)(_errorProvider)).BeginInit();
 
        SuspendLayout();
        //
        // maskedTextBox
        //
        _cloneMtb.Dock = DockStyle.Fill;
 
        // Include prompt and literals always so editor can process the text value in a consistent way.
        _cloneMtb.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
 
        // Escape prompt, literals and space so input is not rejected due to one of these characters.
        _cloneMtb.ResetOnPrompt = true;
        _cloneMtb.SkipLiterals = true;
        _cloneMtb.ResetOnSpace = true;
 
        _cloneMtb.Name = "MaskedTextBoxClone";
        _cloneMtb.TabIndex = 0;
        _cloneMtb.MaskInputRejected += maskedTextBox_MaskInputRejected;
        _cloneMtb.KeyDown += maskedTextBox_KeyDown;
 
        //
        // errorProvider
        //
        _errorProvider.BlinkStyle = ErrorBlinkStyle.NeverBlink;
        _errorProvider.ContainerControl = this;
 
        //
        // MaskedTextBoxTextEditorDropDown
        //
        Controls.Add(_cloneMtb);
 
        BackColor = Drawing.SystemColors.Control;
        BorderStyle = BorderStyle.FixedSingle;
        Name = "MaskedTextBoxTextEditorDropDown";
        Padding = new Padding(16);
        Size = new Drawing.Size(100, 52);
        ((System.ComponentModel.ISupportInitialize)(_errorProvider)).EndInit();
        ResumeLayout(false);
        PerformLayout();
    }
 
    public string Value
    {
        get
        {
            if (_cancel)
            {
                return null;
            }
 
            // Output will include prompt and literals always to be able to get the characters at the right positions in case
            // some of them are not set (particularly at lower positions).
            return _cloneMtb.Text;
        }
    }
 
    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Escape)
        {
            _cancel = true;
        }
 
        return base.ProcessDialogKey(keyData);
    }
 
    private void maskedTextBox_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
    {
        _errorProvider.SetError(_cloneMtb, MaskedTextBoxDesigner.GetMaskInputRejectedErrorMessage(e));
    }
 
    private void maskedTextBox_KeyDown(object sender, KeyEventArgs e)
    {
        _errorProvider.Clear();
    }
}