在多个文本域中粘贴序列号
本文关键字:序列号 文本 | 更新日期: 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;
}
}
}
}