2011-02-09 9 views
11

Tengo un control de usuario personalizado DatePicker.cs. Dentro de otra pieza de código tengo una colección de controles donde estoy verificando el tipo de control y haciendo algo de lógica según el tipo. Mi problema es el siguiente:Cómo obtener el "tipo de letra" de un control de usuario personalizado

typeof(DatePicker) 

dé como resultado:

{Name = "DatePicker" FullName = "cusitecore.cedarsc.UserControls.DatePicker"} 

Pero cuando corro el depurador y mirar el tipo de control que se encuentra en mi formulario web que es:

{Name = "cedarsc_usercontrols_datepicker_ascx" FullName = "ASP.cedarsc_usercontrols_datepicker_ascx"} 

Estas dos cosas no son iguales, por lo que no se evalúa la lógica correcta. Intenté usar Type.GetType ("ASP.cedarsc_usercontrols_datepicker_ascx") pero esto devuelve null.

EDITAR

Aquí es lo que estoy tratando de hacer:

private readonly Dictionary<Type, ControlType?> _controlTypes = new Dictionary<Type, ControlType?> 
    { 
     {typeof(CheckBox), ControlType.CheckBox}, 
     {typeof(CheckBoxList), ControlType.CheckBoxList}, 
     {typeof(DropDownList), ControlType.DropDownList}, 
     {typeof(HiddenField), ControlType.HiddenField}, 
     {typeof(ListBox), ControlType.ListBox}, 
     {typeof(RadioButton), ControlType.RadioButton}, 
     {typeof(RadioButtonList), ControlType.RadioButtonList}, 
     {typeof(TextBox), ControlType.TextBox}, 
     {typeof(Label), ControlType.Label}, 
     {typeof(DatePicker), ControlType.DatePicker}, 
     {typeof(CustomSelect), ControlType.CustomSelect} 
    }; 

private void PopulateFields(Control control) 
{ 
    ControlType? controlType; 
    _controlTypes.TryGetValue(control.GetType(), out controlType); 

    // recurse over the children 
    if (control.Controls.Count > 0 && controlType == null) // don't want to recurse into children of controls we are reading values of 
    { 
     foreach(Control childControl in control.Controls) 
     { 
      PopulateFields(childControl); 
     } 
    } 

    if (controlType != null) 
    { 
     switch (controlType) 
     { 
      case ControlType.CheckBox: 
      case ControlType.RadioButton: 
       CheckBox checkBox = control as CheckBox; 
        if (checkBox != null) 
         _fields.AddFieldValue(checkBox.ID, checkBox.Checked ? "Checked" : "Not Checked"); 
        break; 
      case ControlType.CheckBoxList: 
      case ControlType.ListBox: 
      case ControlType.RadioButtonList: 
       ListControl listControl = control as ListControl; 
       if (listControl != null) 
        _fields.AddFieldValue(listControl.ID, String.Join(", ", listControl.Items.Cast<ListItem>().Where(item => item.Selected).Select(item => item.Value).ToArray())); 
       break; 
      case ControlType.DropDownList: 
       DropDownList dropDownList = control as DropDownList; 
       if (dropDownList != null) 
        _fields.AddFieldValue(dropDownList.ID, dropDownList.SelectedValue); 
       break; 
      case ControlType.HiddenField: 
       HiddenField hiddenField = control as HiddenField; 
       if (hiddenField != null) 
        _fields.AddFieldValue(hiddenField.ID, hiddenField.Value); 
       break; 
      case ControlType.TextBox: 
       TextBox textBox = control as TextBox; 
       if (textBox != null) 
        _fields.AddFieldValue(textBox.ID, textBox.Text); 
       break; 
      case ControlType.DatePicker: 
       DatePicker datePicker = control as DatePicker; 
       if (datePicker != null) 
        _fields.AddFieldValue(datePicker.ID, datePicker.Text); 
       break; 
      case ControlType.CustomSelect: 
       CustomSelect customSelect = control as CustomSelect; 
       if(customSelect != null) 
        _fields.AddFieldValue(customSelect.ID, customSelect.SelectedValue); 
       break; 
      case ControlType.Label: 
       Label label = control as Label; 
       if(label != null) 
        _fields.AddFieldLabel(label.AssociatedControlID, label.Text); 
       break; 
      default: 
       throw new Exception("Unhandled Control"); 
     } 
    } 
} 
+0

¿Puede proporcionarnos algo más de contexto? ¿Cómo se ve el código que está tratando de realizar la comparación entre los dos tipos? –

+4

ASP.NET crea su propio tipo heredado del control de usuario.Use la palabra clave 'is' para las comparaciones y pruebe' control.GetType(). BaseType' para la extracción. –

+0

@Jaroslav esta es la respuesta. Ponlo en la parte inferior para que podamos darte crédito :) – Kyle

Respuesta

11

ASP.NET crea su propio tipo de heredado de los controles del usuario.

Para realizar comparaciones, utilice el operador is.
Para extracciones use control.GetType().BaseType.

+0

El único problema con esto parece ser que la llamada .BaseType en un control nativo devuelve "WebControl". Por ejemplo, para un control que es un TextBox, control.GetType(). BaseType es "WebControl". ¿Alguna idea? – Kyle

+0

De acuerdo con las convenciones de nomenclatura, classname no debe contener '_'. Entonces, si el tipo 'EndsWith (" _ ascx ")', puede estar bastante seguro de que es un control de usuario y extraer el nombre como se explica en mi respuesta. –

1

Usted podría tratar de usar la palabra clave is. No es exactamente lo mismo, pero si todo lo que intentas hacer es determinar si un objeto es de cierto tipo (o extiende/implementa una clase/interfaz), entonces eso debería funcionar.

Por supuesto, dependiendo de su código esto puede no ayudar.

+0

Acabo de tener este problema hoy y (myControl es TypeICareAbout) funcionó. La palabra clave "es" comprueba si la variable se puede convertir al tipo deseado sin arrojar un error. Ver: http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.80).aspx – William

2

Tu publicación no explica por completo cómo piensas utilizarla, pero nunca tuve ningún problema con el uso de typeof() en mis eventos. Por ejemplo, me gustaría tener la siguiente sentencia if en un caso se trata de cernido:

if (sender.GetType() == typeof(Transparent_Panel)) 

donde estaba Transparent_Panel un control de usuario personalizado. Nunca hice ningún trabajo especial con Tansparent_Panel para hacer que esto funcione.

1

ASP.NET 2.0 y posterior compilará el UserControl en el directorio temporal de archivos ASP.NET a pedido, por lo que el tipo que está inspeccionando cuando se mira el tipo de control en el depurador se genera automáticamente por el Motor de compilación ASP.NET. La buena noticia es que este tipo hereda del tipo DatePicker, por lo que el siguiente código debería funcionar para comprobar si una determinada UserControl es en realidad un DatePicker:

typeof(DatePicker).IsAssignableFrom(userControl.GetType().BaseType) 

Como alternativa, siempre se puede crear una instancia de la DatePickerUserControl en tiempo de ejecución y verificar si hay equivalencia de tipos a través de:

LoadControl(typeof(DatePicker)).GetType() == userControl.GetType() 

Fuentes: Compilation and Deployment in ASP.NET 2.0

+0

gracias por la explicación adicional sobre este – Kyle

Cuestiones relacionadas