Editar propiedades que son objetos.

30/07/2003 - 11:10 por Jose Antonio | Informe spam
Cuando en un control de usuario se untiliza la clase Point, Size, etc.,
cuando se editan en la ventana de propiedades, aparece un signo (+) para
expandirlas y poner el valor de la X,Y o altura y anchura, etc.

Sin embargo si creamos una clase nuestra por ejemplo :

Clase TresD que tiene tres propiedades Largo, Ancho y Alto.

Si esta clase TresD forma parte de tu control de usuario, en la ventana de
propiedades no sale el (+) para poder dar valores a Largo, Ancho y Alto.

Se necesito algun atributo especial para que salga?
Donde hay que ponerlo en la clase base o en el control de usuario?


Saludos y gracias.

Preguntas similare

Leer las respuestas

#1 Octavio Hernández
30/07/2003 - 16:50 | Informe spam
Jose A.,

El truco está en que la clase TypeConverter que asocias a la propiedad debe
heredar de ExpandableObjectConverter. Te mando un ejemplo muy parecido a lo
que quieres tomado de un curso que damos (además de mostrar eso, enseña cómo
utilizar el atributo Browsable).

Salu2 - Octavio

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Danysoft.Controls
{
public class RedLabel : System.Windows.Forms.Label
{
public RedLabel()
{
base.ForeColor = Color.Red;
}
[Browsable(false)]
public override Color ForeColor
{
get
{
return base.ForeColor; // podría ser return Color.Red;
}
}

private TVector _vector;
[TypeConverter(typeof(TVector_Converter))]
public TVector Vector { get { return _vector; } set { _vector = value; } }
}

public class TVector_Converter: ExpandableObjectConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type
sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom (context, sourceType);
}

public override object ConvertFrom(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
string[] v = ((string)value).Split(new char[] {','});
return new TVector(int.Parse(v[0]), int.Parse(v[1]), int.Parse(v[2]));
}
return base.ConvertFrom (context, culture, value);
}
}

public struct TVector
{
private int _x, _y, _z;
public TVector(int a, int b, int c) { _x = a; _y = b; _z = c; }
[Browsable(true)]
public int x
{
get { return _x; }
set { _x = value; }
}
[Browsable(true)]
public int y
{
get { return _y; }
set { _y = value; }
}
[Browsable(true)]
public int z
{
get { return _z; }
set { _z = value; }
}
public override string ToString()
{
return _x.ToString() + "," + _y + "," + _z;
}
}
}

"Jose Antonio" escribió en el mensaje
news:%
Cuando en un control de usuario se untiliza la clase Point, Size, etc.,
cuando se editan en la ventana de propiedades, aparece un signo (+) para
expandirlas y poner el valor de la X,Y o altura y anchura, etc.

Sin embargo si creamos una clase nuestra por ejemplo :

Clase TresD que tiene tres propiedades Largo, Ancho y Alto.

Si esta clase TresD forma parte de tu control de usuario, en la ventana de
propiedades no sale el (+) para poder dar valores a Largo, Ancho y Alto.

Se necesito algun atributo especial para que salga?
Donde hay que ponerlo en la clase base o en el control de usuario?


Saludos y gracias.


Respuesta Responder a este mensaje
#2 Jose Antonio
30/07/2003 - 19:27 | Informe spam
Gracias por la ayuda, funciona correctamente:


Saludos.

"Octavio Hernández" escribió en el mensaje
news:%23%
Jose A.,

El truco está en que la clase TypeConverter que asocias a la propiedad


debe
heredar de ExpandableObjectConverter. Te mando un ejemplo muy parecido a


lo
que quieres tomado de un curso que damos (además de mostrar eso, enseña


cómo
utilizar el atributo Browsable).

Salu2 - Octavio

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Danysoft.Controls
{
public class RedLabel : System.Windows.Forms.Label
{
public RedLabel()
{
base.ForeColor = Color.Red;
}
[Browsable(false)]
public override Color ForeColor
{
get
{
return base.ForeColor; // podría ser return Color.Red;
}
}

private TVector _vector;
[TypeConverter(typeof(TVector_Converter))]
public TVector Vector { get { return _vector; } set { _vector value; } }
}

public class TVector_Converter: ExpandableObjectConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type
sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom (context, sourceType);
}

public override object ConvertFrom(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
string[] v = ((string)value).Split(new char[] {','});
return new TVector(int.Parse(v[0]), int.Parse(v[1]), int.Parse(v[2]));
}
return base.ConvertFrom (context, culture, value);
}
}

public struct TVector
{
private int _x, _y, _z;
public TVector(int a, int b, int c) { _x = a; _y = b; _z = c; }
[Browsable(true)]
public int x
{
get { return _x; }
set { _x = value; }
}
[Browsable(true)]
public int y
{
get { return _y; }
set { _y = value; }
}
[Browsable(true)]
public int z
{
get { return _z; }
set { _z = value; }
}
public override string ToString()
{
return _x.ToString() + "," + _y + "," + _z;
}
}
}

"Jose Antonio" escribió en el mensaje
news:%
> Cuando en un control de usuario se untiliza la clase Point, Size, etc.,
> cuando se editan en la ventana de propiedades, aparece un signo (+) para
> expandirlas y poner el valor de la X,Y o altura y anchura, etc.
>
> Sin embargo si creamos una clase nuestra por ejemplo :
>
> Clase TresD que tiene tres propiedades Largo, Ancho y Alto.
>
> Si esta clase TresD forma parte de tu control de usuario, en la ventana


de
> propiedades no sale el (+) para poder dar valores a Largo, Ancho y Alto.
>
> Se necesito algun atributo especial para que salga?
> Donde hay que ponerlo en la clase base o en el control de usuario?
>
>
> Saludos y gracias.
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida