【问题标题】:Pasting into multiple text boxes粘贴到多个文本框中
【发布时间】:2012-01-23 12:49:23
【问题描述】:

我有一个 .net 应用程序,其中包括搜索屏幕,该屏幕有一个面板,其中有 三个文本框,每个文本框的字符长度都不同。

我想要做的是 capturepaste 命令invoked 从第一个框并将我的剪贴板粘贴到三个盒子。

此功能类似于许多接受输入序列号和电话号码的现代应用程序。

【问题讨论】:

标签: c# .net winforms textbox copy-paste


【解决方案1】:

据我所知,除了捕获 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、上下文粘贴和编辑 --> 粘贴吗?似乎有很多方法可以做到这一点;即使是上面由 James Hill 先生提出的建议似乎也少了一些工作。
  • @amadib 这是唯一合乎逻辑的事情,因为在捕获 Cltr+V 时,当用户从上下文菜单中选择粘贴时,您不会收到通知,如果您还去捕获鼠标点击,它就是很快就变成了维修地狱。此外,JamesHill 的代码不能简单地放在表单上:表单不会处理 WM_PASTE 消息。 Edit controls and combo boxes do.
【解决方案2】:

捕获粘贴事件:

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 以获取所需的文本。

【讨论】:

    【解决方案3】:

    您可以获取捕获的文本 String txt = Clipboard.GetText(); 并将其放在另一个文本框的“文本”属性中

    【讨论】:

      【解决方案4】:

      你可以绑定按键事件,当你得到Ctrl + VCtrl + v时,你用剪贴板中的值更新三个文本框的值。您可以在第一个文本框外的TextChanged 事件上执行此操作。

      【讨论】:

      • 从上下文菜单中选择粘贴怎么样?
      • 在这种情况下,如果您使用上下文菜单,则会触发 Text_Change 事件。
      【解决方案5】:

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

      【讨论】:

      • 如何知道textchanged上是否粘贴了文本?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 2018-01-03
      • 2021-06-19
      相关资源
      最近更新 更多