2010-09-15 255 views
6

我正在重構一個程序,其中包含大量根據運行時信息動態創建的 窗體。Visual Studio窗體設計器源代碼的運行時創建

爲了降低系統的複雜程度,我想爲每個表單編寫單獨的代碼文件。 由於表單很多,我正在考慮一種方法來自動執行從運行時收集的數據創建表單源代碼文件的過程。

E.g.如果我有一個名爲EditPeople的表單的運行時實例,我想創建EditPeople.designer.cs的源代碼,以便我可以在Windows窗體設計器中編輯窗體。

你知道是否有一些框架或工具可以簡化這項任務嗎?

+1

鏈接:http://www.oreillynet.com/windows/blog/2004/10/serializing_controls_to_an_ext.html – 2010-09-15 17:58:32

+0

謝謝。我將嘗試使用CodeDom對象來編寫源文件。 – 2010-09-15 18:47:56

+0

解決這個問題有什麼好運? CodeDom聽起來像是可能的解決方案,另一個要搜索的東西是「設計時序列化」 – 2010-09-28 18:04:39

回答

1

我剛纔看到這個問題,以供將來參考,你可以嘗試這樣的事:當你把所有的列表

List<Control> ReturnedCtrls = GetAllControls(MyForm.Controls); 

的:

public static List<Control> GetAllControls(IList ctrls) 
{ 
    List<Control> FormCtrls = new List<Control>(); 
    foreach (Control ctl in ctrls) 
    { 
     FormCtrls .Add(ctl); 
     List<Control> SubCtrls = GetAllControls(ctl.Controls); 
     FormCtrls .AddRange(SubCtrls); 
    } 
    return FormCtrls; 
} 

您可以使用此功能,這樣控件你可以這樣做:

foreach(Control ctrl in ReturnedCtrls) 
{ 
    // Generate Designer Source using ctrl properties 
    ctrl.Left 
    ctrl.Top 
    // etc... 
} 
0

如果意圖是重新創建表單的代碼我認爲使用.net反射器http://www.red-gate.com/products/reflector/及其插件FileDisassembler denisbauer.com/NETTools/FileDisassembler.aspx(我不能超過1超鏈接:))將幫助您在短時間內反編譯完整的項目。

你不覺得嗎?

0

2 CodeCanvas - 沒辦法。 Reflector給你一個類,而任務是序列化所有給定類的所有實例。 例如,類包含代碼:

for(int i=0; i<2;i++){ 
Controls.Add(new Button()); 
} 

任務是使與下面的代碼*了.Designer.cs:

//... 
InitializeComponent() 
{ 
    //... 
    button1 = new Button(); 
    button2 = new Button(); 
    button3 = new Button(); 
    //... 
    this.Controls.Add(button1); 
    this.Controls.Add(button2); 
    this.Controls.Add(button3); 
} 
//... 

那絕對不是什麼反射給你。 CodeDom的序列化可以發揮作用,但它遵循自己的規則,不太可能給出完整的表單快照。

相關問題