Как написать справа налево в замаскированном текстовом поле?

У меня есть замаскированное текстовое поле, которое принимает часы в виде двух цифр от пользователя в качестве входных данных - hh. Я использую обработчик событий Form1_KeyPress для ввода значений в текстовое поле.

В настоящее время, когда вы вводите значение, например, цифру 1, в текстовом поле отображается 1h. Как я могу настроить замаскированное текстовое поле так, чтобы при вводе значения оно вводилось с правой стороны, например, h1.

Я попробовал включить свойство RightToLeft для элемента управления, но это не повлияло на поведение.

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (c == '\r' || c == '\t')
    {
        // Values entered
    }
    else
    {
        maskedTB.Select();
        maskedTB.Text += c;
    }

Код для ввода значений в замаскированное текстовое поле

«Я попробовал включить свойство RightToLeft для элемента управления, но это не повлияло на поведение». Вы писали с использованием шрифта RTL или не меняли его со стандартного LTR?

Fildor 20.02.2024 12:45

@Fildor - Использование значения по умолчанию. Нужен ли конкретный шрифт?

Slash 20.02.2024 12:50

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

Fildor 20.02.2024 13:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Свойство RTL предназначено только для целей локализации. Это не влияет на поведение текстового поля. Попробуй это:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (Char.IsDigit(e.KeyChar))
    {
        e.Handled = true;
        var text = maskedTB.Text.Insert(0, e.KeyChar.ToString()); 

        if (text.Length > 2) 
        {
            text = text.Remove(text.Length - 1);
        }

        maskedTB.Text = text;
        maskedTB.SelectionStart = 0;
    }
}
Ответ принят как подходящий

Обзор

Note: The following is not a direct answer to the above question but, it is an alternative that I was able to use whilst meeting the requirements.

Текстовое поле с маской продолжало доставлять мне слишком много проблем, поэтому я решил использовать обычное текстовое поле и самостоятельно реализовать необходимые функции. Текстовое поле было инициализировано текстом: hh:mm:ss.

Был написан метод timeTextBox(char c, TextBox textbox), который будет вызываться внутри обработчика событий KeyPress. Этот метод будет использовать глобальный массив целых чисел bufferArray для хранения неформатированных значений за определенный момент времени. Например, время 1 час 25 минут и 20 секунд будет сохранено как 0,1,2,5,2,0. Строка инициализируется как все 0.

Ввод значений

When a key is pressed, the `IsDigit()` function is called to ensure only digits are entered. The whole array is then shifted by down by 1 (note, at the start the array only contains 0s so this does not have any effect) and the entered value is set at the final index of the buffer array. So, if the number `5` was pressed, the buffer array would contain `0,0,0,0,0,5`, and if the number 2 was pressed afterwards, the array would contain `0,0,0,0,5,2`, and so on.

Затем этот массив форматируется в формате hh:mm:ss и устанавливается как текст текстового поля.

Удаление значений

Removing a value when pressing backspace is very simple. You simply shift the array up by 1 and place a 0 at the 0th index of the buffer array. Then format as before and set the textbox text to the formatted string.

Код

int[] bufferArray = new int[6];
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = true;
    var c = e.KeyChar;

    if (textbox1.Focused)
        timeTextBox(c, textbox1);
}

private void timeTextBox(char c, TextBox textbox)
{
    int finalIndex = bufferArray.Length - 1;

    string output = "";

    if (c == '\r' || c == '\t')
    {
        textbox.ReadOnly = true;    
        this.ActiveControl = null;  // Deselect all controls
    }
    else if (textbox.ReadOnly == false)
    {
        // Reset buffer if new textbox selected
        if (textbox.Text.Contains("hh"))
            bufferArray = new int[6];

        if (Char.IsDigit(c))
        {
            // Shift array down by 1
            for (int i = 0; i < bufferArray.Length - 1; i++)
                bufferArray[i] = bufferArray[i + 1];
            bufferArray[finalIndex] = int.Parse(c.ToString());

            output = formatOutputString();

            textbox.Text = "";    // Clear textbox
            textbox.Text = string.Join("", output);  // Add values to textbox
        }
        else if (c == (char)Keys.Back)      // If backspace is pressed
        {
            // Shift array up by 1
            for (int i = bufferArray.Length - 1; i > 0; i--)
                bufferArray[i] = bufferArray[i - 1];
            bufferArray[0] = 0;

            output = formatOutputString();

            textbox.Text = "";    // Clear textbox
            textbox.Text = string.Join("", output);  // Add values to textbox
        }
    }
}

private string formatOutputString()
{
    string output = "";

    // Generate formated output string
    for (int i = 0; i < bufferArray.Length; i += 2)
    {
        output += $"{bufferArray[i]}{bufferArray[i + 1]}";
        if (i < bufferArray.Length - 2)
            output += ':';
    }

    return output;
}

Другие вопросы по теме