【问题标题】:Run-time creation of Visual Studio form designer source codeVisual Studio 表单设计器源代码的运行时创建
【发布时间】:2011-04-12 19:35:38
【问题描述】:

我正在重构一个包含大量 从运行时信息动态创建的表单。

为了降低系统的复杂程度,我想为每种形式编写单独的代码文件。 由于表单很多,我正在考虑一种方法来自动化从运行时收集的数据创建表单源代码文件的过程。

例如如果我有一个名为 EditPeople 的表单的运行时实例,我想创建 EditPeople.designer.cs 的源代码,这样我就可以在 windows 表单设计器中编辑表单。

你知道是否有一些框架或工具可以简化这项任务?

【问题讨论】:

  • 谢谢。我会尝试使用 CodeDom 对象来编写源文件。
  • 能解决这个问题吗? CodeDom 听起来像是可能的解决方案,要搜索的另一件事是“设计时序列化”
  • @DK:是的,我调查了CodeDom,似乎是可以的,但是由于它看起来也太复杂了,所以我最终选择手动重新创建表单...

标签: c# .net winforms visual-studio-2010 c#-4.0


【解决方案1】:

我刚刚看到这个问题,为了将来参考,你可以尝试这样的事情:

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;
} 

你可以这样使用这个函数:

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

当您拥有所有控件的列表时,您可以执行以下操作:

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

【讨论】:

    【解决方案2】:

    如果打算重新创建表单的代码,我认为使用 .net 反射器 http://www.red-gate.com/products/reflector/ 及其插件 FileDisassembler denisbauer.com/NETTools/FileDisassembler.aspx(我不能发布超过 1 个超链接 :))会帮助你在短时间内反编译整个项目。

    你不觉得吗?

    【讨论】:

      【解决方案3】:

      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 序列化可以解决问题,但它按照自己的规则行事,不太可能提供完整的表单快照。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 2010-12-30
        • 2011-06-29
        • 1970-01-01
        • 2012-10-20
        • 2019-02-23
        • 2011-04-03
        相关资源
        最近更新 更多