在forforeach語句中小心使用控件的SendToBackBringToFront方_第1頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、在for,foreach語句中小心使用控件的sendtoback,bringtofront方今日寫了段vb。net遍歷控件的辦法,乍一看沒有什么問題,但結(jié)果卻出人意料,conol集合的元素沒有遍歷完,并且有重復(fù)的元素。 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轉(zhuǎn)變了讀取數(shù)據(jù)的數(shù)序,或者說他可能不是按挨次讀取,但用reflecter看了下,controls是controlconnection集合,這個集合實現(xiàn)了ienumerab

4、le接口,其本質(zhì)和用for語句遍歷是一樣的,他們都是index 1 的方式,用索引來拜訪的。所以問題不在foreach語句。 最后發(fā)覺是這一句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 罪魁禍?zhǔn)拙褪沁@個sendtoback和bringtofront,這兩個函數(shù)的用法,可能會導(dǎo)致控件所在的父控件(parent)的controls集合元素移位,也就是假如我們在for,foreach語句中,對controls集合的元素調(diào)用了這兩個辦法,因為

6、controls的元素移動了,再按index 1 的方式來遍歷可能有未遍歷的元素移動到了controls集合的前面,造成遍歷不徹低。同理,已經(jīng)遍歷的元素移動到controls的后面會造成元素的重復(fù)。 sendtoback和bringtofront會轉(zhuǎn)變控件的“zindex“ 來轉(zhuǎn)變控件的顯示層次,來看看他的內(nèi)部實現(xiàn): 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); 關(guān)鍵就是這句base.moveelement(child, childindex, newindex);會造成controls內(nèi)元素的重新羅列。 那么對要遍歷controls,并且要轉(zhuǎn)變其中control元素顯示層次應(yīng)當(dāng)怎么辦呢? 法一:聲明一個list control lstcontrols,先遍歷controls,把這些元素加到lstcontrols中,再對lstcontrols遍歷,調(diào)用sendtoback辦法。這種辦法主

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論