2010-09-15 19 views
6

Estoy refactorizando un programa que contiene muchos formularios creados dinámicamente a partir de información en tiempo de ejecución.Creación en tiempo de ejecución del código fuente del diseñador de formulario de Visual Studio

Para reducir el nivel de complejidad del sistema, pensé en escribir archivos de códigos individuales para cada uno de estos formularios. Dado que los formularios son muchos, estoy pensando en una forma de automatizar el proceso de creación de los archivos de código fuente de los formularios a partir de los datos recopilados en tiempo de ejecución.

E.g. si tengo una instancia en tiempo de ejecución de un formulario llamado EditPeople, quiero crear el código fuente de EditPeople.designer.cs, para que luego pueda editar el formulario en el diseñador de formularios de Windows.

¿Sabes si hay algún marco o herramienta que pueda simplificar esta tarea?

+1

Enlace: http://www.oreillynet.com/windows/blog/2004/10/serializing_controls_to_an_ext.html –

+0

Gracias. Trataré de usar objetos CodeDom para escribir archivos fuente. –

+0

¿Alguna suerte para resolver esto? CodeDom parece una posible solución, otra cosa que hay que buscar es la "serialización en tiempo de diseño" –

Respuesta

1

acabo de ver a esta pregunta, para referencia futura que podría intentar algo como esto:

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

Se puede utilizar esta función como esta:

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

El cuando se tiene una lista de todos los controles se puede hacer algo como esto:

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

Si la intención es volver a crear la El código del formulario creo que usar .net reflector http://www.red-gate.com/products/reflector/ junto con su complemento FileDisassembler denisbauer.com/NETTools/FileDisassembler.aspx (no puedo publicar más de 1 hipervínculo :)) lo ayudaría a descompilar el proyecto completo en poco tiempo.

¿No crees?

0

2 CodeCanvas - De ninguna manera. Reflector te da una clase mientras que la tarea es serializar todas las instancias de todas las clases dadas. Por ejemplo, la clase contiene código:

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

tarea es hacer .Designer.cs * con el código siguiente:

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

y que definitivamente no es lo que le da el reflector.

La serialización de CodeDom podría hacer el truco, pero actúa siguiendo sus propias reglas y es poco probable que proporcione la instantánea completa de la forma.

Cuestiones relacionadas