Изменить символ, прежде чем он достигнет TextBox - PullRequest
2 голосов
/ 19 декабря 2010

Я создаю числовое текстовое поле и хочу, чтобы десятичный символ numpad отображался на CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator, как это делает Excel.

Есть ли способ изменить (заменить) ключ перед его интерпретациейTextBox?

Моя текущая стратегия такова:

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyCode == Keys.Decimal)
    {
        e.Handled = true;
        e.SuppressKeyPress = true;

        int selectionStart = SelectionStart;

        Text = String.Concat(
            Text.Substring(0, selectionStart),
            CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator,
            Text.Substring(SelectionStart + SelectionLength)
        );

        Select(selectionStart + 1, 0);
    }
    else
    {
        base.OnKeyDown(e);
    }
}

Ответы [ 2 ]

2 голосов
/ 19 декабря 2010

Да, вы можете перехватить сообщение WM_CHAR, переопределив WndProc ():

using System;
using System.Windows.Forms;

class MyTextBox : TextBox {
    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x102 && m.WParam.ToInt32() == '.') {
            m.WParam = (IntPtr)'/';   // test only
        }
        base.WndProc(ref m);
    }
}

Помните, что у вас также есть проблема с буфером обмена (Ctrl + V). Это сообщение WM_PASTE, 0x302. Возможный обходной путь:

    if (m.Msg == 0x302 && Clipboard.ContainsText()) {
        var txt = Clipboard.GetText();
        txt = txt.Replace('.', '/');
        this.SelectedText = txt;
        return;                        
    }
1 голос
/ 19 декабря 2010

Вместо замены всего свойства Text, вы можете установить свойство SelectedText для разделителя:

if (e.KeyCode == Keys.Decimal)
{
    e.Handled = true;
    e.SuppressKeyPress = true;
    SelectedText = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
}
else base.OnKeyDown(e);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...