2012-01-23 94 views
1

我有一個.net應用程序,其中包括具有面板的搜索屏幕,具有三個文本框,每個文本框具有不同的字符長度。粘貼到多個文本框中

我希望做的是捕捉粘貼命令時第一箱調用和我的剪貼板粘貼到三盒。

此功能與許多接受串行鍵和電話號碼輸入的現代應用程序類似。

+0

的可能的複製http://stackoverflow.com/questions/1156975/copy-paste-event-聆聽者在c-sharp – ean5533

+0

你想捕獲何時調用粘貼命令?沒有捕獲複製命令? – Liron

回答

4

據我所知,除捕獲WM_PASTE事件外,沒有其他明智的方法。

派生從TexBox類和實現此方法:

using System.Windows.Forms; 
using System.ComponentModel; 

class TextBoxWithOnPaste : TextBox 
{ 

    public delegate void PastedEventHandler(); 

    [Category("Action")] 
    [Description("Fires when text from the clipboard is pasted.")] 
    public event PastedEventHandler OnPaste; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x302 && OnPaste != null) // process WM_PASTE only if the event has been subscribed to 
     { 
      OnPaste(); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 

然後把其中三個自定義控件的窗體上,並在所有三個文本框,以同樣的方法分配OnPaste事件,在這種情況下,我把它稱爲textPasted()

private void textPasted() 
{ 
    String input = Clipboard.GetText(); 

    int l1 = textBoxWithOnPaste1.MaxLength; 
    int l2 = textBoxWithOnPaste2.MaxLength; 
    int l3 = textBoxWithOnPaste3.MaxLength; 

    try 
    { 
     textBoxWithOnPaste1.Text = input.Substring(0, l1); 
     textBoxWithOnPaste2.Text = input.Substring(l1, l2); 
     textBoxWithOnPaste3.Text = input.Substring(l2, l3); 
    } 
    catch (Exception) 
    { } 

} 

既然你暗示「像連續劇」,我猜你想要的文本框之間被分割粘貼的字符串。上面的代碼並不完美(嘗試在所有三個文本中手動輸入數據後,將單個空格粘貼到第三個文本框中,所以如果您知道在哪個文本框中粘貼了文本,例如通過更改事件的參數通過這種方式發送發件人),但它基本上可以工作,我想你可以找出其餘的(你可以使用Tag屬性來標識文本框)。

+0

感謝您的回答。跟進問題是爲什麼你說這是唯一明智的答案?它會捕獲Ctrl + V,上下文粘貼和編輯 - >粘貼嗎? 似乎有很多方法可以做到這一點;即使是詹姆斯希爾先生上面提出的那個,似乎也不那麼成功。 – amadib

+0

@amadib這是唯一合乎邏輯的事情,因爲在捕獲Cltr + V時,當用戶從上下文菜單中選擇「粘貼」時,您將不會收到通知,並且如果您還要捕獲鼠標單擊,它將很快變成維護地獄。此外,JamesHill的代碼不能簡單地放在表單上:表單不會處理WM_PASTE消息。 [編輯控件和組合框](http://msdn.microsoft.com/en-us/library/windows/desktop/ms649028(v = vs.85).aspx)。 – CodeCaster

0

您可以增加框的字符限制並註冊TextChanged,並且如果粘貼(或鍵入)的文本更長的跳轉/剪切到下一個TextBox

+1

如何知道是否在textchanged上粘貼文本? –

+1

對此,請參閱James或CodeCasters答案... – ChrFin

1

您可以綁定按鍵事件,並且當您得到Ctrl + VCtrl + v時,可以使用clipboad中的值更新三個文本框的值。您可以在TextChanged事件關閉第一個文本框中執行此操作。

+0

從上下文菜單中選擇粘貼怎麼樣? – CodeCaster

+0

在這種情況下,如果使用上下文菜單,Text_Change事件將被觸發。 –

4

捕獲paste事件:

protected override void WndProc(ref Message m) { 
    // Did paste occur? 
    if (m.Msg == 0x302) { 
     //Paste occurred, add your logic here 
    } 
    base.WndProc(ref m); 
} 

然後,訪問Clipboard object以獲得所需的文本。

1

你可以捕捉的文本 String txt = Clipboard.GetText(); ,並將其放置在其他文本框的「文本」屬性