У меня есть замаскированное текстовое поле, которое принимает часы в виде двух цифр от пользователя в качестве входных данных - 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;
}
Код для ввода значений в замаскированное текстовое поле
@Fildor - Использование значения по умолчанию. Нужен ли конкретный шрифт?
Не уверен, но, по крайней мере, я бы попытался это исключить.





Свойство 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;
}
}
Текстовое поле с маской продолжало доставлять мне слишком много проблем, поэтому я решил использовать обычное текстовое поле и самостоятельно реализовать необходимые функции. Текстовое поле было инициализировано текстом: hh:mm:ss.
Был написан метод timeTextBox(char c, TextBox textbox), который будет вызываться внутри обработчика событий KeyPress. Этот метод будет использовать глобальный массив целых чисел bufferArray для хранения неформатированных значений за определенный момент времени. Например, время 1 час 25 минут и 20 секунд будет сохранено как 0,1,2,5,2,0. Строка инициализируется как все 0.
Затем этот массив форматируется в формате hh:mm:ss и устанавливается как текст текстового поля.
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;
}
«Я попробовал включить свойство RightToLeft для элемента управления, но это не повлияло на поведение». Вы писали с использованием шрифта RTL или не меняли его со стандартного LTR?