【问题标题】:Winforms MaskedTextBox - Reformatting pasted text to match maskWinforms MaskedTextBox - 重新格式化粘贴的文本以匹配掩码
【发布时间】:2010-05-20 19:05:28
【问题描述】:

我有一个 MaskedTextBox 控件,在我们的例子中,它正在收集社会保险(税)号码(虽然没有 ValidatingType,因为字符串表示包括掩码文字)。社会保险号是由破折号分隔的 3 组 3 位数字。有时可以键入或输入空格而不是破折号。

文本框的配置为:

  • 口罩:999-999-999
  • ValidationType:null / 不需要
  • SkipLiterals:真
  • CutCopyMaskFormat:IncludeLiterals(仅在从文本框剪切/复制时相关)
  • TextMaskFormat:包含文字

-- 如果还有其他您认为重要的属性,请告诉我!

问题

粘贴以下税号“450 622 097”时,由于空格与掩码不匹配。所以我最终在文本框中输入“450- 62-2 9”。粘贴“450-622-097”将成功粘贴到框中。

我希望能够拦截粘贴事件,以便可能修复它以用破折号替换空格。

或者,我们是否可以让掩码接受破折号或空格(但始终输出破折号)?

非解决方案

MaskInputRejected 事件 - 我似乎无法处理最初输入的内容(即被拒绝的内容),以便将其与剪贴板顶部的内容进行比较。它只是返回它是如何被拒绝的

验证事件 - 在应用掩码后已经发生。 IE。 “450- 62-2 9”的值现在在文本框中。

使用带有静态 Parse 函数的自定义 ValidatingType - 同样,在应用掩码之后发生。

检测 Key-Down 事件 - 如果按键系列是 Ctrl-V,则手动处理并传入剪贴板文本的清理版本。可以工作,但是通过右键单击上下文菜单粘贴呢?

还有其他想法吗?

【问题讨论】:

    标签: c# .net winforms paste maskedtextbox


    【解决方案1】:

    虽然这是一个锤式解决方案,但掩码字符串存在限制,我没有看到其他解决方法。您需要的是捕获粘贴事件并在文本进入文本框之前对其进行处理。看下面一个简单的例子

       class MyMaskedTextbox : MaskedTextBox
            {
                const int WM_PASTE = 0x0302;
    
                protected override void WndProc(ref Message m)
                {
                    switch (m.Msg)
                    {
                        case WM_PASTE:
                            if (Clipboard.ContainsText())
                            {
                                string text = Clipboard.GetText();
                                text = text.Replace(' ', '-');
    //put your processing here
                                Clipboard.SetText(text);
                            }
                            break;
                    }
                    base.WndProc(ref m);
                }
            }
    

    【讨论】:

    • 太棒了!是的,我曾在一夜之间认为这是一种可能性......我曾想避免通过继承进行扩展,但如果我没记错的话,我认为这是控制消息泵的唯一方法?
    • 也许在我继承的 TextBox 中,我实际上会引发一个带有事件 args 的“Pasting”事件来更改将要粘贴的内容(在您有“将您的处理放在此处”注释的地方引发)...当我完成她时发布它!
    • 是的,您只能通过继承来处理消息。我认为你不需要提出任何事件。上面的代码已经在做一些处理(见 text.Replace),并使用 Clipboard.SetText 修改要粘贴的内容
    【解决方案2】:

    根据@anchandra 的响应和后续的 cmets,这里是启用基于每个控件处理文本的类。

    public class MyMaskedTextBox : MaskedTextBox
    {
        private const int WM_PASTE = 0x0302;
    
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_PASTE:
                    if (Clipboard.ContainsText())
                    {
                        string text = Clipboard.GetText();
                        var args = OnPasting(text);
                        if (args.Cancel)
                        {
                            // Swallow it up!
                            return;
                        }
    
                        // If value changed, then change what we'll paste from the top of the clipboard
                        if (!args.Value.Equals(text, StringComparison.CurrentCulture))
                        {
                            Clipboard.SetText(args.Value);
                        }
                    }
                    break;
            }
            base.WndProc(ref m);
        }
    
        public event EventHandler<PastingEventArgs> Pasting;
    
        protected virtual PastingEventArgs OnPasting(string value)
        {
            var handler = Pasting;
            var args = new PastingEventArgs(value);
            if (handler != null)
            {
                handler(this, args);
            }
            return args;
        }
    }
    
    public class PastingEventArgs : CancelEventArgs
    {
        public string Value { get; set; }
    
        public PastingEventArgs(string value)
        {
            Value = value;
        }
    }
    

    并简单地使用粘贴事件来去除空格:

    private void sinTextBox_Pasting(object sender, PastingEventArgs e)
    {
        e.Value = e.Value.Replace(" ", String.Empty);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 2011-01-16
      • 1970-01-01
      • 2023-03-29
      • 2010-12-25
      相关资源
      最近更新 更多