请教类似textBox的TextChanged事件

leon51 2020-11-17 09:13:09
类似textbox控件,假如用户需要输入“123”,“abc”...想在输入完整后触发一个事件处理程序。
注意前提是控件值有修改、输入完整时触发。
若用TextChanged,修改每一个字符都会触发。而用Validated,则无论是否修改都会触发。
我现在用的办法是在TextChanged事件中记录值已改变,在Validated事件中检查到若已改变再进一步处理。请问有没有更直接的方法?
...全文
1701 点赞 收藏 22
写回复
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_30335331 2020-11-19
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace MyControls
{
    [ToolboxItem(true)]
    public class STextBox : TextBox
    {
        public string _oldText;
        public event Action RealTextChanged;

        protected override void OnGotFocus(EventArgs e)
        {
            base.OnGotFocus(e);
            _oldText = Text;
        }


        protected override void OnLostFocus(EventArgs e)
        {
            base.OnLostFocus(e);
            if (Text != _oldText)
            {
                RealTextChanged?.Invoke();
            }
        }
    }
}
这种方式有明显缺陷 假设焦点在a 改变了a的值 切换到b 假设在处理逻辑中使用了messagebox 则 b会先失去焦点 引发b的事件
回复
阿麦 2020-11-19
获得焦点的时候保存当前值 失去焦点的时候,比较一下保存值和当前值: A、如果相同则忽略 B、如果不同,就进行后续处理
回复
flower000 2020-11-19
那这个问题是如何解决合适?
回复
leon51 2020-11-18
引用 14 楼 qq_30335331 的回复:
c# 并没有提供这种事件 通常的做法是在LostFocus事件中判断值是否改变 此时要处理两个问题 1.如何记住之前的值 2.按照msdn说法 GotFocus和 LostFocus 事件是与 WM_KILLFOCUS 和 WM_SETFOCUS Windows 消息相关联的低级别焦点事件。 通常, GotFocus LostFocus 仅当更新 UICues 或编写自定义控件时,才使用 在我的项目中 我会从textbox继承为自己的控件 并为之编写一个RealChanged事件 在GotFocus记录值 在LostFocus比较值
感谢你的回复,按这个思路应该可以满足我的需求。 上面第2点如何理解?以前一直没有发现有这两个事件,因为都是用的设计器上面的Enter、Leave事件 另外,可否将RealChanged事件代码贴出来,非常感谢
回复
leon51 2020-11-18
引用 6 楼 左手写愛 的回复:
[quote=引用 4 楼 左手写愛 的回复:]1.定义一个全局变量: private string global_str; 2.假设控件名称是txtName 3.在MouseLeave事件里写如下代码:

private void txtName_MouseLeave(object sender, EventArgs e)
 {
  string name = this.txtName.Text.Trim();
  //判断用户输入不为空,并且新的输入值不等于定义的全局变量
   if (name != string.Empty && !name.Equals(global_str))
    {
       //这里执行输入改变后,你要执行的代码
    }
}
修改一下,上面忘记重新给全局变量赋值了

private void txtName_MouseLeave(object sender, EventArgs e)
        {
            string name = this.txtName.Text.Trim();
            //判断用户输入不为空,并且新的输入值不等于定义的全局变量
            if (name != string.Empty && !name.Equals(global_str))
            {
                //保存新的变量值
                global_str = name;
                //这里执行输入改变后,你要执行的代码
            }
        }
[/quote] 感谢你的回复,这个思路是可以,但是我有很多这样的控件,这样写会麻烦死了
回复
祝君圆梦 2020-11-18
引用 16 楼 良朋的回复:
[quote=引用 9 楼 左手写愛 的回复:]楼主直接看我那个方案就行,因为我的软件也是这么用的,没毛病!
还真的有毛病,如果用户没用mouse操作,比如按TAB键跳转,mouseleave就不会触发了。 [/quote] 你先理解一下楼主的需求,需求是textbox里的内容改变才触发,比如刚开始textbox的内容是123,用户改变成1234,或者abc就触发某个场景。你按两次tab键不能改变textbox的内容吧!
回复
良朋 2020-11-18
引用 9 楼 左手写愛 的回复:
楼主直接看我那个方案就行,因为我的软件也是这么用的,没毛病!
还真的有毛病,如果用户没用mouse操作,比如按TAB键跳转,mouseleave就不会触发了。
回复
wangqx86662638 2020-11-18
需要两个地方,KEYPRESS 回车判断并屏蔽非法输入,还有一个就是失去焦点后触发,判断是否需要保存或者确认输入或者强制全选文本并设置焦点。
回复
qq_30335331 2020-11-18
c# 并没有提供这种事件 通常的做法是在LostFocus事件中判断值是否改变 此时要处理两个问题 1.如何记住之前的值 2.按照msdn说法 GotFocus和 LostFocus 事件是与 WM_KILLFOCUS 和 WM_SETFOCUS Windows 消息相关联的低级别焦点事件。 通常, GotFocus LostFocus 仅当更新 UICues 或编写自定义控件时,才使用 在我的项目中 我会从textbox继承为自己的控件 并为之编写一个RealChanged事件 在GotFocus记录值 在LostFocus比较值
回复
Cryking 2020-11-18
lostfocus事件里处理下
回复
leon51 2020-11-18
引用 11 楼 qq_30335331 的回复:
不可实现 无法完整定义 输入完整 MouseLeave? 恕我愚昧,真的理解不了
换个说法吧,我希望在控件失去焦点、且值已改变时触发
回复
祝君圆梦 2020-11-17
引用 4 楼 左手写愛 的回复:
1.定义一个全局变量: private string global_str; 2.假设控件名称是txtName 3.在MouseLeave事件里写如下代码:

private void txtName_MouseLeave(object sender, EventArgs e)
 {
  string name = this.txtName.Text.Trim();
  //判断用户输入不为空,并且新的输入值不等于定义的全局变量
   if (name != string.Empty && !name.Equals(global_str))
    {
       //这里执行输入改变后,你要执行的代码
    }
}
修改一下,上面忘记重新给全局变量赋值了

private void txtName_MouseLeave(object sender, EventArgs e)
        {
            string name = this.txtName.Text.Trim();
            //判断用户输入不为空,并且新的输入值不等于定义的全局变量
            if (name != string.Empty && !name.Equals(global_str))
            {
                //保存新的变量值
                global_str = name;
                //这里执行输入改变后,你要执行的代码
            }
        }
回复
poloyzhang 2020-11-17
可以参考文本框焦点离开,引发该事件, 如果要用回车键,事件也有匹配 enter 的按键的代码

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
//...............
回复
祝君圆梦 2020-11-17
1.定义一个全局变量: private string global_str; 2.假设控件名称是txtName 3.在MouseLeave事件里写如下代码:

private void txtName_MouseLeave(object sender, EventArgs e)
 {
  string name = this.txtName.Text.Trim();
  //判断用户输入不为空,并且新的输入值不等于定义的全局变量
   if (name != string.Empty && !name.Equals(global_str))
    {
       //这里执行输入改变后,你要执行的代码
    }
}
回复
自己去判断呗,少于你的内容长度直接跳出,记录上一次文字的内容跟这次的比对,不同才做处理
回复
leon51 2020-11-17
引用 1 楼 Bridge_go 的回复:
什么叫输入完整呢 要么接收enter触发
完整输入的意思就是比如要输入“123”,必须 是输入完"123"时才触发,不是输入“1”不触发。 接收enter触发这样改变了用户的操作习惯,可能会接受。
回复
Bridge_go 2020-11-17
什么叫输入完整呢 要么接收enter触发
回复
qq_30335331 2020-11-17
不可实现 无法完整定义 输入完整 MouseLeave? 恕我愚昧,真的理解不了
回复
ziqi0716 2020-11-17
在textbox失去焦点事件中处理
回复
祝君圆梦 2020-11-17
楼主直接看我那个方案就行,因为我的软件也是这么用的,没毛病!
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.