在多个文本字段上粘贴序列号

时间:2011-11-06 17:24:12

标签: c# copy-paste license-key

在我的应用程序中,用户可以使用32个字符的序列号升级他们的产品(从试用版到完整版)。

为了让我(付费)客户尽可能方便用户,我希望能够复制并粘贴该序列。

我希望我的客户将光标放在许可下的第一个字段中,当用户粘贴32个字符许可证时,我希望它填充所有字段。

我不知道从哪里开始如此,如果你能指出我的方向很好。

3 个答案:

答案 0 :(得分:4)

在第一个文本框中,我会设置一个很大的限制。

在'text changed'上,检查长度。如果更改大于4(您的最大值)。删除多余的东西并将其传播到文本框上。

如果你复制粘贴,它的文本更改为32,它会起作用。你也可以改变光标(我认为它的.Focus()但我可能是错的)所以它会在框之间自动“跳”。

答案 1 :(得分:2)

你可以直接进入第一个文本框的文本更改事件,并修剪&将粘贴的文本拆分为4个组,并设置其他文本框的文本。

非常简单,应该“正常工作”。

答案 2 :(得分:2)

您可以覆盖WndProc以捕获粘贴事件(Windows消息)。然后只需将粘贴的文本复制到文本框中即可。完整的例子,受到this answer的启发:

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;
            }
        }
    }
}