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 に答える