Bueno hoy si entendi perfectamente lo que necesitabas hacer y despues de leer un monton (porque m parecio interesante) y buscar encontre 2 formas pero ninguna de las 2 esta completa te las explicare a continuacion:
Primera Forma:Yo pense q estaba un poco facil, entonces lo q c m ocurrio fue crear una propiedad de la siguiente manera:
Property CajaParent() As ArrayList
Get
Return BuscarControl
End Get
Set(ByVal value As ArrayList)
End Set
End Property
Entonces de esta manera va a cargar el Object Collection Editor, que es el editor de columnas o el tipido editor de agregar y eliminar y establecer el orden, te lo carga y todo los controles pero a mi no m gusto xq como q queda abierta la posibilidad de agregar y quitar y hasta cambiar el orden en tu Array.
Siempre q vs enlaces una coleccion como una propiedad te va a cargar el Object Collection Editor, entonces esta no funcionaba mucho x eso.
Nota. No se realmente si habra forma de modificar o no eso q no se pueda agregar ni eliminar elementos de la coleccion eso ya no intente porque m puse a pensar en otra manera.
Segunda Forma:Vaia despues de eso, m puse a pensar q la forma era utilizar atributos, yo m acordaba q antes (no m acuerdo en q programa
) habia creado una clase, habia establecido atributos y hacia algo distinto, no era igual pero si parecido.
Entonces despues de buscar y de buscar encontre que tenemos q utilizar el atributo TypeConverter, bueno este en si es una clase la cual se encarga de convertir tipos a otros tipos y de esa manera de viceversa.
Entonces justo en la MSDN aparece un ejemplo de lo q necesitas y te coloco como queda:
MSDN explica que hay q crear una clase aparte y heredar la clase
StringConverter y sustituir 4 metodos:
Imports System.ComponentModel
Public Class ListaItem
Inherits TypeConverter
#Region "Metodos remplazados de la clase base"
Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
' Pasa o dimensiona los valores internos de la clase
Dim svc As New StandardValuesCollection(values)
Return svc
End Function
Public Overloads Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
If sourceType Is GetType(String) Then
Return True
Else
Return MyBase.CanConvertFrom(context, sourceType)
End If
End Function
Public Overloads Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
If value.GetType() Is GetType(String) Then
Dim strTmp As String = value.ToString
' Verificamos si el valor ya esta ingresado en la lista de valores
If Not values.Contains(strTmp) Then
' Si no se encuentra en la lista lo agregamos
values.Add(strTmp)
values.Sort()
End If
' Returns the integer value to assign to the property.
Return strTmp
Else
Return MyBase.ConvertFrom(context, culture, value)
End If
End Function 'ConvertFrom
#End Region
Private values As ArrayList
Public Sub New()
' Initializes the standard values list with defaults.
values = New ArrayList(New String {"1", "2", "3", "4", "5"})
End Sub 'New
En conclusion lo q hace la clase es que cuando llamemos al atributo TypeConverter en nuestra propiedad, va a convertir la coleccion a valores estandares o en este caso String, y como es una coleccion la va a cargar en si como si fuera combobox.
Despues en la clase de tu control tendriamos q escribir la propiedad de la siguiente manera:
<TypeConverter(GetType(ListaItem))> _
Public Property TestInt() As String
Get
Return Me.strc
End Get
Set(ByVal Value As String)
If Value.GetType() Is GetType(String) Then
Me.strc = Value
End If
End Set
End Property
Private strc As String
Entonces nosotros ibamos a guardar el valor String, de alli para pasarlo tenemos q llamar al metodo de obtener la coleccion de la clase q creamos y nos va a retornar el valor real.
Esta manera seria la mas facil y mas util porque estamos capturando el String y de alli lo convertimos al tipo de datos q hayamos guardado en el arraylist y sin problemas!
Ahora viene el problema:La segunda forma es exactamente lo q necesitas pero x estar en una clase y mas independiente de nuestro control, no hay forma de pasarle la coleccion de controles del Parent, es alli el problema xq no funciona.
Empeze a inventar y todo, intentandole pasar por el constructor pero da problemas xq al aplicar el atributo TypeConverter no permite pasar algun parametro, porque realmente
al aplicar el atributo no se esta instanciando.
Por tanto, no e encontrado una forma de pasarle los controles a la clase y de esa manera q a partir de alli se cree el arraylist.
Te lo dejo el codigo de esa manera por si encontras una forma de pasarle la coleccion de controles a la clase y asi generar la propiedad. Pero realemente invente de todo y no pude nunk pasarlo.
O bueno, despues ahora en la mañana m puse a pensar y creo q llegue a la conclusion de q
no c puede hacer de esa manera q una propiedad en tiempo diseño, cargue controles de esa manera como si fuera un ComboBox!.
A veces una comparativa sencilla es ver si hay algun control de VS q implemente eso, o fijarse q maneras utilizaron ellos para realizar algo similar! Y yo q sepa creo q ningun control de VS implementa eso.
Y si t acordas las propiedades AcceptButton y CancelButton, son del Formulario, osea el control q contiene a estos por tanto x eso creo q lo logran listar. En cambio nosotros estamos intentado acceder al padre no a los hijos de un control.
Mi Solucion:Yo lo q haria seria mejor hacer una propiedad String, y q alli el programador escriba el nombre del control al cual desea la conexion, y ya alli con el nombre en el control creo q ya podes hacer las validaciones.
No es la mejor solucion, pero solucion sencilla y como solo el nombre del control necesitas entonces siento yo q seria la mejor! Al igual podes validar la propiedad q solo aceptes nombres de controles existentes!
Espero q t sirva o si encontrar alguna forma de pasarle la coleccion a la segunda forma que te puse m avisas!!
Aqui te dejo el link de la MSDN donde explica como crear una lista para una propiedad en tiempo diseño:
http://msdn.microsoft.com/es-es/library/ayybcxe5(VS.80).aspxPD:Mi segunda solucion quisas seria implementar una Interfaz como hacen con el AcceptButton, pero todavia no se muy bien como se haria, entonces en eso estoy pensando! Te comento si encuentro algo!