C # Winforms: Есть ли способ улучшить этот простой пользовательский код Textbox? - PullRequest
1 голос
/ 20 декабря 2011

Я работал над пользовательским элементом управления TextBox, который допускает только буквенно-цифровые символы. Обратите внимание, что у меня нет ограниченных символов из KeyPress, события KeyUp, так как я не хочу ограничивать копирование / вставку или любые другие операции, которые должны быть разрешены вообще. Я только обрезал не буквенно-цифровой символ на операции вставки. Тем не менее, я не уверен, хорош или плох написанный мною код, поскольку у меня очень мало опыта работы с настольными приложениями.

using System;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace SaintThomas.UserControls
{
    class TextBoxForUserName : TextBox
    {
        protected override void OnTextChanged(EventArgs e)
        {
            base.OnTextChanged(e);

            this.SuspendLayout();
            int startPos = this.SelectionStart;
            if (Regex.IsMatch(this.Text, "[^0-9_A-Z]", RegexOptions.IgnoreCase))
            {
                int reduceStartPos = this.Text.Length;
                this.Text = Regex.Replace(this.Text, "[^0-9_A-Z]", "", RegexOptions.IgnoreCase);
                startPos = (startPos <= 0) ? 0 : startPos - (reduceStartPos - this.Text.Length);
                if (this.Text.Length < startPos)
                {
                    startPos = this.Text.Length;
                }
                this.SelectionStart = startPos;
            }
            this.ResumeLayout();
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

Лучший способ сделать это - использовать MaskedTextBox элемент управления .

Нет причин заново изобретать колесо, когда вам не нужно это делать.

0 голосов
/ 20 декабря 2011

На первый взгляд, первое if условие кажется совершенно ненужным, потому что если вы пропустите его, код сделает то же самое.

...