搜索
bottom↓
回复: 21

C#的TextBoxChanged导致TextBox输入不正常

[复制链接]

出590入1001汤圆

发表于 2020-6-16 15:32:27 | 显示全部楼层 |阅读模式
本帖最后由 SUPER_CRJ 于 2020-6-16 15:35 编辑

查了一天了。
具体情况是:
因为要实时解析文本框中的数据。所以用了:TextBoxChanged事件。
但是此时:文本框则不正常了:
1:删除里面的内容,要删除两下,才能成功。而且光标移动到了开头。
2:输入内容也是:输入两下才可以。
仔细检查了相关代码:根本没有可以改变Text的代码。十分费解!!



代码如下(已经过压缩):
  1.         { // 如果增加多个事件,则函数看来会比较乱。所以把众多事件统一处理,简化代码!
  2.             for( int i = 0;i<1;i++ )
  3.             { // 总共5个
  4.                 { // 取数据
  5.                     string inputData = (tabPage3.Controls["txb_sendData" + i.ToString()] as TextBox).Text;
  6.                     string str = Regex.Replace(inputData, @"((\d\s)|(\d\d))(\s*)", "$0" + " ");
  7.                     MatchCollection mc = Regex.Matches(str, @"\b[0-9a-fA-F]+\b");
  8.                     List<byte> buf = new List<byte>();
  9.                     foreach (Match m in mc)
  10.                     {
  11.                         buf.Add(byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber));
  12.                     }
  13.                     if (buf.Count > 8)
  14.                     {
  15.                         showMessageBoxLanguage("第 " + i.ToString() + " 行输入数据超过8字节,请重新输入", "Line " + i.ToString() + " :Input data exceeding 8 bytes, please reenter");
  16.                     }
  17.                     masterSend[i].dataLen = buf.Count;
  18.                     Array.Copy(buf.ToArray(), masterSend[i].dataBuf, buf.Count);
  19.                 }
  20.                 { // 出校验值
  21.                 if (masterSend[i].checkWay == 0)
  22.                 { // 标准校验
  23.                     masterSend[i].checkValue = dataCheck(masterSend[i].dataBuf, masterSend[i].dataLen, 0);
  24.                     (tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text = masterSend[i].checkValue.ToString("X");
  25.                 }
  26.                     else if (masterSend[i].checkWay == 1)
  27.                     { // 增强校验
  28.                         masterSend[i].checkValue = dataCheck(masterSend[i].dataBuf, masterSend[i].dataLen, idParityQueryWay(masterSend[i].ID));
  29.                         (tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text = masterSend[i].checkValue.ToString("X");
  30.                     }
  31.                     else
  32.                     { // 自定义校验
  33.                         masterSend[i].checkValue = byte.Parse((tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text);
  34.                     }
  35.                 }
  36.             }
  37.         }
复制代码


源代码:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2020-6-16 15:58:34 | 显示全部楼层
这里修改了 txb_checkValueX 控件的 Text 属性
  1. // 标准校验
  2. masterSend[i].checkValue = dataCheck(masterSend[i].dataBuf, masterSend[i].dataLen, 0);
  3. (tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text = masterSend[i].checkValue.ToString("X");
复制代码


而 TextBox 控件的 Text 属性值发生变化时,会发送一个 message:
  1. // System.Windows.Forms.TextBoxBase
  2. using System.ComponentModel;
  3. using System.Drawing.Design;

  4. [Localizable(true)]
  5. [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
  6. public override string Text
  7. {
  8.         get
  9.         {
  10.                 return base.Text;
  11.         }
  12.         set
  13.         {
  14.                 if (value != base.Text)
  15.                 {
  16.                         base.Text = value;
  17.                         if (base.IsHandleCreated)
  18.                         {
  19.                                 SendMessage(185, 0, 0);
  20.                         }
  21.                 }
  22.         }
  23. }
复制代码


看参数不确定这是能否区分出来目标对象是 txb_checkValueX 还是 txb_sendDataX

其实这种问题自己一点一点注释代码,反复试一试应该能先定位到出问题的代码

出0入0汤圆

发表于 2020-6-16 16:01:14 | 显示全部楼层
SendMessage(185, 0, 0) 的 185 应该是这个消息

EM_SETMODIFY := 0xB9

https://wiki.winehq.org/List_Of_Windows_Messages
https://docs.microsoft.com/en-us ... ntrols/em-setmodify

出590入1001汤圆

 楼主| 发表于 2020-6-16 16:16:03 | 显示全部楼层
wudicgi 发表于 2020-6-16 15:58
这里修改了 txb_checkValueX 控件的 Text 属性

测试不行
把代码屏蔽:
  1. //(tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text = masterSend[i].checkValue.ToString("X");
复制代码


仍然不能解决问题。
我的附件已上传了源代码,可不可以帮看下。

出0入0汤圆

发表于 2020-6-16 17:21:17 | 显示全部楼层
SUPER_CRJ 发表于 2020-6-16 16:16
测试不行
把代码屏蔽:

我就是打开项目试的,注释掉后边这行在删除时就正常了

出590入1001汤圆

 楼主| 发表于 2020-6-16 20:22:55 | 显示全部楼层
wudicgi 发表于 2020-6-16 17:21
我就是打开项目试的,注释掉后边这行在删除时就正常了


不行!
我把这句换成其它的功能一致的也不行!!
证明应该不是这种原因造成的。
好纠结,完全没有头绪!

  1. masterSend[i].checkValue = dataCheck(masterSend[i].dataBuf, masterSend[i].dataLen, 0);
  2. txb_checkValue0.Text = masterSend[i].checkValue.ToString("X");
复制代码

出590入1001汤圆

 楼主| 发表于 2020-6-16 20:24:16 | 显示全部楼层
wudicgi 发表于 2020-6-16 17:21
我就是打开项目试的,注释掉后边这行在删除时就正常了

另外:请问
注释掉后边这行在删除?这是什么样的操作,不太懂。。。

出100入18汤圆

发表于 2020-6-16 20:31:29 | 显示全部楼层
改用key-up或者key-press事件试试

出0入0汤圆

发表于 2020-6-16 21:41:19 | 显示全部楼层
SUPER_CRJ 发表于 2020-6-16 20:24
另外:请问
注释掉后边这行在删除?这是什么样的操作,不太懂。。。  ...

注释掉后边这行(后,)在(文本框中进行)删除时就正常了

出0入0汤圆

发表于 2020-6-16 21:44:17 | 显示全部楼层
SUPER_CRJ 发表于 2020-6-16 20:22
不行!
我把这句换成其它的功能一致的也不行!!
证明应该不是这种原因造成的。

我从 Win10 换到 Win8.1 的另一台电脑上,还是 VS2017,同样注释掉那行代码还是能消除这个问题


  1.                 { // 出校验值
  2.                 if (masterSend[i].checkWay == 0)
  3.                 { // 标准校验
  4.                     masterSend[i].checkValue = dataCheck(masterSend[i].dataBuf, masterSend[i].dataLen, 0);
  5. //                    (tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text = masterSend[i].checkValue.ToString("X");            // 注释掉此行,或者下边 else if 里那行也一块注释掉
  6.                 }
  7.                     else if (masterSend[i].checkWay == 1)
  8.                     { // 增强校验
  9.                         masterSend[i].checkValue = dataCheck(masterSend[i].dataBuf, masterSend[i].dataLen, idParityQueryWay(masterSend[i].ID));
  10.                         (tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text = masterSend[i].checkValue.ToString("X");
  11.                     }
  12.                     else
  13.                     { // 自定义校验
  14.                       //try
  15.                       //{
  16.                         masterSend[i].checkValue = byte.Parse((tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text);
  17.                         //}
  18.                         //catch { }
  19.                     }
  20.                 }
复制代码

出0入0汤圆

发表于 2020-6-16 21:56:07 | 显示全部楼层
本帖最后由 zyqcome 于 2020-6-16 22:14 编辑

改成失去焦点事件?

-----

楼主,都这么多控件了,不要硬钢了,

这个是你遍历控件的时候,鼠标焦点丢失了,

我的建议是,要么不要用遍历这些控件,这样焦点至少在这个控件,

当然,
有个更简单的,增加一个 button,专门来确认修改


希望能帮到你

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-6-16 23:07:29 | 显示全部楼层
加个timeout,只有输入超时才去校验文本内容,或者keydown事件去校验

出0入0汤圆

发表于 2020-6-17 00:48:25 | 显示全部楼层
其实话说回来,比较好的方式应该是正常的时候在 TextBox LostFocus 时才验证内容,在经过验证内容不合法时才在 TextChanged 或 KeyUp 时就马上验证内容
另外每次只验证当前 TextBox, 而不是所有 TextBox
在执行类似提交的操作时才一次性验证所有 TextBox

出0入0汤圆

发表于 2020-6-17 08:24:27 | 显示全部楼层
一般都是执行操作前,统一进行合法性检验。省事,也够用。

出590入1001汤圆

 楼主| 发表于 2020-6-17 10:17:34 | 显示全部楼层
zyqcome 发表于 2020-6-16 21:56
改成失去焦点事件?

-----

我上传的代码中实际并没有遍历控件。其中几个参数修改了。
其实最终只是:获取了textBox中的数值解析,然后再改另外一个textBox中的数值。并没有访问其它控件。
难道仅仅是:访问了其它一个控件就产生了这样的效果?
(因为是实时解析出值,所以加了一个按键感觉有点:多此一举。)

下面是我上传的代码,麻烦可以再参考下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出590入1001汤圆

 楼主| 发表于 2020-6-17 10:17:53 | 显示全部楼层
wudicgi 发表于 2020-6-17 00:48
其实话说回来,比较好的方式应该是正常的时候在 TextBox LostFocus 时才验证内容,在经过验证内容不合法时 ...

好的,谢谢。
TextBox LostFocus 不方便使用,因为要实时解析出数据。

可以考虑:KeyUp事件,因为之前测试KeyPress没有出现这样的问题。

另外有一点:我修改的代码中其实只检测了一个TextBox,并没有你说的遍历所有。但是也出了这样的问题,所以我想到原因。
(代码我上传到了15楼)

出590入1001汤圆

 楼主| 发表于 2020-6-17 10:20:59 | 显示全部楼层
wudicgi 发表于 2020-6-16 21:44
我从 Win10 换到 Win8.1 的另一台电脑上,还是 VS2017,同样注释掉那行代码还是能消除这个问题


如果是改变了属性。
我把你备注掉的语句直接改为:
  1. txb_checkValue0.Text = strTmp; //strTmp是结果
复制代码

为什么也还是不行!同样的效果。

出0入0汤圆

发表于 2020-6-17 11:30:48 | 显示全部楼层
SUPER_CRJ 发表于 2020-6-17 10:20
如果是改变了属性。
我把你备注掉的语句直接改为:

那你试试注释掉其他的代码,看是哪块有印象
我这试出来就是这块

出0入0汤圆

发表于 2020-6-17 18:08:10 | 显示全部楼层
SUPER_CRJ 发表于 2020-6-17 10:17
我上传的代码中实际并没有遍历控件。其中几个参数修改了。
其实最终只是:获取了textBox中的数值解析,然 ...

确实是输入焦点失去了,我在回复中提到遍历出自

  1.   string inputData = (tabPage3.Controls["txb_sendData" + i.ToString()] as TextBox).Text;
复制代码


这里读了其他的控件

今天仔细看了一下,是另一个 edit 控件引起的



这两个都是 edit 这样在这里

  1.                     if (masterSend[i].checkWay == 0)
  2.                     { // 标准校验
  3.                         masterSend[i].checkValue = dataCheck(masterSend[i].dataBuf, masterSend[i].dataLen, 0);
  4.                         //masterSend[i].checkValue = 99;
  5.                         //(tabPage3.Controls["txb_checkValue" + i.ToString()] as TextBox).Text = masterSend[i].checkValue.ToString("X");
  6.                         string strTmp = masterSend[i].checkValue.ToString("X");
  7.                         txb_checkValue0.Text = strTmp; //AAAA
  8.                     }
复制代码


//AAAA 这个地方,输入的焦点到了 txb_checkValue0 当你再次修改 txb_sendData0 的时候,就需要点两次才能进去,一次激活输入,就是是光标闪烁,一个真正修改

我想到的解决办法

把  txb_checkValue0 换成 label 既然 校验值是算出来的,没必要修改






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出590入1001汤圆

 楼主| 发表于 2020-6-17 20:00:32 | 显示全部楼层
zyqcome 发表于 2020-6-17 18:08
确实是输入焦点失去了,我在回复中提到遍历出自

非常感谢。
应该就是修改另外一个textBox导致的。
但是:另外一个textBox在另外一种模式下,还需要使用。所以不能换成label。
不过终于找到问题的原因了。

我现在用的解决方法是:把textChanged换成keyUp事件就好了。

出590入1001汤圆

 楼主| 发表于 2020-6-17 20:01:51 | 显示全部楼层
hcambridge 发表于 2020-6-16 20:31
改用key-up或者key-press事件试试

key-up事件测试可以的。
key-Press不行,因为此时按下的键还没有真正输入到TextBox中。

出870入263汤圆

发表于 2020-6-18 21:27:20 | 显示全部楼层
分析了你的源码,发现跟你的复杂的数据绑定有关,你最好取消txb_checkValue0-n这些控件的数据绑定;数据流回路导致的。
文字描述这个过程太复杂,你自己按照我的思路调调看。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 05:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表