【WinForm】Dev 關於改變控件可見屬性時發生異常的問題 System.ArgumentNullException:Value cannot be null.


錯誤提示:

System.ArgumentNullException:Value cannot be null.

Parameter name:dc

at System.Windows.Forms.TextRenderer.MesureText(IDeviceContext dc, String text, Font font, Size proposedSize, TextFormatFlags flags)

……(下面連着一大串異常信息)

 

根據錯誤提示,是因為dc這個參數等於null了,導致調用TextRenderer.MesureText()這個函數報錯。上網搜了一下這個函數的用法,可以看一下:

http://www.voidcn.com/article/p-fmczttqu-nz.html

官網的解釋:

https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.textrenderer.drawtext?redirectedfrom=MSDN&view=netcore-3.1#System_Windows_Forms_TextRenderer_DrawText_System_Drawing_IDeviceContext_System_String_System_Drawing_Font_System_Drawing_Rectangle_System_Drawing_Color_System_Drawing_Color_System_Windows_Forms_TextFormatFlags_

 

總之,這個函數時用於在 Windows 窗體控件上測量和繪制文本,而dc這個參數是繪制文本所使用的設備上下文(Device Context)。設備上下文或許可以理解為要繪制控件的畫布。此時dc為null,說明程序在此處沒有獲取到設備上下文。

根據網上查閱到的資料,我猜測,是因為用TextRenderer.MesureText()繪制控件需要一定時間,而程序頻繁對該控件進行重繪,則可能會發生,另一處還未釋放設備上下文時(釋放函數:ReleaseDC()),這一處就再次調用重繪函數的情況,所以導致dc = null。

 

解決方案:

源代碼中造成異常的語句為:

控件.Visible = false;

 

至今沒有想到什么根本的解決方法,只是換了個思路:既然是控件重繪導致的問題,則避免控件重新繪制即可:

控件.ReadOnly = false;

 

功能實現就好啦~haha

 

學習網址:

https://zhidao.baidu.com/question/264795683.html

設備上下文:https://docs.microsoft.com/zh-cn/cpp/mfc/device-contexts?view=vs-2019

https://www.cnblogs.com/lisuyun/articles/3356696.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM