当前位置:首页 > Windows程序 > 正文

[C#]死循环:我给自己挖了个坑!

2021-05-26 Windows程序

  写了个父子页面的传值(交互),竟整出个死循环来,最后纠结地自己去填自己挖的坑(还好不是填别人的坑),废话不说,开始主题.

1. 问题的发生

 根据父窗体中的输入值,,在数据库中查询资料,并在子窗体加载的时候根据资料的不同显示不同的颜色,子页面中根据输入对数据库中的数据做一些修改,返回父窗体时,检查这些修改,并判断是否要修改父窗体中这些值的显示颜色。

  父窗体

   

技术分享

 

 子窗体

  

技术分享

即当子窗体中QTY输入框输入的值等于DataGridView中ISQTY的值时(小于实现每次输入的累加),修改本条记录的显示颜色为蓝色。当点击返回或是关闭子窗体时(关闭子窗体和返回按钮实现的效果相同,检查子窗体中值的显示颜色,并决定是否要改变父窗体MO列的显示颜色),如果子窗体中的记录都显示为蓝色,要改变父窗体中对应的MO列显示的颜色为蓝色。问题就发生在点击返回或是点击关闭子窗体时。

2. 问题的表现及导致发生问题的代码

  

技术分享

  “返回”按钮的单击事件  

private void btnReturn_Click(object sender, EventArgs e) {   //-----------------根据子窗体中显示颜色判断是否要改变父窗体中值的显示颜色--------       #region 返回父窗体     CHECK_MO_MATERIAL cmm = (CHECK_MO_MATERIAL)this.Owner;//CHECK_MO_MATERIAL父窗体的名称     if ( cmm != null )     {         cmm.moChangeFlag = moFlag;         cmm.ChangeMoColor();     }         #endregion     this.Close(); }

窗体的关闭事件

private void CHECK_MO_MATERIAL_CONFIG_FormClosing(object sender, FormClosingEventArgs e) {     btnReturn_Click(sender, e); }

 到这里你一定发现的问题的发生的,不喜勿碰,本人旨在分享而已。

3. 问题的查找

 那个报错的图片很大程度会转移注意力,可能是调用的.Net的库的版本不兼容导致的,或是像我一样的不幸运,在自己的电脑上根本就不会发生,这些在很大程度会转移问题的定位,但是到什么时候,都不要Debug!我就一步一步跟着走,看是在哪里走进了死胡同。

 如果上面的代码还是没看出来,试着看下面的精简版本

private void btnReturn_Click(object sender, EventArgs e) {      //-----------------根据子窗体中显示颜色判断是否要改变父窗体中值的显示颜色--------     this.Close(); } private void CHECK_MO_MATERIAL_CONFIG_FormClosing(object sender, FormClosingEventArgs e) {     btnReturn_Click(sender, e); }

4. 问题的分析

 我只是想在点关闭关闭窗体和返回按钮时实现相同的效果,结果却写出了这么挫的东东,我想剁掉自己的小手手......

技术分享

   一个死循环就此诞生,返回按钮的this.Close()方法会导致窗体关闭,从而导致执行FormClosing()窗体事件,而窗体FormClosing()事件调用返回按钮的方法,由此A调用B,B反过来调用A,再也没有结束的机会

4. 问题的解决

 知道问题的原因,解决办法总是会有很多种,下面是其中的一种,欢迎你写下自己的想法,分享,共同成长...

private void btnReturn_Click(object sender, EventArgs e) {      this.Close(); } private void CHECK_MO_MATERIAL_CONFIG_FormClosing(object sender, FormClosingEventArgs e) {     //-----------------根据子窗体中显示颜色判断是否要改变父窗体中值的显示颜色--------     #region 返回父窗体     CHECK_MO_MATERIAL cmm = (CHECK_MO_MATERIAL)this.Owner;//CHECK_MO_MATERIAL父窗体的名称     if ( cmm != null )     {         cmm.moChangeFlag = moFlag;         cmm.ChangeMoColor();     }         #endregion }

4. 你可能学到的小知识

如果FormClosing事件到调用的方法包含关闭当前窗体的方法(如本文中的this.Close()),那么就会导致死循环的发生。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71500.html