2011-11-06 145 views
1

在我的應用程序中,用戶可以使用32個字符的serialnumber將其產品(從試用版升級到完整版)升級。在多個文本框中粘貼serialnumber

爲了使我的(支付)客戶儘可能地方便用戶,我希望能夠複製和粘貼序列號。

我希望我的客戶將光標置於許可證的第一個字段中,當用戶粘貼32個字符的許可證時,我希望它填充所有字段。

我不知道從哪裏開始,所以如果你能指出我會朝着正確的方向發展的話。

+0

我被誘惑只是回答「是」。 – driis

+1

我從來沒有見過單獨盒子的好處。 IMO只用一個盒子沒有更多的問題。也許在手動輸入過程中自動添加破折號(或實際上是自動/粘貼)。 –

+0

這個問題 - http://stackoverflow.com/questions/1156975/copy-paste-event-listener-in-c-sharp有一些關於在c#中設置剪貼板事件偵聽器的信息。但看起來相當複雜。 – ipr101

回答

4

在第一個文本框中,我會提出一個很大的限制。

在'文字改變'上,檢查長度。如果變化大於4(最大值)。刪除額外的東西,並將其傳播到您的文本框。

如果您複製粘貼,它將文本更改爲32,它會工作。你也可以改變光標(我認爲它的.Focus(),但我可能是錯的),所以它會自動在這兩個盒子之間「跳躍」。

2

您可以將其插入第一個文本框的文本更改事件中,然後修剪&將粘貼的文本拆分爲4個組,並設置其他文本框的文本。

非常簡單,應該「只是工作」。

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