1

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

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

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

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

4

3 回答 3

4

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

在“文本已更改”上,检查长度。如果更改大于 4(您的最大值)。删除多余的东西并将其分布在您的文本框中。

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

于 2011-11-06T17:45:06.623 回答
2

您可以只连接到第一个文本框的文本更改事件,并将粘贴的文本修剪并拆分为 4 个组,然后设置其他文本框的文本。

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

于 2011-11-06T17:40:15.897 回答
2

您可以覆盖 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;
            }
        }
    }
}
于 2011-11-06T17:50:20.590 回答