.NET框架-Winform技術中元件被容器引用陷阱
作者:vuefine
文獻: msdn library
平臺:.NET 2.0+
.net(C#) WinForm開發,因為是視覺化設計,所以可以通過手動,直接將某個需要的元件加入到設計介面中,.net會自動將初始化這個元件,包括屬性設定等,新增到InitilizeComponent()中,並且這個元件會新增相應的父元件中。所有的這些都是.net自動完成的。
但是,某些場景下,我們需要手寫程式碼改變元件所屬的父容器。比如某些元件原來屬於父容器A,但是我們想將這些元件調整到父容器B中,此時一個有趣的問題出現。
以下3個元件原來位於this:
this.Controls.Add(this.operRateUC);
this.Controls.Add(this.personProductUg);
this.Controls.Add(this.procedingPanel);
想調整這3個元件到adjustPanel元件。如下面的程式碼所示:
private void moveToAdjustPanel()
{
//AdjustablePanel是一個Control類
AdjustablePanel adjustPanel = new AdjustablePanel();
foreach (Control ultraControl in this.Controls)
{
if (ultraControl.GetType() == typeof(UltraGrid) ||
ultraControl.GetType() == typeof(UltraChart) ||
ultraControl.GetType() == typeof(Panel))
{
adjustPanel.Controls.Add(ultraControl);
}
}
}
這種批量移動元件到另一個父元件的方式是失敗的。
adjustPanel每次新新增了一個元件後,this.Controls的元件就會改變,並且未丟擲foreach迭代器被修改的異常。這不知道是不是微軟的一個bug。
在bbs.csdn.net上發帖求助,回覆,大都認為foreach遍歷會報錯,但是的確編譯器未丟擲任何異常。我重新再編譯器重新做了一個簡單的測試,結果,發現foreach遍歷的確不報錯,但是得不到想要的結果。
測試程式碼如下,測試的預期是將2個Button元件從this中移動到groupBox1中。但是結果卻是this 中依然有button1,只有button2被移動到了groupBox1中。
奇怪點:
foreach迭代器被修改,為什麼不報錯???
為什麼只有button2移動到groupBox1中了???
public Form1()
{
InitializeComponent();
moveButtonsToGroupBox();
//controlNames的結果為{groupBox1,button1}
var controlNames = showAllChildControls(this);
//controlNamesInGroup的結果為{button2}
var controlNamesInGroup = showAllChildControls(this.groupBox1);
}
/// <summary>
/// 移動位於Form上的按鈕到GroupBox中
/// </summary>
private void moveButtonsToGroupBox()
{
foreach(Control c in this.Controls)
{
if (c.GetType() == typeof(Button))
this.groupBox1.Controls.Add(c);
}
}
/// <summary>
/// 展示c控制元件的所有子元件的Name
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
private List<string> showAllChildControls(Control c)
{
if (c == null) return null;
List<string> controlNames = new List<string>();
foreach(Control chl in c.Controls)
{
controlNames.Add(chl.Name);
}
return controlNames;
}
相關文章
- winform 自定義容器控制元件ORM控制元件
- WinForm引用ActiveX元件,對Com元件的學習ORM元件
- Fedora中的容器技術
- Microsoft .NET Remoting 框架技術ROSREM框架
- 探秘Kubernetes:在本地環境中玩轉容器技術
- .NET混合開發解決方案7 WinForm程式中通過NuGet管理器引用整合WebView2控制元件ORMWebView控制元件
- WPF窗體中嵌入/使用WinForm類/控制元件(基於.NET Core)ORM控制元件
- Fedora 中的容器技術:systemd-nspawn
- "陷阱"技術探秘 ──動態漢化Windows技術的分析 (轉)Windows
- 陷阱"技術探秘 ──動態漢化Windows技術的分析 (轉)Windows
- C++的引用技術C++
- Kubernetes – Google分散式容器技術初體驗Go分散式
- Docker技術( 容器虛擬化技術 )Docker
- 容器技術之LXC
- Docker--容器技術Docker
- docker容器技術原理Docker
- 優秀技術人的管理陷阱(轉)
- winform 換膚元件ORM元件
- .NET 開源免費圖表元件庫,Winform,WPF 通用元件ORM
- Asp.net web框架Nancy的技術文章整理ASP.NETWeb框架NaN
- 解析.Net框架下的XML程式設計技術框架XML程式設計
- 容器技術之Docker映象Docker
- 容器技術之Dockerfile (一)Docker
- 容器技術之Dockerfile(二)Docker
- C/S框架網介紹|.NET快速開發平臺|Winform開發框架框架ORM
- 微信小程式中引用vant元件庫微信小程式元件
- Network Policy - 每天5分鐘玩轉 Docker 容器技術(171)Docker
- [VB.net][WinForm]Panel控制元件移動\滑鼠拖動ORM控制元件
- 我dotNET 所以我 Skin (WinForm 控制元件再選) (轉)ORM控制元件
- 容器技術之容器引擎與江湖門派
- .NET 5 開源工作流框架elsa技術研究框架
- winform中更新UI控制元件的方案介紹ORMUI控制元件
- 關於.NET中的Server push技術Server
- C/C++ 中的算術及其陷阱C++
- Winform引用mshtml程式集的問題 (轉)ORMHTML
- 容器技術的未來——京東雲技術專訪
- Kubernetes Dashboard - 每天5分鐘玩轉 Docker 容器技術(173)Docker
- 容器技術之Docker網路Docker