Edicion de propiedades tipo struct en la paleta de propiedades

23/02/2006 - 16:08 por Alvaro | Informe spam
Buen dia;

Tengo este problema;

Declaro un struct myNumber, y en un UserControl MyControl declaro una
propiedad de tipo myNumber llamada NumberComposition, quiero que en la
paleta de propiedades de los controles creados de tipo MyControl me
aparezca la propiedad de la misma forma como aparecen Font, Location o Size.

¿Que debo hacer?




Ver codigo:

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

namespace My.Windows.Controls
{
public struct myNumber {
public readonly Int32 Precision;
public readonly Int32 Scale;
public Number(Int32 precision,Int32 scale ){
Precision = precision;
Scale = scale;
}
}
/// <summary>
/// Descripción breve de Mycon.
/// </summary>
public class MyControl: System.Windows.Forms.UserControl
{
/// <summary>
/// Variable del diseñador requerida.
/// </summary>
private System.ComponentModel.Container components = null;
private myNumber _numbercomposition = new Number(13,0);

public MyControl()
{
// Llamada necesaria para el Diseñador de formularios Windows.Forms.
InitializeComponent();

// TODO: agregar cualquier inicialización después de llamar a
InitializeComponent

}

public myNumber NumberComposition{
get{
return this._numbercomposition;
}
set{
if (this._numbercomposition.ToString() == value.ToString())
return;
this._numbercomposition = value;
if(this.NumberType == NumericType.Integer &&
this._numbercomposition.Scale > 0 )
MessageBox.Show("Valor de NumberComposition no válida para
NumberType.Integer");
}
}

/// <summary>
/// Limpiar los recursos que se estén utilizando.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Código generado por el Diseñador de componentes
/// <summary>
/// Método necesario para admitir el Diseñador. No se puede modificar
/// el contenido del método con el editor de código.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

Preguntas similare

Leer las respuestas

#1 Rodrigo Díaz
23/02/2006 - 23:23 | Informe spam
Si decoras tu propiedad con:
[System.ComponentModel.Browsable(true)]
??


"Alvaro" wrote:

Buen dia;

Tengo este problema;

Declaro un struct myNumber, y en un UserControl MyControl declaro una
propiedad de tipo myNumber llamada NumberComposition, quiero que en la
paleta de propiedades de los controles creados de tipo MyControl me
aparezca la propiedad de la misma forma como aparecen Font, Location o Size.

¿Que debo hacer?




Ver codigo:

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

namespace My.Windows.Controls
{
public struct myNumber {
public readonly Int32 Precision;
public readonly Int32 Scale;
public Number(Int32 precision,Int32 scale ){
Precision = precision;
Scale = scale;
}
}
/// <summary>
/// Descripción breve de Mycon.
/// </summary>
public class MyControl: System.Windows.Forms.UserControl
{
/// <summary>
/// Variable del diseñador requerida.
/// </summary>
private System.ComponentModel.Container components = null;
private myNumber _numbercomposition = new Number(13,0);

public MyControl()
{
// Llamada necesaria para el Diseñador de formularios Windows.Forms.
InitializeComponent();

// TODO: agregar cualquier inicialización después de llamar a
InitializeComponent

}

public myNumber NumberComposition{
get{
return this._numbercomposition;
}
set{
if (this._numbercomposition.ToString() == value.ToString())
return;
this._numbercomposition = value;
if(this.NumberType == NumericType.Integer &&
this._numbercomposition.Scale > 0 )
MessageBox.Show("Valor de NumberComposition no válida para
NumberType.Integer");
}
}

/// <summary>
/// Limpiar los recursos que se estén utilizando.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Código generado por el Diseñador de componentes
/// <summary>
/// Método necesario para admitir el Diseñador. No se puede modificar
/// el contenido del método con el editor de código.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

Respuesta Responder a este mensaje
#2 Eduardo A. Morcillo [MS MVP VB]
24/02/2006 - 02:48 | Informe spam
Tienes que hacer dos cosas. La primera es usar propiedades en lugar de
campos publicos en la estructura. Y la segunda es agregar el atributo
TypeConverter a la estructura, indicando ExpandableObjectConverter como la
clase para la conversion de la estructura.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
#3 Eduardo A. Morcillo [MS MVP VB]
25/02/2006 - 06:20 | Informe spam
Bueno, en un principio tenias los valores como readonly y por lo tanto omiti
cosas en mi respuesta. Si vas a editarhay que ir un paso mas alla y crear tu
propia clase derivada de TypeConverter que realice las operaciones de
conversion que necesitan el diseñador y la ventana de propiedades. Aqui te
paso un ejemplo completo:

using System;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Reflection;
using System.Globalization;
using System.Windows.Forms;

namespace OpenSystems.Common.Resources {

public class NumberConverter : ExpandableObjectConverter {

public override bool CanConvertTo(
ITypeDescriptorContext context,
Type destinationType) {

// Puede convertir a InstanceDescriptor
if (destinationType == typeof(InstanceDescriptor))
return true;

return base.CanConvertTo(context, destinationType);

}

public override object ConvertTo(
ITypeDescriptorContext context,
CultureInfo culture,
object value,
Type destinationType) {

// Convierto a InstanceDescriptor que el diseñador
// usa para generar el codigo de inicializacion
if (destinationType == typeof(InstanceDescriptor)) {

Number n = (Number) value;

// Obtengo el constructor
ConstructorInfo constructor = typeof(Number).GetConstructor(
new Type[] { typeof(int), typeof(int) });

// Creo el InstanceDescriptor con
// el constructor y los valores para
// los parametros del constructor
return new InstanceDescriptor(
constructor, new object[] { n.Precision, n.Scale });

} else if (destinationType == typeof(string)) {

// Hago la conversion a string para
// visualizar los valores en lugar
// del nombre de la estructura en
// la ventana de propiedades

Number n = (Number) value;

return n.Precision.ToString() + ", " + n.Scale.ToString();

}

return base.ConvertTo(context, culture, value, destinationType);

}

public override bool CanConvertFrom(
ITypeDescriptorContext context,
Type sourceType) {

// Puedo convertir desde string.
// Esto habilita la edicion en la
// linea de la propiedad en la ventana de
// propiedades
if (sourceType == typeof(string))
return true;

return base.CanConvertFrom(context, sourceType);

}

public override object ConvertFrom(
ITypeDescriptorContext context,
CultureInfo culture,
object value) {

// Convierto desde string. Desde ya que
// este codigo esta simplificado para el ejemplo
if (value is string) {

string[] valores = ((string) value).Split(',');

return new Number(int.Parse(valores[0]),
int.Parse(valores[1]));

}

return base.ConvertFrom(context, culture, value);

}

public override bool
GetCreateInstanceSupported(ITypeDescriptorContext context) {
return true;
}

public override object CreateInstance(
ITypeDescriptorContext context,
System.Collections.IDictionary propertyValues) {

return new Number((int) propertyValues["Precision"], (int)
propertyValues["Scale"]);

}

}

[TypeConverter(typeof(NumberConverter))]
public struct Number {

private int _precision;
private int _scale;

public int Precision {
get { return _precision; }
set { _precision = value; }
}

public int Scale {
get { return _scale; }
set { _scale = value; }
}

public Number(int precision, int scale) {
_precision = precision;
_scale = scale;
}

}

public class MiControl : UserControl {

private Number _number = new Number(12, 4);

[DefaultValue(typeof(Number), "12, 4")]
public Number Number {
get { return _number; }
set { _number = value; }
}

}

}


Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
#4 Alvaro
25/02/2006 - 18:57 | Informe spam
Excelente... Muchas gracias por tú valiosa colaboración

Eduardo A. Morcillo [MS MVP VB] wrote:

Bueno, en un principio tenias los valores como readonly y por lo tanto omiti
cosas en mi respuesta. Si vas a editarhay que ir un paso mas alla y crear tu
propia clase derivada de TypeConverter que realice las operaciones de
conversion que necesitan el diseñador y la ventana de propiedades. Aqui te
paso un ejemplo completo:

using System;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Reflection;
using System.Globalization;
using System.Windows.Forms;

namespace OpenSystems.Common.Resources {

public class NumberConverter : ExpandableObjectConverter {

public override bool CanConvertTo(
ITypeDescriptorContext context,
Type destinationType) {

// Puede convertir a InstanceDescriptor
if (destinationType == typeof(InstanceDescriptor))
return true;

return base.CanConvertTo(context, destinationType);

}

public override object ConvertTo(
ITypeDescriptorContext context,
CultureInfo culture,
object value,
Type destinationType) {

// Convierto a InstanceDescriptor que el diseñador
// usa para generar el codigo de inicializacion
if (destinationType == typeof(InstanceDescriptor)) {

Number n = (Number) value;

// Obtengo el constructor
ConstructorInfo constructor = typeof(Number).GetConstructor(
new Type[] { typeof(int), typeof(int) });

// Creo el InstanceDescriptor con
// el constructor y los valores para
// los parametros del constructor
return new InstanceDescriptor(
constructor, new object[] { n.Precision, n.Scale });

} else if (destinationType == typeof(string)) {

// Hago la conversion a string para
// visualizar los valores en lugar
// del nombre de la estructura en
// la ventana de propiedades

Number n = (Number) value;

return n.Precision.ToString() + ", " + n.Scale.ToString();

}

return base.ConvertTo(context, culture, value, destinationType);

}

public override bool CanConvertFrom(
ITypeDescriptorContext context,
Type sourceType) {

// Puedo convertir desde string.
// Esto habilita la edicion en la
// linea de la propiedad en la ventana de
// propiedades
if (sourceType == typeof(string))
return true;

return base.CanConvertFrom(context, sourceType);

}

public override object ConvertFrom(
ITypeDescriptorContext context,
CultureInfo culture,
object value) {

// Convierto desde string. Desde ya que
// este codigo esta simplificado para el ejemplo
if (value is string) {

string[] valores = ((string) value).Split(',');

return new Number(int.Parse(valores[0]),
int.Parse(valores[1]));

}

return base.ConvertFrom(context, culture, value);

}

public override bool
GetCreateInstanceSupported(ITypeDescriptorContext context) {
return true;
}

public override object CreateInstance(
ITypeDescriptorContext context,
System.Collections.IDictionary propertyValues) {

return new Number((int) propertyValues["Precision"], (int)
propertyValues["Scale"]);

}

}

[TypeConverter(typeof(NumberConverter))]
public struct Number {

private int _precision;
private int _scale;

public int Precision {
get { return _precision; }
set { _precision = value; }
}

public int Scale {
get { return _scale; }
set { _scale = value; }
}

public Number(int precision, int scale) {
_precision = precision;
_scale = scale;
}

}

public class MiControl : UserControl {

private Number _number = new Number(12, 4);

[DefaultValue(typeof(Number), "12, 4")]
public Number Number {
get { return _number; }
set { _number = value; }
}

}

}




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