晕倒!被checkbox的小问题给绕进去了,求高智商大神帮助!

问题描述

首先说一下,对于vb.net我是新手。在阅读别人代码时,遇到checkbox的bug,就想动手解决。其基本的逻辑是这样的:在win.form的一个应用中,有3个checkbox,首先运行一个主程序,其中把第一个checkbox1的状态修改为true,如下:sub......checkbox1.Checked=true......Endsub

运行完后,呈现一个窗体。然后,如果用户点击其中一个checkbox,如果这个checkbox是unchecked,让这个checkbox状态改为checked,其中两个checkbox状态改为unchecked;如果状态是checked,则该checkbox的状态修改为unchecked,其中两个也改为unchecked。大致代码如下:Subcheckbox1_CheckedChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)Handlescheckbox1.CheckedChangedIfcheckbox1.CheckState=CheckState.UncheckedThencheckbox1.CheckState=CheckState.Checkedcheckbox2.CheckState=CheckState.Uncheckedcheckbox3.CheckState=CheckState.UncheckedElsecheckbox1.CheckState=CheckState.Uncheckedcheckbox1.CheckState=CheckState.Uncheckedcheckbox1.CheckState=CheckState.UncheckedEndIfEndSub

本来以为这个bug很简单,谁知道运行后我发现,当主程序中对checkbox1初次赋值后,需要修改其他两个checkbox的状态,又触发了进一步修改状态,谁知道上述代码形成了死循环。想了好久,觉得这个是简单问题,但怎么也找不到较好的解决方式。不知道哪位高智商大神能帮助小弟一把?在此感激涕零了!在线等!

解决方案

解决方案二:
1.判断当前点击的状态2.如果是True,则改为False3.如果是False,则其他的全部为False,然后再把这个改为true
解决方案三:
本来以为这个bug很简单,谁知道运行后我发现,当主程序中对checkbox1初次赋值后,需要修改其他两个checkbox的状态,又触发了进一步修改状态,谁知道上述代码形成了死循环这还想不到问题的解决办法?在修改之前移除所有checkbox注册的CheckedChanged事件,在修改完之后再统一注册事件而且你三个方法都是统一的逻辑,完全可以只注册到一个方法上,然后通过事件方法的sender参数来确定当前触发事件的是哪个checkbox
解决方案四:
自己定义一个标识就好。DimeditingAsBoolean=FalseSubcheckbox1_CheckedChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)Handlescheckbox1.CheckedChangedIfediting=FalseThenediting=TrueIfcheckbox1.CheckState=CheckState.UncheckedThencheckbox1.CheckState=CheckState.Checkedcheckbox2.CheckState=CheckState.Uncheckedcheckbox3.CheckState=CheckState.UncheckedElsecheckbox1.CheckState=CheckState.Uncheckedcheckbox1.CheckState=CheckState.Uncheckedcheckbox1.CheckState=CheckState.UncheckedEndIfediting=FalseEndIfEndSub

解决方案五:
不用checkbox1的checkedchange事件,用它的clicked事件嘛,click事件里的逻辑一样。主程序改了checkbox1的checked属性也不影响
解决方案六:
劳驾版主莅临。小弟是刚学vb.net,对于下面讲的修改之前移除所有checkbox注册的CheckedChanged事件,在修改完之后再统一注册事件。这个版主能否用代码简单说明一下?这里先谢过了。引用2楼starfd的回复:

本来以为这个bug很简单,谁知道运行后我发现,当主程序中对checkbox1初次赋值后,需要修改其他两个checkbox的状态,又触发了进一步修改状态,谁知道上述代码形成了死循环这还想不到问题的解决办法?在修改之前移除所有checkbox注册的CheckedChanged事件,在修改完之后再统一注册事件而且你三个方法都是统一的逻辑,完全可以只注册到一个方法上,然后通过事件方法的sender参数来确定当前触发事件的是哪个checkbox

解决方案七:
引用楼主u011552243的回复:

本来以为这个bug很简单,谁知道运行后我发现,当主程序中对checkbox1初次赋值后,需要修改其他两个checkbox的状态,又触发了进一步修改状态,谁知道上述代码形成了死循环。想了好久,觉得这个是简单问题,但怎么也找不到较好的解决方式。不

这是一个比较基本的“编程模式”问题(模式,就是一些应该变成“习惯”的小伎俩,这些不经意的习惯又体现着程序员的训练)。要改变一个控件的属性,应该首先判断一下“到底有没有必要修改”。例如应该写if(!checkbox1.Checked)checkbox1.Checked=true;

对于其它的也是如此,控件的任何属性修改都应该如此。这是因为——控件的属性通常会触发事件。如果先判断后修改,那么就不会产生事件触发循环。如果果真触发了死循环,那么你的业务逻辑本身就是死循环,而不是编程问题。
解决方案八:
CheckBox[]boxArr=newCheckBox[3];privatevoidForm1_Load(objectsender,EventArgse){boxArr[0]=this.checkBox1;boxArr[1]=this.checkBox2;boxArr[2]=this.checkBox3;this.BindEvent();}privatevoidBindEvent(boolbind=true){for(vari=0;i<boxArr.Length;i++){if(bind){boxArr[i].CheckedChanged+=CheckBox_CheckedChanged;}else{boxArr[i].CheckedChanged-=CheckBox_CheckedChanged;}}}privatevoidCheckBox_CheckedChanged(objectsender,EventArgse){varnowCheckBox=senderasCheckBox;if(nowCheckBox!=null){this.BindEvent(false);for(vari=0;i<boxArr.Length;i++){if(boxArr[i]!=nowCheckBox){boxArr[i].CheckState=CheckState.Unchecked;}}this.BindEvent();}}

我写了C#版的,对于当前被点击的CheckBox其实没必要做任何操作
解决方案九:
如果同一时刻只能选择其中一个,你可以用另外一个控件radiobutton,添加控件的时候把默认选的那个控件属性checked设置为true就行了。
解决方案十:
其实你用checkbox不要在主程序启动的时候设置,而在添加控件的时候设置,这样就不会有这个问题了。
解决方案十一:
程序启动的时候是不是不应该处理,是,那么在程序启动后加标记,也就是说在formload最后标记一下,再在checkboxchanged事件中,把所有都加上这个标记,那么程序在初始化的时候就不会运行changed里的东西了

时间: 2024-09-23 01:51:58

晕倒!被checkbox的小问题给绕进去了,求高智商大神帮助!的相关文章

黑盒测试-211小硕,两个offer比较,望大神指点迷津

问题描述 211小硕,两个offer比较,望大神指点迷津 本人今年毕业,211小硕,女生,先收到两个offer,不知如何选择,望大家帮我分析分析 1.上海贝尔(阿尔卡特朗讯),做无线系统测试 2.苏州甲骨文,头衔是QA,主要是做黑盒测试 解决方案 苏州吧,甲骨文挺好啊,无线测试有辐射!!! 解决方案二: 难道是苏州大学的研究生?嘿嘿 推荐甲骨文 解决方案三: 211研究生做测试有点大材小用吧?上海贝尔是我们公司的客户,做无线产品.我觉得主要是看楼主是走技术路线还是管理路线?如果比较开朗的话,我觉

expandablelistview和checkbox结合使用,复用问题,头疼好几天,大神帮帮忙啊

问题描述 expandablelistview和checkbox结合使用,复用问题,头疼好几天,大神帮帮忙啊 了viewholder复用了,当子项滑出范围,选中的checkbox变为未选中,不过选中的删除时删除是正确的,只是这样重复选择(不知道怎么说),体验不好,头疼好几天了 expandablelistviewadapter代码如下: 关键代码: /* * 解决复用问题的关键代码,那里好像出错了.导致自动让滑出屏幕的checkbox不选,这里 */ if (checkposition!=nul

背景色-C#小白求助:C#如何设置checkbox的小方框的背景

问题描述 C#小白求助:C#如何设置checkbox的小方框的背景 需要设置这个方格的背景颜色,怎么设置,checkbox实例没有文本,只有一个框框,想通过框的颜色表达不同的状态. 解决方案 就你的需求来说,用一个picturebox+一个label就可以了.picturebox可以填充不同的颜色,也可以设置不同的图片. 解决方案二: 谢谢你,学习了.昨天,我换成Button实现了,重绘Button的形状.

关于一个table中checkbox的问题,求大神解答

问题描述 将一个list中的数据传到前台table中数据大体是这样显示checkbox姓名年龄每一条前面都有个checkbox,然后选中几条数据后按确定按钮,将选中数据的id放在session中回到上一个页面,然后从上一个页面进入这个页面时,那些被选中的id在session中传过来,要根据那些id来判断哪个checkbox是选中过的并在前台反应出来,这个要怎么实现啊顺便问一下怎样通过按钮来控制checkbox全选和全消除,java学的时间比较短,都不是很了解,求大神解惑. 解决方案 解决方案二:

c-求大神解惑!一个小程序运行不了

问题描述 求大神解惑!一个小程序运行不了 #include #include struct data{int daymonthyear;} ;struct stu {char name[20];long num;struct data birthday;} ;int main(){struct stu *student; student=malloc(sizeof(struct stu)); printf(""Input namenumberyearmonthday:/n"&

求各大神帮忙,有关html代码运行的小问题?

问题描述 求各大神帮忙,有关html代码运行的小问题? 我在用wordpad++写了html代码后,点击默认浏览器运行,却总是没有任何反应.我已经将默认浏览器改为谷歌浏览器了,只是默认的是搜狗,那个运行选项里面貌似没有搜狗的???? 解决方案 代码呢,没反应肯定是你脚本编写有问题了,或者使用到了null对象 f12打开谷歌开发工具看报什么错误 解决方案二: 那你这个代码是以什么格式保存的. 解决方案三: .html 文件保存格式为html 代码没错的话就是格式不对

java代码-我用Java 写的一个简单截图小工具 但是出现一些在重截时出现bug 跪求大神

问题描述 我用Java 写的一个简单截图小工具 但是出现一些在重截时出现bug 跪求大神 /**在这里贴上我注释满满的代码 求一语道破 求建议 求批评 没有贴main 方法 随便写个main方法便可运行 */ ` package com.subimaga; import java.awt.AWTException; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Cursor; import java.

各位大神,急需微信小视频Android源码

问题描述 各位大神,急需微信小视频Android源码 目前在做一个社交聊天的软件,其中有部分功能涉及到微信里的小视频功能,在网上没有查到相关的资料,想求各位大神们分享一下小视频的源码,金币木有啦,祝您和家人们新年快乐,万事如意! 解决方案 试试vitamio? 解决方案二: vitamio出了一个方视频recorder的demo 应该最满足你的需求的 解决方案三: http://download.csdn.net/detail/myactivity/9149695 我做的一个小demo,希望能够

c++-C++小白求大神提携解惑,是在搞不明白了

问题描述 C++小白求大神提携解惑,是在搞不明白了 我有一个数据文件,里面的格式是自己定义的 ###################begin##line############################ [C 1 1] [C 1 7] [C 1 8] [C 2 2] [C 2 5] [C 2 6] [C 2 7] [C 2 8] [C 3 3] [C 3 4] [C 3 5] [C 4 4] [C 5 5] [C 6 6] [C 6 7] [C 7 7] [C 8 8] ########