粘贴到多个文本框中

本文关键字:文本 | 更新日期: 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 + VCtrl + v时,您可以用剪贴板中的值更新三个文本框的值。您可以在TextChanged事件关闭第一个文本框时执行此操作。

您可以增加框的字符限制并注册TextChanged,如果粘贴(或键入)的文本较长,则可以跳转/剪切到下一个TextBox