2010-05-03 22 views
5

[EDIT] Para que quede claro, sé cómo obtener una lista de formularios mediante reflexión. Me preocupa más la cuadrícula de propiedades del tiempo de diseño.Visual Studio Design Time Property - Lista de formularios desplegable

Tengo un control de usuario con una propiedad pública del tipo Formulario.
Quiero ser capaz de seleccionar un formulario en el momento del diseño de un menú desplegable.
Quiero rellenar la lista desplegable de formulario de un espacio de nombres conjunto: UI.Foo.Forms

Esto funcionaría como si tuviera una propiedad pública de Control. En el momento del diseño, la propiedad completará automáticamente un menú desplegable con todos los controles en el formulario, para que pueda seleccionar. Solo quiero llenarlo con todos los formularios en un espacio de nombres.

¿Cómo puedo hacer esto? Espero ser lo suficientemente claro para que no haya confusión. Estoy buscando algunos ejemplos de código si es posible. Estoy tratando de evitar tener que pasar demasiado tiempo en esto cuando tengo otras fechas límite para cumplir.

Gracias por su ayuda con anticipación.

Respuesta

7

Usted puede conseguir fácilmente a través de las clases de Reflexión:

var formNames = this.GetType().Assembly.GetTypes().Where(x => x.Namespace == "UI.Foo.Forms").Select(x => x.Name); 

Suponiendo que está llamando esto desde código en el mismo conjunto de sus formas, obtendrá los nombres de todos los tipos que se encuentran en el Espacio de nombres "UI.Foo.Forms". A continuación, puede presentar esto en el menú desplegable y, finalmente, crear una instancia de lo que es seleccionado por el usuario a través de la reflexión, una vez más:

Activator.CreateInstance(this.GetType("UI.Form.Forms.FormClassName")); 

[Editar] Adición de código para la materia de tiempo de diseño:

En su control se puede crear una propiedad de formulario como tal:

[Browsable(true)] 
[Editor(typeof(TestDesignProperty), typeof(UITypeEditor))] 
[DefaultValue(null)] 
public Type FormType { get; set; } 

que hace referencia al tipo de editor que debe definirse. El código es bastante autoexplicativo, con una cantidad mínima de ajustes, es probable que pueda obtener exactamente lo que desea.

public class TestDesignProperty : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.DropDown; 
    } 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     var edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 

     ListBox lb = new ListBox(); 
     foreach(var type in this.GetType().Assembly.GetTypes()) 
     { 
      lb.Items.Add(type); 
     } 

     if (value != null) 
     { 
      lb.SelectedItem = value; 
     } 

     edSvc.DropDownControl(lb); 

     value = (Type)lb.SelectedItem; 

     return value; 
    } 
} 
+0

Sabía cómo obtener la lista de formularios, pero no sé exactamente cómo incluirlos en la Cuadrícula de propiedades en el momento del diseño, en la vista de diseño, para mi propiedad pública. –

+0

Actualicé mi respuesta para abordar los requisitos de tiempo de diseño. – CMerat

+1

Gracias Merat, tengo que esperar otras 14 horas para aceptar (ir a buscar pavos, por lo que podría ser un par de días :), pero funcionó a la perfección. –

2

El menú desplegable no se cierra cuando el artículo se selecciona haciendo clic en él, por lo que este podría ser útil:

asignar el controlador de eventos click para el cuadro de lista y añadir la función de controlador de eventos

public class TestDesignProperty : UITypeEditor 
{ 

    // ... 

    IWindowsFormsEditorService editorService; 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
     { 
      // ... 
      editorService = edSvc ; // so can be referenced in the click event handler 

      ListBox lb = new ListBox(); 
      lb.Click += new EventHandler(lb_Click); 
      // ... 
     } 



    void lb_Click(object sender, EventArgs e) 
    { 
     editorService.CloseDropDown(); 
    } 

} 
Cuestiones relacionadas