Рейтинг:
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
Это помогло, спасибо за ваши ответы