一:背景
1. 講故事
有一次同事找到我,說以下代碼中:btnPlanAppend控件:客戶電腦顯示正常、開發(fā)者電腦調(diào)試時無法顯示文章來源地址http://www.zghlxwxcb.cn/news/detail-712148.html
- btnAppend可以在界面中顯示出來
- btnPlanAppend控件在界面上就是不顯示
private void Check_Privilege()
{
string sPrivilege = ClientUtils.GetPrivilege(g_sUserID, g_sFunction, g_sProgram).ToString();
btnAppend.Visible = SajetCommon.CheckEnabled("INSERT", sPrivilege);
btnPlanAppend.Visible = btnAppend.Visible;
}
二、分析
1. 使用VS調(diào)試
- SajetCommon.CheckEnabled("INSERT", sPrivilege)方法的返回結(jié)果:true;
- btnAppend控件也能正常顯示
- 調(diào)試到這一行(btnPlanAppend.Visible = btnAppend.Visible;)btnAppend.Visible屬性始終返回false.
2. 分析ToolStripItem控件源碼
- 通過此網(wǎng)站https://referencesource.microsoft.com/可以查詢.Net Framework源碼。
- btnAppend與btnPlanAppend控件,都是ToolStripItem控件,找到Visible屬性,代碼如下:
public bool Visible {
get {
return (ParentInternal!=null) && (ParentInternal.Visible) && Available;
}
set {
SetVisibleCore(value);
}
}
- 從代碼中可以看出,出現(xiàn)問題應該是由于ParentInternal不滿足條件。通過Parent英語單詞可以看出,ParentInternal屬性應該是與此控件的父控件有關(guān)系。
- 再看一下ParentInternal屬性的代碼
internal ToolStrip ParentInternal {
get {
return parent;
}
set {
if (parent != value) {
ToolStrip oldParent = parent;
parent = value;
OnParentChanged(oldParent, value);
}
}
}
- 控件parent就應該是保存父控件引用。
- 第一段代碼中Check_Privilege方法,是放在Form_Loaded事件中調(diào)用,可以推斷,調(diào)用Form_Loaded事件時,ToolStripItem還沒有真正的現(xiàn)在Form中顯示出來,parent應該為null.
3. 分析:現(xiàn)場電腦為什么可以正常顯示
- 通過VS的查看,編譯環(huán)境中:目標框架:.NET Framework 2.0??吹竭@個好古老。
- 開發(fā)者電腦沒有.NET Framework 2.0的環(huán)境,調(diào)試時使用是新的.NET Framework庫。
三、總結(jié)
1. 修改代碼
- 通過分析,既然Form_Loaded事件中,獲得到btnAppend.Visible一直False。就不要使用btnAppend.Visible作為中轉(zhuǎn)變量。
- 創(chuàng)建一個臨時變量,btnAppend與btnPlanAppend的Visible都有臨時變量賦值就可以了。
2. 總結(jié)
- .NET Framework 版本很多,版本之間一定有差異,此類問題就是NET Framework差異造成。
文章來源:http://www.zghlxwxcb.cn/news/detail-712148.html
到了這里,關(guān)于記錄一次:Winform的控件的Visible屬性異常問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!