在forforeach语句中小心使用控件的SendToBackBringToFront方_第1页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在for,foreach语句中小心使用控件的sendtoback,bringtofront方今日写了段vb。net遍历控件的办法,乍一看没有什么问题,但结果却出人意料,conol集合的元素没有遍历完,并且有重复的元素。 public sub setcontrollableandpropertyfromxml(byval parent as control) for each bcontrol as control in parent.contro if subcontrol.haschildren then setcontrollableandpropertyfromxml(subcontro

2、l) end if if mshosaiconfig.shosaisetting.items(subcontrol.name) is nothing then continue for end if subcontrol.tt = mshosaiconfig.shosaisetting.items(subcontrol.name).labletext dim itctl = subcontrol.parent.controls.item(mshosaiconfig.shosaisetting.items(subcontrol.name).componame) if not editctl is

3、 nothing then if not mshosaiconfig.shosaisetting.items(subcontrol.name).editable is nothing then editctl.enabled = mshosaiconfig.shosaisetting.items(subcontrol.name).editable end if end if next end sub 我向来以为是foreach转变了读取数据的数序,或者说他可能不是按挨次读取,但用reflecter看了下,controls是controlconnection集合,这个集合实现了ienumerab

4、le接口,其本质和用for语句遍历是一样的,他们都是index 1 的方式,用索引来拜访的。所以问题不在foreach语句。 最后发觉是这一句editctl.enabled = mshosaiconfig.shosaisetting.items(subcontrol.name).editable出了问题。editctl是重写过的combox控件,在onenabledchanged大事中用了,sendtoback和bringtofront办法。 protected overres sub onenabledchanged(byval e as system.eventargs) mybase.o

5、nenabledchanged(e) if me.enabled then me.m_lblcombotext.visible = false else me.m_lblcombotext.visible = true me.sendtoback() me.m_lblcombotext.bringtofront() end if end sub 罪魁祸首就是这个sendtoback和bringtofront,这两个函数的用法,可能会导致控件所在的父控件(parent)的controls集合元素移位,也就是假如我们在for,foreach语句中,对controls集合的元素调用了这两个办法,因为

6、controls的元素移动了,再按index 1 的方式来遍历可能有未遍历的元素移动到了controls集合的前面,造成遍历不彻低。同理,已经遍历的元素移动到controls的后面会造成元素的重复。 sendtoback和bringtofront会转变控件的“zindex“ 来转变控件的显示层次,来看看他的内部实现: public void sendtoback() if (this.parent != null) this.parent.controls.setchildindex(this, -1); else if (this.ishandlecreated this.gettoplev

7、el() safenativemethods.setwindowpos(new handleref(this.window, this.handle), nativemethods.hwnd_bottom, 0, 0, 0, 0, 3); = public virtual void setchildindex(control child, int newindex) this.setchildindexinternal(child, newindex); = internal virtual void setchildindexinternal(control child, int newin

8、dex) if (child = null) throw new argumentnullexception( child int childindex = this.getchildindex(child); if (childindex != newindex) if (newindex = this.count) | (newindex = -1) newindex = this.count - 1; base.moveelement(child, childindex, newindex); child.upzorder(); layouttransaction.dolayout(this.owner, child, propertynames.childindex); 关键就是这句base.moveelement(child, childindex, newindex);会造成controls内元素的重新罗列。 那么对要遍历controls,并且要转变其中control元素显示层次应当怎么办呢? 法一:声明一个list control lstcontrols,先遍历controls,把这些元素加到lstcontrols中,再对lstcontrols遍历,调用sendtoback办法。这种办法主

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论