Hoy una consulta en el foro MSDN me ha parecido muy interesante y por ese motivo y porque la explicación es un poco larga, describiré más detalladamente como poder hacer lo que Roberto Corona necesita.
http://forums.microsoft.com/MSDN-ES/ShowPost.aspx?PostID=3843776&SiteID=11
En resumen Roberto está creando un control de servidor del cual pretende que una propiedad muestre los botones que se encuentren en el formulario para poderlo seleccionar, al etilo de un validador.
Para hacer esto crearé un proyecto web para probar el control y otro proyecto que será el propio control de servidor. La clase del control la llamaré ServerControl1.cs, ya lo sé, muy poco original !!
El control es realmente sencillo:
Nuestro control heredará de WebControl y crearemos la propiedad ControlID para guardar el identificador del botón que queremos controlar
[DefaultProperty("Text")] [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")] public class ServerControl1 : WebControl { [DefaultValue(""), TypeConverter(typeof(ButtonConverter))] public string ControlID { get { object o = ViewState["ControlID"]; if (o == null) return String.Empty; return (string)o; } set { if (ControlID != value) ViewState["ControlID"] = value; } } protected override void RenderContents(HtmlTextWriter output) { if(String.IsNullOrEmpty(ControlID)) output.Write("Tienes que seleccionar un Botón"); else output.Write(ControlID); } }
Lo destacable de este código es la clase ButtonConverter, que es la que se encargará de devolvernos los controles button del formulario para poderlo elegir desde el control, esta clase esta basada en la clase ControlIDConverter.
http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.controlidconverter(VS.80).aspx
La clase ControlIDConverter se deriva de la clase StringConverter y proporciona una lista de id. de control para su presentación en un control de cuadrícula de propiedades en entornos en tiempo de diseño. La clase ControlIDConverter también actúa como clase base para las clases AssociatedControlConverter y ValidatedControlConverter, que son los convertidores de tipos para los controles Web y los controles que admiten atributos de propiedades de validación, respectivamente.
class ButtonConverter : StringConverter { protected virtual bool FilterControl(Control control) private string[] GetControls(IDesignerHost host, object instance) { IContainer container = host.Container; IComponent component = instance as IComponent; if ((component != null) && (component.Site != null)) { container = component.Site.Container; } if (container == null) { return null; } ComponentCollection components = container.Components; ArrayList list = new ArrayList(); foreach (IComponent component2 in components) { Control control = component2 as Control; if(control.GetType().Name == typeof(Button).Name) { list.Add(control.ID); } } list.Sort(Comparer.Default); return (string[])list.ToArray(typeof(string)); } public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) public override bool GetStandardValuesExclusive( ITypeDescriptorContext context) public override bool GetStandardValuesSupported( ITypeDescriptorContext context)
El método a destacar es GetControl que es el que recupera la lista de IDs de los botones y el efecto final es exactamente como el de ControlToValidate de los validadores de Asp.NET.
Ahora ya tenemos nuestra propiedad extendida para utilizar nuestro control de la manera que más nos guste.