AIDEN IV Ответов: 2

Работает ли метод .focus() в textchangedevent?


Я сделал программу windowsform c#, где, если пользователь вводит данные в текстовое поле на любом другом языке, кроме английского, появляется метка с надписью”Это поле должно быть на английском языке”, которая отлично работает, но я попытался заставить методы .focus()и .select() работать в событии TextChangedEvent, но они не работают.
Есть ли какое-то другое решение?
Вот мой код:

Что я уже пробовал:

Char eng=new char {‘a’,’b’,’c’,.......,’z’};
Foreach(char c in textbox.text.ToLower())
If (!eng.Contains(c))
{
Label22.Visible=true;
Textbox.focus();
}
Else{
Label22.Visible=false;

Gerry Schmitz

Обычно более полезно, если вы объясняете, "чего" вы хотите достичь / произойти; по сравнению с публикацией кода, который имеет мало смысла, но "не работает" ... потому что в противном случае это превращается в долгий "период вопросов и ответов".

AIDEN IV

Ну, что я пытаюсь сделать, так это то, что если пользователь вводит a на языке, отличном от английского, появляется метка, которая говорит: “это поле должно быть на английском языке”, но это работает отлично, а не работает метод .focus (). Он работает в событии проверки, но я хочу использовать событие TextChangedEvent

Gerry Schmitz

Все еще не объясняет, почему вы пытаетесь захватить клавиатуру, пока пользователь печатает. Есть и другие способы привлечь внимание пользователя, не вмешиваясь в его ментальную модель. Если вы хотите, чтобы они "перестали печатать", то отключите поле или выбросьте штрихи клавиш; звуковой сигнал; красную рамку и т. д.

2 Ответов

Рейтинг:
2

BillWoodruff

Я предлагаю вам отфильтровать запись ключа пользователя как это происходит; то есть вы можете избежать проблемы сохранения фокуса. Приведенный здесь пример демонстрирует мелкозернистый контроль, который вы можете иметь:

private char currentChar;

private char backKey = (char) Keys.Back;

private void tbxDataEntry_KeyPress(object sender, KeyPressEventArgs e)
{
    currentChar = e.KeyChar;

    bool validChar =
        char.IsLower(currentChar)
        ||
        char.IsLetter(currentChar)
        ||
        char.IsDigit(currentChar)
        ||
        currentChar == backKey;
    
    if(! validChar)
    {
        if (! lblWarning.Visible)
        {
            lblWarning.Visible = true;
        }
        e.Handled = true;
    }
    else
    {
        if (lblWarning.Visible)
        {
            lblWarning.Visible = false;
        }
    }
}
Потенциальная проблема заключается в следующем: откуда вы знаете, что пользователь печатает с клавиатуры, сопоставленной с римскими символами ? А как насчет цифр ?

Вопрос: что вы хотите сделать, если пользователь меняет фокус на другой элемент управления, но не ввел никакого текста ?


AIDEN IV

Ну,я реализовал код в событии проверки, где, если поле пусто, оно не позволяет вам редактировать другое поле, другими словами, метод .focus() работает в событии проверки. Но теперь я хочу использовать метод .focus() в TextChangedEvent, где, если пользователь вводит число или вводит на любом другом языке, кроме английского, он не должен позволять мне перейти к следующему полю. Но методы .focus() и .select () не работают в TextChangedEvent

BillWoodruff

Как вы думаете, почему вам нужно управлять фокусом в событии TextChanged: фокус не меняется, за исключением, возможно, ввода символа табуляции ?

Мой совет-не использовать событие TextChanged. Вы можете увидеть, как проверить наличие числа (цифры) в приведенном выше коде.

AIDEN IV

Ну, если он не работает в TextChangedEvent, то я должен использовать его в событии проверки. Спасибо за вашу помощь

BillWoodruff

Привет, я почти уверен, что смогу вам помочь, но мне нужна четкая картина того, что происходит сейчас, и того, что вы хотите, чтобы произошло. Что происходит, что заставляет вас иметь дело с фокусом в событии TextChanged ? Ура Билл

AIDEN IV

I have created a form that comprises 20 textboxes, there are 3 textboxes that i want to accept only arabic language, i have no problem with that i have a code for that that works perfectly, what i want to do now is if the user enters in english in a textbox that should be filled in using arabic,a label appears saying”this textbox has to be in english”, what i want to do now is if the user enters in english in an arabic based textbox, it should focus on that textbox and shouldnt let me move to the next textbox, i want to use the TextChangedEvent because if i write a word that is not arabic,the label appears without clicking on the next textbox, i dont want to use the Validating event since i have to click on the next textbox in order for the label to appear

Моя единственная проблема здесь заключается в том, что методы .focus() и .select() не работают в TextChangedEvent. Если есть какое - то решение для этого, это было бы здорово. Спасибо за ваше время и помощь

BillWoodruff

"если пользователь вводит текст на английском языке в текстовое поле,которое должно быть заполнено с использованием арабского языка, появляется надпись:” это текстовое поле должно быть на английском языке”

Я думаю, вы имеете в виду, что пользователь вводит английский язык в текстовое поле только на арабском языке ?

Я собираюсь опубликовать второй ответ, который покажет вам, как я обрабатываю отдельные текстовые поля для тайского и английского языков в одном приложении WinForm ... без использования ' TextChanged, и с пользователем, "застрявшим" в каждом текстовом поле, пока они не введут что-то.

Рейтинг:
17

BillWoodruff

WinForm app .NET 4.0 на машине Win10 с установленным тайским языком. Три текстовых поля для тайского ввода, три для английского.

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

Я настоятельно рекомендую вам не блокировать выход пользователя из текстового поля если они ничего не ввели, как показано в этом коде: это противоречит рекомендациям Win UI и, вероятно, сбьет с толку некоторых пользователей.

using System;
using System.Windows.Forms;
using System.Globalization;

namespace MixedLanguageTbx
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        InputLanguage Thai;
        InputLanguage English;

        private void Form1_Load(object sender, EventArgs e)
        {
            CultureInfo thaiLanguage = new CultureInfo("th");
            Thai = InputLanguage.FromCulture(thaiLanguage);

            CultureInfo englishLanguage = new CultureInfo("en");
            English = InputLanguage.FromCulture(englishLanguage);
        }

        private TextBox currentTextBox;

        private char currentChar;
        private char backKey = (char)Keys.Back;

        // all TextBoxes use this
        private void tbxDataEntry_KeyPress(object sender, KeyPressEventArgs e)
        {
            currentChar = e.KeyChar;

            bool validChar =
                //char.IsLower(currentChar)
                //||
                char.IsLetter(currentChar)
                ||
                char.IsDigit(currentChar)
                ||
                currentChar == backKey;

            if (!validChar)
            {
                if (!lblWarning.Visible)
                {
                    lblWarning.Visible = true;
                }
                e.Handled = true;
            }
            else
            {
                if (lblWarning.Visible)
                {
                    lblWarning.Visible = false;
                }
            }
        }

        // all Thai TextBoxes use this
        private void ThaiTbxs_Enter(object sender, EventArgs e)
        {
            InputLanguage.CurrentInputLanguage = Thai;
        }

        // all English TextBoxes use this
        private void EnglishTbxs_Enter(object sender, EventArgs e)
        {
            InputLanguage.CurrentInputLanguage = English;
        }


        // what you should not do !
        // all TextBoxes use this
        private void AllTextBoxes_Leave(object sender, EventArgs e)
        {
            InputLanguage.CurrentInputLanguage = English;

            currentTextBox = sender as TextBox;

            if(currentTextBox.Text == "")
            {
                currentTextBox.Focus();
            }
        }
    }
}


AIDEN IV

Это помогло, спасибо за ваши ответы