Вставка серийного номера в несколько текстовых полей - PullRequest
1 голос
/ 06 ноября 2011

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

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

Я хочу, чтобы мои клиенты поместили курсор в первое поле лицензии, а когда пользователь вставляет лицензию на 32 символа, я хочу, чтобы она заполнила все поля.

Я не знаю, с чего начать, так что если вы можете указать мне правильное направление, это было бы здорово.

Ответы [ 3 ]

4 голосов
/ 06 ноября 2011

В первом текстовом поле я бы поставил большой предел.

В поле «текст изменен» проверьте длину.Если изменение больше 4 (ваш максимум).Удалите лишние элементы и распределите их по текстовым полям.

Если вы скопируете и вставите текст, он изменит текст на 32 и будет работать.Вы также можете изменить курсор (я думаю, что его. Focus (), но я могу ошибаться), чтобы он автоматически «прыгал» между полями.

2 голосов
/ 06 ноября 2011

Вы можете переопределить WndProc для захвата события вставки (сообщение Windows). Затем просто возьмите вставленный текст и скопируйте в текстовые поля. Полный пример, вдохновленный этим ответом :

using System;
using System.Linq;
using System.Windows.Forms;

namespace SOPasteTextBox
{
    public class ClipboardEventArgs : EventArgs
    {
        public string ClipboardText { get; set; }
        public ClipboardEventArgs(string clipboardText)
        {
            ClipboardText = clipboardText;
        }
    }

    class PasteAwareTextBox : TextBox
    {
        public event EventHandler<ClipboardEventArgs> Pasted;

        private const int WM_PASTE = 0x0302;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_PASTE)
            {
                var evt = Pasted;
                if (evt != null)
                {
                    evt(this, new ClipboardEventArgs(Clipboard.GetText()));
                }
                return;
            }

            base.WndProc(ref m);
        }
    }

    static class Program
    {
        private static PasteAwareTextBox[] _textBoxes;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            var mainForm = new Form();
            _textBoxes = Enumerable.Range(0, 8).Select(x => new PasteAwareTextBox() {Top = x*20}).ToArray();
            _textBoxes[0].Pasted += DoPaste;
            foreach (var box in _textBoxes)
            {
                mainForm.Controls.Add(box);
            }
            Application.Run(mainForm);
        }

        private static void DoPaste(object sender, ClipboardEventArgs e)
        {
            if (String.IsNullOrWhiteSpace(e.ClipboardText))
                return;

            int i = 0;
            var text = e.ClipboardText.Split('-').Take(_textBoxes.Length);
            foreach (string part in text)
            {
                _textBoxes[i++].Text = part;
            }
        }
    }
}
2 голосов
/ 06 ноября 2011

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

Довольно просто, и должно "просто работать".

...