Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - Diferencial

#46
General / Una kedada en madrid
06 de Julio de 2007, 12:26:27 PM
¿Al final cuando quedamos? ¿Os va bien el sabado 14 de julio?
#47
General Programadores / Implementar reflection con c#
01 de Julio de 2007, 03:03:21 PM
Bueno aqui les dejo mi pequeña solución al problema que plantee, hay que hacer un par de pasos de más pero creo que a la larga se agradece.

Primer paso es crear una clase que herede de atributos.

[AttributeUsage(AttributeTargets.Property,AllowMultiple = false)]
public class UsuarioBinding : Attribute
{
   private string Menber_;

   public string Menber
   {
       get { return Menber_; }
       set { Menber_ = value; }
   }    
}


El segundo paso es aplicar la clase anterior a la clase que representa  una tabla de la base de datos.

public class Usuario
{    
   private string Nombre_ = "Javi";

   [UsuarioBinding(Menber="Text")]
   public string Nombre
   {
       get { return Nombre_; }
       set { Nombre_ = value; }
   }

   private int TipoUsuario_ = 1;

   [UsuarioBinding(Menber="SelectedValue")]
   public int TipoUsuario
   {
       get { return TipoUsuario_; }
       set { TipoUsuario_ = value; }
   }
}

El tercer paso es aplicar el evento OnDataBinding de nuestros controles para que llame a un metodo de nuestra pagina web.

<span>Nombre:</span>
       <span><asp:TextBox ID="Nombre" runat="server" OnDataBinding="UsuarioFormBinding"></asp:TextBox></span>
       <span>Tipo Usuario:</span>
       <span>
           <asp:DropDownList ID="TipoUsuario" runat="server" OnDataBinding="UsuarioFormBinding">
               <asp:ListItem Text="Seleccione..." Value="" Selected="True" />
               <asp:ListItem Text="Registrado" Value="1" />
               <asp:ListItem Text="Administrador" Value="2" />
               <asp:ListItem Text="SuperAdministrador" Value="3" />
           </asp:DropDownList>
       </span>

El cuarto paso es implementar el metodo UsuarioFormBinding con Reflection.

   protected void UsuarioFormBinding(object sender, EventArgs e)
   {
       Type objType = sender.GetType();
       string property = objType.InvokeMember("ID", BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, sender, null).ToString();
       Type objUsuario = typeof(Usuario);
       object usrRegistrado = Activator.CreateInstance(objUsuario);
       PropertyInfo objField = objUsuario.GetProperty(property);
       UsuarioBinding objBinding = (UsuarioBinding)objField.GetCustomAttributes(typeof(UsuarioBinding), true)[0];
       object[] param = new object[1];
       param[0] = objUsuario.InvokeMember(property,BindingFlags.InvokeMethod | BindingFlags.GetProperty,null,usrRegistrado,null).ToString();
       objType.InvokeMember(objBinding.Menber, BindingFlags.SetProperty, null, sender, param);
   }  

El ultimo paso seria hacer que nuestra web se enlace con nuestro objeto en mi caso es Usuario.

   protected void Page_Load(object sender, EventArgs e)
   {
       if(!IsPostBack)
           DataBind();
   }

Bueno ahora solo hace falta hacer justo el paso al reves que desde el formulario, obtener los datos para establcerlos en el objeto usuario. Pero con lo que he puesto aqui ya se puede hacer rapidamente, aunque parezca inutil a la larga cuando se vayan incrementando los campos es mucho mas comodo de esta forma, solo se tiene que agregar el campo y ya esta.
#48
General Programadores / Implementar reflection con c#
27 de Junio de 2007, 05:14:10 PM
gracias vicente, lo mirare. Cabe decir que en silverlight el enlace es una gozada.
#49
General Programadores / Implementar reflection con c#
27 de Junio de 2007, 03:48:21 PM
Voy a poner aqui el ejemplo para que os hagais una idea de lo que estoy haciendo:

Código:

protected void UsuarioCampos(object sender, EventArgs e)
       {            
           TextBox campo = sender as TextBox;
           Type type = typeof(Usuario);
           object usrRegistrado = Activator.CreateInstance(type);
           if (ViewState["idUsuario"].ToString() != "0") usrRegistrado = Usuario.Edit(Convert.ToInt32(ViewState["idUsuario"]));
           string result = type.InvokeMember(campo.ID, BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, usrRegistrado, null).ToString();
           campo.Text = result;
       }



Con este trozo de codigo lo que se consigue(que no es poco) es que todos los campos del formulario que sean del tipo TextBox obtengan el valor que les corresponde a traves de un objeto, en este caso Usuario.
Para que esto suceda en el evento OnDataBinding del TextBox se debe poner el metodo que lo implementa, en esta caso es UsuarioCampos. Bien pues ahora lo que quiero conseguir es justo el paso contrario que de la interfaz se enlace al objeto. Se me ha ocurrido varias posibilidades pero no acabo de resolverlo.
¿Se puede poner un evento que se lance, cuando se llame al metodo del objeto DataBinding()?
El problema es que esto no se como hacerlo, pero estoy convencido de que es lo que deberia de hacer. Si alguien puede arrojar algo de luz al tema se lo agradezco gracias.
#50
General Programadores / Re: Implementar reflection con c#
27 de Junio de 2007, 10:50:05 AM
Cita de: "Vicente"
Cita de: "Diferencial"Hola a todos,
A ver si alguien me saca de la duda porque creo que puedo hacer algo chulo con reflection pero no lo consigo.

Type type = typeof(Usuario);
object usrRegistrado = Activator.CreateInstance(type);
string result = type.InvokeMember("Nombre", BindingFlags.Default | BindingFlags.InvokeMethod, null, usrRegistrado, null).ToString();
Response.Write(result);


Intento conseguir invocar un metodo de un objeto en tiempo de ejecucion, lo uso para enlazarlo a un formulario de una página web. Pero no se porque no funciona ya que tengo una clase con una propiedad publica que se llama Nombre y devuelve un string "Javi" a ver si alguien me sabe decir que es lo que no funciona.

1- Te devuelve alguna excepción?

2- Intenta a usar BindingFlags.Public | BindingFlags.Instance para la llamada en vez de las que tienes puestas. Si no prueba también con BindingFlags.InvokeMethod | BindingFlags.GetProperty (aunque yo creo que con Public e Instance debería funcionar...).

Un saludo!

Vicente

Me ha funcionando usando las banderas que estan en negrita, muchas gracias Vicente.
#51
General Programadores / Implementar reflection con c#
27 de Junio de 2007, 10:23:56 AM
Hola a todos,
A ver si alguien me saca de la duda porque creo que puedo hacer algo chulo con reflection pero no lo consigo.

Type type = typeof(Usuario);
object usrRegistrado = Activator.CreateInstance(type);
string result = type.InvokeMember("Nombre", BindingFlags.Default | BindingFlags.InvokeMethod, null, usrRegistrado, null).ToString();
Response.Write(result);


Intento conseguir invocar un metodo de un objeto en tiempo de ejecucion, lo uso para enlazarlo a un formulario de una página web. Pero no se porque no funciona ya que tengo una clase con una propiedad publica que se llama Nombre y devuelve un string "Javi" a ver si alguien me sabe decir que es lo que no funciona.
#52
Off-topic / Si pudierais retroceder en el tiempo...
26 de Junio de 2007, 11:53:35 AM
Cita de: "Pogacha"Deberas evitar a toda costa encontrarte con tu otro vos, el encuentro podría producir una paradoja en el continuo espacio tiempo y destruir por completo todo el universo... bueno tal vez exagero tal vez la destrucción se limite a nuestra galaxia.

Simplemente si no se tocan no pasaria nada y si se tocaran solamente desapareceria, todabia no lo he probado asi que tampoco lo se con seguridad.
#53
General / Una kedada en madrid
26 de Junio de 2007, 11:49:31 AM
Venga pues quedamos la segunda semana de julio.
#54
General / Que utilidad tiene el lenguaje F#?
22 de Junio de 2007, 12:20:21 PM
:D  Gracias Vicente
#55
General / Que utilidad tiene el lenguaje F#?
22 de Junio de 2007, 09:45:47 AM
http://research.microsoft.com/fsharp/about.aspx que ventajas tendria usar este lenguaje?
#56
General / Realizar lista de tareas en visual studio 2005
15 de Junio de 2007, 02:37:17 PM
Alguien sabe como meter una tarea que cuando se pulse te lleve al punto donde hay que hacerla sin realizar el comentario?

Yo tengo hecho algo asi, //TODO: Habilitar boton
y si muestro la lista de tareas(Comentarios) de ese archivo pues me aparece abajo todas las tareas por hacer, si pulso encima me lleva al punto donde esta escrito aunque a veces no funciona bien, luego hay otra opción que es tareas del usuario esa no consigo saber bien para que sirve.
#57
Industria y mercado / Tú también puedes: Post-concurso
14 de Junio de 2007, 01:35:59 PM
Esta muy wapo  :D
#58
General Programadores / duda ambitos java
14 de Junio de 2007, 01:28:17 PM
Cita de: "shephiroth"A ver señores, si B hereda de A, hacer A c = b; es CORRECTISIMO!!!!!!!!!!

Cierto no me habia dado cuenta de que heredaba.
#59
General Programadores / Re: duda ambitos java
14 de Junio de 2007, 01:23:52 PM
Cita de: "Güarmigue"
public class C {

public static void main(String[] args){
A a = new A();
B b = new B();
ESTA LINEA ESTA MAL DEBERIA DE SER EN TODO CASO B c = b; si lo declaras como A te crea un objeto de tipo A y funciona porque B tiene la misma estructura que A, A c = b;

System.out.println(a.c);
System.out.println(b.c);
System.out.println(c.c);
}

}
#60
General Programadores / Programar en grupo
14 de Junio de 2007, 01:15:25 PM
Yo estoy usando source safe como control de codigo fuente para .net, pero existe uno que es mucho mejor. Es vault se integra tambien en visual studo 2005, te aviso es un coñazo el tema de tener que proteger y desproteger via internet porque tarda un poco en el caso de source safe que esta en su versión 6, parece que microsoft estan preparando algo mucho mejor y más actualizado, porque este ultimo venia en la versión 6 de visual studio.





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.