Почему я не могу оставить TextBox, используя вкладку? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть этот код:

public static void AddDefaultTextFromTag(params TextBox[] textBoxes)
{
    foreach (TextBox oTextBox in textBoxes)
    {
        bool isPasswordChar = oTextBox.UseSystemPasswordChar;

        oTextBox.Enter += (sndr, evnt) =>
        {
            if (((TextBox)sndr).Text == ((TextBox)sndr).Tag.ToString())
            {
                ((TextBox)sndr).Text = "";
                ((TextBox)sndr).UseSystemPasswordChar = isPasswordChar;
                ((TextBox)sndr).ForeColor = SystemColors.WindowText;
            }
        };

        oTextBox.Leave += (sndr, evnt) =>
        {
            if (((TextBox)sndr).Text.Trim().Count() == 0)
            {
                ((TextBox)sndr).UseSystemPasswordChar = false;
                ((TextBox)sndr).CharacterCasing = CharacterCasing.Normal;
                ((TextBox)sndr).Text = ((TextBox)sndr).Tag.ToString();
                ((TextBox)sndr).ForeColor = SystemColors.GrayText;
            }
        };

        if (oTextBox.Text.Trim().Count() == 0)
        {
            oTextBox.UseSystemPasswordChar = false;
            oTextBox.CharacterCasing = CharacterCasing.Normal;
            oTextBox.Text = oTextBox.Tag.ToString();
            oTextBox.ForeColor = SystemColors.GrayText;
        }
    }
}

Но когда TextBox.UseSystemPasswordChar I, введенный в параметре этого метода, имеет значение true, а его свойство TextBox.Text пусто, TextBox не может выйти, используяКнопка Tab на клавиатуре, только MouseClick может использоваться, чтобы потерять фокус этого TextBox.

Почему это происходит?

Мой код находится в C #, framework4, сборка в VS2010 Pro, проект в WinForms.Я использую TextBox из VS ToolBox.

Пожалуйста, помогите.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 августа 2015

Причина, по которой вы не можете покинуть текстовое поле, заключается в том, что вы изменяете свойство CharacterCasing в текстовом поле.

Не уверен, почему это работает так, но со мной это случалось раньше, в итоге я захватил событие нажатия клавиши, и если бы это была буква, я бы переключил его на значение в верхнем регистре. Это не оптимально, но работает

Я сделал что-то похожее на это (записал это от макушки головы, но это должно работать):

void YourTextbox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (char.IsLetter(e.KeyChar))
    {
        if (this.CharacterCasing == CharacterCasing.Upper && char.IsLower(e.KeyChar))
        {
            this.Text = this.Text.Insert(this.SelectionStart, char.ToUpper(e.KeyChar) + string.Empty);
            this.SelectionStart++;
            e.Handled = true;
        }
        else if (this.CharacterCasing == System.Windows.Forms.CharacterCasing.Lower && char.IsUpper(e.KeyChar))
        {
            this.Text = this.Text.Insert(this.SelectionStart, char.ToLower(e.KeyChar) + string.Empty);
            this.SelectionStart++;
            e.Handled = true;
        }
    }
}

Вы также должны использовать новое ключевое слово, чтобы "переопределить" (я знаю, что это неправильный термин здесь) регистр символов, поэтому он не делает свое дело

public new CharacterCasing CharacterCasing { get; set; }

Код в основном проверяет, является ли нажатая клавиша буквой, затем, если она помечена как Upper, а символ более низкий, заменяет его на верхнюю версию (в позиции курсора), а затем перемещает курсор на следующую часть, и наоборот (toLower)

Примечание: Этот код может иметь (должен) иметь некоторые проблемы, если у пользователя выбрано более одного символа (SelectionLenght> 0), если вы хотите сохранить обычную функциональность Textbox, вы должны удалить все выбранные символы

0 голосов
/ 14 февраля 2012

Итак, я установил приложение WinForms, нарисовал два текстовых поля, установил одно на UseSystemPasswordChar = true, а затем настроил его так:

    private void Form1_Load(object sender, EventArgs e)
    {
        textBox2.Tag = "test2";
        textBox1.Tag = "test1";

        TextBox[] tb = { textBox1, textBox2 };
        AddDefaultTextFromTag(tb);
    }

Ваша функция работает нормально, и у меня нет проблем с перемещением по элементам управления в форме, независимо от того, что содержат текстовые поля. (также добавлена ​​кнопка, которая ничего не делает для теста вкладок), так что ... нет воспроизведения, если мои настройки теста недействительны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...