В C# обязанности и достижения: есть ли способ улучшить этот простой пользовательский текстовое поле Код?


Я работаю на пользовательский элемент управления TextBox, который позволяет только буквенно-цифровые символы. Обратите внимание, что я не ограничен персонажей из нажатие, события 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();
    }
    }
}


1632
2
задан 20 декабря 2011 в 10:12 Источник Поделиться
Комментарии
2 ответа
1
ответ дан 20 декабря 2011 в 01:12 Источник Поделиться

Помимо вопросов, отступы...


  • Вы могли бы просто использовать @"\W"и для вашего регулярного выражения (с Поиск.Нет).

  • Простой способ борьбы с помощью курсора измерить расстояние от конца строки, так как вы можете знать, что будет оставаться постоянным.

  • Используя Регулярное Выражение.Матч следовал по регулярному выражению.Замените кажется бессмысленным для меня. Если строка не должны быть изменены, тестирую.Замену должны быть в состоянии определить, что быстро.

  • Звонки на SuspendLayout также представляется излишним, поскольку макет вашего контроля (т. е., его границы, позиции) не меняется.

    protected override void OnTextChanged(EventArgs e) {
    base.OnTextChanged(e);
    int charsFromEnd = this.Text.Length - this.SelectionStart;
    this.Text = Regex.Replace(this.Text, @"\W", "", RegexOptions.None);
    this.SelectionStart = this.Text.Length - charsFromEnd;
    }

1
ответ дан 24 декабря 2011 в 12:12 Источник Поделиться