Вставка в несколько текстовых полей - PullRequest
1 голос
/ 23 января 2012

У меня есть приложение .net, которое включает экран поиска, на котором есть панель с тремя текстовыми полями , каждое из которых имеет различную длину символов.

Я бы хотел перехватить , когда команда вставить , когда вызвала из первого блока и вставить мой буфер обмена в три блока.

Эта функциональность аналогична многим современным приложениям, принимающим ввод для серийных ключей и телефонных номеров.

Ответы [ 5 ]

4 голосов
/ 23 января 2012

Насколько я могу найти, нет другого разумного способа сделать это, кроме как захватить событие WM_PASTE.

Извлеките класс из TexBox и реализуйте этот метод:

using System.Windows.Forms;
using System.ComponentModel;

class TextBoxWithOnPaste : TextBox
{

    public delegate void PastedEventHandler();

    [Category("Action")]
    [Description("Fires when text from the clipboard is pasted.")]
    public event PastedEventHandler OnPaste;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x302 && OnPaste != null) // process WM_PASTE only if the event has been subscribed to
        {
            OnPaste();
        }
        else
        {
            base.WndProc(ref m);
        }
    }
}

Затем поместите три из этих пользовательских элементов управления в форму и назначьте событие OnPaste для всех трех текстовых полей одному и тому жеметод, в данном случае я назвал его textPasted():

private void textPasted()
{
    String input = Clipboard.GetText();

    int l1 = textBoxWithOnPaste1.MaxLength;
    int l2 = textBoxWithOnPaste2.MaxLength;
    int l3 = textBoxWithOnPaste3.MaxLength;

    try
    {
        textBoxWithOnPaste1.Text = input.Substring(0, l1);
        textBoxWithOnPaste2.Text = input.Substring(l1, l2);
        textBoxWithOnPaste3.Text = input.Substring(l2, l3);
    }
    catch (Exception)
    { }

}

Поскольку вы подразумевали «как сериал», я догадался, что вы хотите, чтобы вставленная строка была разделена между текстовыми полями.Приведенный выше код не подходит для этого (попробуйте вставить один пробел в третье текстовое поле после ввода данных вручную во всех трех, поэтому было бы неплохо, если бы вы знали, в какое текстовое поле был вставлен текст, например, изменив параметры событияи таким образом отправляю отправителя вместе с ним), но в основном это работает, и я думаю, вы можете выяснить остальное (вы можете использовать свойство Tag для идентификации текстового поля).

4 голосов
/ 23 января 2012

Захват события вставки:

protected override void WndProc(ref Message m) {
    // Did paste occur?
    if (m.Msg == 0x302) {
        //Paste occurred, add your logic here
    }
    base.WndProc(ref m);
}

Затем откройте объект Буфер обмена , чтобы получить нужный текст.

1 голос
/ 23 января 2012

вы можете получить захваченный текст String txt = Clipboard.GetText(); и поместите его в свойство «Текст» другого текстового поля

1 голос
/ 23 января 2012

Вы можете связать событие нажатия клавиши, и когда вы получите Ctrl + V или Ctrl + v, вы обновите значение трех текстовых полей значением в clipboad.Вы можете сделать это на событии TextChanged вне первого текстового поля.

0 голосов
/ 23 января 2012

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

...