粘贴到多个文本框中
本文关键字:文本 | 更新日期: 2023-09-27 18:21:04
我有一个.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
属性来识别文本框)。
捕获粘贴事件:
protected override void WndProc(ref Message m) {
// Did paste occur?
if (m.Msg == 0x302) {
//Paste occurred, add your logic here
}
base.WndProc(ref m);
}
然后,访问剪贴板对象以获取所需的文本。
您可以获取捕获的文本String txt = Clipboard.GetText();
并将其放置在另一个文本框的"Text"属性中
您可以绑定按键按下事件,当您获得Ctrl + V
或Ctrl + v
时,您可以用剪贴板中的值更新三个文本框的值。您可以在TextChanged
事件关闭第一个文本框时执行此操作。
您可以增加框的字符限制并注册TextChanged
,如果粘贴(或键入)的文本较长,则可以跳转/剪切到下一个TextBox
。