轉(zhuǎn)帖|使用教程|編輯:龔雪|2022-01-14 10:01:15.550|閱讀 242 次
概述:本文主要介紹自定義控件開發(fā)的調(diào)試,以及DesignMode的狀態(tài)處理,希望對(duì)大家有所幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
在開發(fā)Winform程序的時(shí)候,我們往往需要根據(jù)需要做一些自定義的控件模塊,這樣可以給系統(tǒng)模塊重復(fù)利用,或者實(shí)現(xiàn)更好的效果等功能。但在使用的時(shí)候,我們又往往設(shè)計(jì)時(shí)刻發(fā)現(xiàn)一些莫名其妙的錯(cuò)誤,那么我們?cè)撊绾芜M(jìn)行控件的設(shè)計(jì)時(shí)刻的開發(fā)調(diào)試呢,如何解決碰到設(shè)計(jì)時(shí)刻出現(xiàn)的錯(cuò)誤呢?本文主要介紹我自己在這方面積累的一些經(jīng)驗(yàn)和處理方法,期望對(duì)大家有幫助。
例如我的通用附件模塊里面,有一個(gè)自定義控件,需要提供給外部使用的,如下所示。
這里外部使用的模塊,是工作流里面的一個(gè)模塊,也是一個(gè)自定義控件,我想把它作為一個(gè)流程信息的展示控件。
因此就想把這個(gè)附件管理的自定義控件拖動(dòng)到另外一個(gè)自定義控件流程信息展示控件里面,設(shè)計(jì)的流程信息管理的界面如下所示,這個(gè)時(shí)候,使用這個(gè)附近控件是沒有問題的,正常拖動(dòng)到另外一個(gè)控件里面。
編譯整個(gè)項(xiàng)目,左邊的VS工具箱會(huì)出現(xiàn)一個(gè)ApplyControl的自定義控件,但是當(dāng)我拖動(dòng)該控件到新的窗體界面里面的時(shí)候,錯(cuò)誤就出現(xiàn)了。
這個(gè)問題可能是因?yàn)檎{(diào)用了訪問數(shù)據(jù)庫(kù)的操作,但是更加詳細(xì)的位置我們看不太清楚(數(shù)據(jù)給截?cái)囡@示了)。
為了更好跟蹤到錯(cuò)誤的發(fā)生的地方,我們可以用VS自帶的調(diào)試操作來進(jìn)行跟蹤。
首先我們?cè)陧?xiàng)目的【屬性】-》【調(diào)試】里面設(shè)置啟動(dòng)操作為指定的VS,選擇“啟動(dòng)外部程序”為對(duì)應(yīng)版本的VS的IDE程序,如下所示。
啟動(dòng)調(diào)試后,打開對(duì)應(yīng)的這個(gè)項(xiàng)目,然后再次模擬從工具箱里面拖動(dòng)控件的效果,這樣VS IDE就能定位到具體的位置了。
我們發(fā)現(xiàn)VS定位到一個(gè)綁定數(shù)據(jù)的數(shù)據(jù)庫(kù)訪問操作里面去,但是我開始一直不明白,這個(gè)BindData的操作,其實(shí)已經(jīng)是通過指定了設(shè)計(jì)時(shí)刻不進(jìn)行的了(!this.DesignMode),不知道為什么還繼續(xù)。
public void BindData() { ClearData(); if (!this.DesignMode) { List<FileUploadInfo> fileList = new List<FileUploadInfo>(); if (!string.IsNullOrEmpty(this.AttachmentGUID)) { fileList = BLLFactory<FileUpload>.Instance.GetByAttachGUID(this.AttachmentGUID, this.pager1.PagerInfo); } else { fileList = BLLFactory<FileUpload>.Instance.GetAllByUser(this.UserId, this.AttachmentDirectory, this.pager1.PagerInfo); } ..........................
調(diào)試到這個(gè)DesignMode的時(shí)候,它的值竟然是false,那么肯定就會(huì)去從數(shù)據(jù)庫(kù)獲取了,而設(shè)計(jì)時(shí)候去找數(shù)據(jù),這個(gè)時(shí)候就出錯(cuò)了。至于為什么會(huì)是DesignMode為false,開始有點(diǎn)搞不太清楚,不是說好設(shè)計(jì)時(shí)刻為True的嗎?
通過搜索,發(fā)現(xiàn)有位仁兄總結(jié)的比較精辟,這里就借用一下。
也就是說一個(gè)控件只有在它自己被拖拽到設(shè)計(jì)器的時(shí)候,其 DesignMode 才是真,如果它被包含在其他控件中被加入到設(shè)計(jì)器,那么那個(gè)控件才是在設(shè)計(jì)模式,而它不是!換句話說,DesignMode 并不能反映當(dāng)前環(huán)境是否是運(yùn)行時(shí),它只能告訴你,這個(gè)控件當(dāng)前是不是直接被設(shè)計(jì)器操作(嵌套的已經(jīng)不算了) 。”
那解決方法應(yīng)該如何呢,其實(shí)也很簡(jiǎn)單,就是重寫下這個(gè)DesignMode的屬性為我們期望的值即可,如下所示。
/// <summary> /// 標(biāo)題:獲取一個(gè)值,用以指示 System.ComponentModel.Component 當(dāng)前是否處于設(shè)計(jì)模式。 /// 描述:DesignMode 在 Visual Studio 產(chǎn)品中存在 Bug ,使用下面的方式可以解決這個(gè)問題。/// </summary> protected new bool DesignMode { get { bool returnFlag = false; #if DEBUG if (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime) { returnFlag = true; } else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToUpper().Equals("DEVENV")) { returnFlag = true; } #endif return returnFlag; } }
重新編譯控件,然后測(cè)試拖動(dòng),操作正常,再無出錯(cuò),搞定!
DevExpress Universal 10月正式發(fā)布今年第二個(gè)重大版本——v21.2,此版本正式官宣支持Visual Studio 2022 & .NET6,同時(shí)與微軟最新發(fā)布的Windows 11完美兼容,全面解決用戶各種使用場(chǎng)景問題。 與時(shí)俱進(jìn),從未止步!
本文轉(zhuǎn)載自:
DevExpress技術(shù)交流群5:742234706 歡迎一起進(jìn)群討論
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: