在多个文本域中粘贴序列号

本文关键字:序列号 文本 | 更新日期: 2023-09-27 18:13:42

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

为了使它尽可能为我的(付费)客户的用户友好,我希望能够复制和粘贴串行。

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

我不知道从哪里开始,如果你能给我指出正确的方向就太好了。

在多个文本域中粘贴序列号

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

在'text changed',检查长度。如果变化大于4(您的最大值)。删除多余的内容并将其分散到您的文本框中。

如果你复制粘贴,它将文本更改为32,它会工作。你也可以改变光标(我认为它是。focus(),但我可能错了),所以它会自动在框之间"跳"。

您可以直接连接到第一个文本框的文本更改事件,并修剪&将粘贴的文本分成5组,每组4个,并设置其他文本框的文本

非常简单,应该"just work"。

你可以重写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;
            }
        }
    }
}