Foros del Web » Programación para mayores de 30 ;) » .NET »

Ayuda con creacion de control

Estas en el tema de Ayuda con creacion de control en el foro de .NET en Foros del Web. Mi problema es el siguiente, aun que ya he leido cual podría ser la posible solución, no he podido hacerlo en el visual que estoy ...
  #1 (permalink)  
Antiguo 25/04/2008, 09:42
 
Fecha de Ingreso: junio-2007
Mensajes: 44
Antigüedad: 16 años, 10 meses
Puntos: 0
Pregunta Ayuda con creacion de control

Mi problema es el siguiente, aun que ya he leido cual podría ser la posible solución, no he podido hacerlo en el visual que estoy ocupando "2005.

Mi problema radica en que tengo una coleccion de propiedades en el control, pero necesito que cuando se inicie en el formulario se asigne el valor de esa propiedad primero, luego a las siguientes,
es decir:

Código:
me.objeto.analize=none
me.objeto.forma=sin_forma
.
.
.

ya que visual ordena el nombres de las propiedades y luego las asigna

y necesito que el lo realize en forma automatica, yo lo cambio en forma manual y no tengo problema


Estube revisando una manera de conservar los valores con un tal ViewState, pero por alguna razón no me aparece, me fije en la ayuda de msdn y aparece que existe en esta referencia "system.web.dll" pero no he podido utilizarlo correctamente...
  #2 (permalink)  
Antiguo 25/04/2008, 12:08
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Re: Ayuda con creacion de control

Ok mira eso es un tanto complicado aca te pongo un ejemplillo q hice hace tiempo considerando un StateBag, utilizar las interfaces de IStateManager y clases parciales para separar el manejo del state del manejo de las propiedades y el control web.

Si tus propiedades son simple texto usa esto

[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
[DesignerSerializationVisibility( DesignerSerializationVisibility.Visible)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}

set
{
ViewState["Text"] = value;
}
}



------------------------------------

si son propiedades complejas usa esto

------------------------------ control con propiedad compleja -------------------------------
[ToolboxData("<{0}:TestControl runat=server></{0}:TestControl>")]
public partial class TestControl : WebControl
{
#region VS AutoGenerated Code

protected override void RenderContents(HtmlTextWriter output)
{
output.WriteLine(Text);
output.WriteLine("BookInfo Property:" + this.BookInfo.BookName);
}

#endregion

#region Custom Properties
private BookInfo bookInfo;
[Browsable(true)]
[Category("Custom")]
[DesignerSerializationVisibility( DesignerSerializationVisibility.Content)]
[PersistenceMode(PersistenceMode.InnerProperty)]
public virtual BookInfo BookInfo
{
get
{
if (bookInfo == null)
{
bookInfo = new BookInfo();
if (IsTrackingViewState)
{
((IStateManager)bookInfo).TrackViewState();
}
}
return bookInfo;
}
}

#endregion

#region ViewState for Custom Properties
protected override void LoadViewState(object savedState)
{


if (savedState != null)
{
object[] states = (object[])savedState;
base.LoadViewState(states[0]);
((IStateManager)BookInfo).LoadViewState(states[1]);
}
}

protected override object SaveViewState()
{
object[] states = new object[2];
states[0] = base.SaveViewState();
states[1] = bookInfo != null ? ((IStateManager)bookInfo).SaveViewState() : null;
return states;
}

protected override void TrackViewState()
{
// for each property you add you will need to add another if to this funtion following the same schema
if (bookInfo != null) //Composite Property
{
((IStateManager)bookInfo).TrackViewState();
}
base.TrackViewState();
}
#endregion


}


---------------------------------------- propiedad compleja con soporte de viewstate
public partial class BookInfo
{
public enum ShipDay { Sunday,Monday,Saturday };


public BookInfo()
{
this.BookName = string.Empty;
this.ShipmentDay = ShipDay.Monday;
}


[NotifyParentProperty(true),RefreshProperties( RefreshProperties.Repaint)]
public virtual string BookName
{
get
{
string tempo=ViewState["BookName"].ToString();
return string.IsNullOrEmpty(tempo) ? string.Empty : tempo;
}
set
{
ViewState["BookName"] = value;
}
}
[NotifyParentProperty(true), RefreshProperties(RefreshProperties.Repaint)]
public virtual ShipDay ShipmentDay
{
get
{
ShipDay tempo =(ShipDay) ViewState["ShipmentDay"];
return tempo;
}
set
{
ViewState["ShipmentDay"] = value;
}
}

protected virtual StateBag ViewState // esta es la clave para salvar el state de tu contro customizado
{
get
{
if (_viewState == null)
{
_viewState = new StateBag(false);

if (_isTrackingViewState)
{
((IStateManager)_viewState).TrackViewState();
}
}
return _viewState;
}

}
}

------------------- la otra mitad de la clase q se encarga de la admon del viewstate

[TypeConverter(typeof(ExpandableObjectConverter))]
public partial class BookInfo:IStateManager
{
private bool _isTrackingViewState;
private StateBag _viewState;


#region IStateManager implementation
bool IStateManager.IsTrackingViewState
{
get
{
return _isTrackingViewState;
}
}

void IStateManager.LoadViewState(object savedState)
{
if (savedState != null)
{
((IStateManager)ViewState).LoadViewState(savedStat e);
}
}

object IStateManager.SaveViewState()
{
object savedState = null;

if (_viewState != null)
{
savedState =
((IStateManager)_viewState).SaveViewState();
}
return savedState;
}

void IStateManager.TrackViewState()
{
_isTrackingViewState = true;

if (_viewState != null)
{
((IStateManager)_viewState).TrackViewState();
}
}
#endregion

internal void SetDirty()
{
_viewState.SetDirty(true);
}

}



------------------------------

Bueno cabe mencionar que el manejo de las propieades como virtuales es para q la implementacion del control permita ver los cambios de las propiedades en design time ademas del runtime.

cualquier pregunta no dudes en enviarla
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:43.