我有一個.net應用程序,其中包括具有面板的搜索屏幕,具有三個文本框,每個文本框具有不同的字符長度。粘貼到多個文本框中
我希望做的是捕捉當粘貼命令時從第一箱調用和我的剪貼板粘貼到三盒。
此功能與許多接受串行鍵和電話號碼輸入的現代應用程序類似。
我有一個.net應用程序,其中包括具有面板的搜索屏幕,具有三個文本框,每個文本框具有不同的字符長度。粘貼到多個文本框中
我希望做的是捕捉當粘貼命令時從第一箱調用和我的剪貼板粘貼到三盒。
此功能與許多接受串行鍵和電話號碼輸入的現代應用程序類似。
據我所知,除捕獲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
屬性來標識文本框)。
感謝您的回答。跟進問題是爲什麼你說這是唯一明智的答案?它會捕獲Ctrl + V,上下文粘貼和編輯 - >粘貼嗎? 似乎有很多方法可以做到這一點;即使是詹姆斯希爾先生上面提出的那個,似乎也不那麼成功。 – amadib
@amadib這是唯一合乎邏輯的事情,因爲在捕獲Cltr + V時,當用戶從上下文菜單中選擇「粘貼」時,您將不會收到通知,並且如果您還要捕獲鼠標單擊,它將很快變成維護地獄。此外,JamesHill的代碼不能簡單地放在表單上:表單不會處理WM_PASTE消息。 [編輯控件和組合框](http://msdn.microsoft.com/en-us/library/windows/desktop/ms649028(v = vs.85).aspx)。 – CodeCaster
您可以增加框的字符限制並註冊TextChanged
,並且如果粘貼(或鍵入)的文本更長的跳轉/剪切到下一個TextBox
。
如何知道是否在textchanged上粘貼文本? –
對此,請參閱James或CodeCasters答案... – ChrFin
您可以綁定按鍵事件,並且當您得到Ctrl + V
或Ctrl + v
時,可以使用clipboad中的值更新三個文本框的值。您可以在TextChanged
事件關閉第一個文本框中執行此操作。
從上下文菜單中選擇粘貼怎麼樣? – CodeCaster
在這種情況下,如果使用上下文菜單,Text_Change事件將被觸發。 –
捕獲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以獲得所需的文本。
你可以捕捉的文本 String txt = Clipboard.GetText();
,並將其放置在其他文本框的「文本」屬性
的可能的複製http://stackoverflow.com/questions/1156975/copy-paste-event-聆聽者在c-sharp – ean5533
你想捕獲何時調用粘貼命令?沒有捕獲複製命令? – Liron