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

Datagridview con dos origenes de datos distintos

Estas en el tema de Datagridview con dos origenes de datos distintos en el foro de .NET en Foros del Web. Hola!! Tengo dos colecciones de objetos , Vendedores y Localidades. Tengo que hacer el ABM de los Vendedores , no tengo drama en enlazar la ...
  #1 (permalink)  
Antiguo 03/05/2009, 22:04
Avatar de fechasoru  
Fecha de Ingreso: diciembre-2008
Mensajes: 149
Antigüedad: 15 años, 4 meses
Puntos: 0
Datagridview con dos origenes de datos distintos

Hola!!

Tengo dos colecciones de objetos , Vendedores y Localidades.
Tengo que hacer el ABM de los Vendedores , no tengo drama en enlazar la coleccion vendedores atravez de un bindingsource al datagridview. Pero quiero hacer la entrada de datos directamente en la celda de la fila editable. Quisiera agregar una columna del tipo combobox para que el usuario pueda elegir la Localidad, pero el control en tiempo de diseño no me lo permite ya que se encuentra enlazado a la coleccion vendedores.

Como puedo agregar otra columna enlazada a otro origen de dato distinto.
  #2 (permalink)  
Antiguo 04/05/2009, 13:07
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 23 años, 6 meses
Puntos: 19
Respuesta: Datagridview con dos origenes de datos distintos

Hola.
Varias veces he tenido ese problema usando colecciones de objeto. Lo podes resolver de varias maneras. Yo supe en una oportunidad hacer lo que se llama una clase auxiliar donde en mi caso tenia una clase cliente y otra localidades y quería mostrar en la misma grilla el cliente y un combo de localidades. Para hacerlo facil cree una clase clientesAux que tenía todo lo de clientes pero ademas le agrege una propiedad "LocalidadesListado" que era un List del tipo Localidades, asi cuando crear la clase ClientesAux luego le agregas a su propiedad LocalidadesListado todo las localidades existentes.

La otra que ahora esta mejor aun es que en visual studio 2008 podes usar Linq y con esto podes hacer directamente un select donde unis campos de colecciones de objetos como si fueran dos tablas, un lujo!!!

La otra que podes hacer es sino intentar agregar por código un campo de tipo combo y asignarle valores. Te paso un ejemplo básico, despues podes mejorarlo si te sirve:

Código:
Public Class Form1

    Class persona
        Private xEstado As Boolean
        Public Property Estado() As Boolean
            Get
                Return xEstado
            End Get
            Set(ByVal value As Boolean)
                xEstado = value
            End Set
        End Property
    End Class
    Class Localidad

        Private xNombre As String
        Public Property Nombre() As String
            Get
                Return xNombre
            End Get
            Set(ByVal value As String)
                xNombre = value
            End Set
        End Property
    End Class

    Dim xBind As New BindingSource
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim xPer1 As New persona
        Dim xPer2 As New persona
        xPer1.Estado = True
        xPer2.Estado = False

        Dim xPersonas As New List(Of persona)
        xPersonas.Add(xPer1)
        xPersonas.Add(xPer2)
        xBind.DataSource = xPersonas
        DataGridView1.DataSource = xBind

        With DataGridView1
            Dim ColumnCar As New DataGridViewComboBoxColumn
            Dim xLoc1 As New Localidad
            Dim xLoc2 As New Localidad
            xLoc1.Nombre = "Localidad 1"
            xLoc2.Nombre = "Localidad 2"

            Dim xLocalidades As New List(Of Localidad)

            xLocalidades.Add(xLoc1)
            xLocalidades.Add(xLoc2)
            With ColumnCar
                .DataPropertyName = "Localidad"
                .HeaderText = "Localidad"
                .Width = 80
                .DataSource = xLocalidades
                .DisplayMember = "Nombre"
                .ValueMember = "Nombre"
            End With
            .Columns.Add(ColumnCar)
        End With
    End Sub
End Class
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
  #3 (permalink)  
Antiguo 05/05/2009, 08:33
Avatar de fechasoru  
Fecha de Ingreso: diciembre-2008
Mensajes: 149
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Datagridview con dos origenes de datos distintos

Gracias, tenia maso menos la misma idea , en realidad lo voy a aplicar en el siguiente formulario a realizar , en el que estoy trabajando en realidad necesito usar columnas del tipo textbox en el datagridview, para colocar el nombre de la provincia y localidad, pero no tienen la propiedad DataSource por la que se complica un poco más.
  #4 (permalink)  
Antiguo 05/05/2009, 09:31
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 23 años, 6 meses
Puntos: 19
Respuesta: Datagridview con dos origenes de datos distintos

Hola.
Bueno, lo podes de última resolver como en el ejemplo, una vez que se cargo la grilla recorres cada fila y vas cargando el valor al textbox de acuerdo a algún id o algo que tengas en la fila.
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
  #5 (permalink)  
Antiguo 05/05/2009, 10:50
Avatar de fechasoru  
Fecha de Ingreso: diciembre-2008
Mensajes: 149
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Datagridview con dos origenes de datos distintos

Hola de Nuevo !!
Lo resolvi de esta manera y está muy bueno era lo que buscaba.

Estoy utilizando el ORM EntitySpaces 2008. http://www.entityspaces.net/

Agrego a mi clase vendedor columnas virtuales, de esta manera puedo bindearlo en tiempo de diseño y de ejecucion. En estos campos recupero los datos de una consulta hecha con inner join. Lo bueno de esto que puedo agregar objetos a la coleccion y llamar al metodo SAVE() del ORM para realizar las operaciones CRUD en la tabla vendedor solamente. Otra cosa Además permite realizar ordenamiento sobre las columnas.

El codigo de la clase.

public partial class Vendedor : esVendedor
{
protected override List<esPropertyDescriptor> GetLocalBindingProperties()
{
List<esPropertyDescriptor> props = new List<esPropertyDescriptor>();

props.Add(new esPropertyDescriptor(this, "Provincia", typeof(string)));
props.Add(new esPropertyDescriptor(this, "Localidad", typeof(string)));
props.Add(new esPropertyDescriptor(this, "Sucursal", typeof(string)));


return props;
}

public string Provincia
{
get { return (string)this.GetColumn("Provincia"); }
set { this.SetColumn("Provincia", value); }
}

public string Localidad
{
get { return (string)this.GetColumn("Localidad"); }
set { this.SetColumn("Localidad", value); }
}

public string Sucursal
{
get { return (string)this.GetColumn("Sucursal"); }
set { this.SetColumn("Sucursal", value); }
}

}


El codigo del inner join con Querys del Api del ORM

public partial class VendedorCollection : esVendedorCollection
{

/// <summary>
/// Recupera todos los vendedores con los nombres de provincias,localidades y sucursales
/// </summary>
/// <returns></returns>
public VendedorCollection vendedores_con_localidad_y_sucursal()
{
VendedorQuery v = new VendedorQuery("v");
ProvinciaQuery p = new ProvinciaQuery("p");
LocalidadQuery l = new LocalidadQuery("l");
SucursalQuery s = new SucursalQuery("s");
v.Select(v.ApellidoNombre, v.Dni, v.Cuit, v.Domicilio, v.TelefonoFijo, v.TelefonoMovil, v.Email, v.IdLocalidad, v.IdProvincia, v.IdSucursal, v.IdVendedor, p.Denominacion.As("Provincia"), l.Denominacion.As("Localidad"), s.Denominacion.As("Sucursal"));
v.InnerJoin(p).On(v.IdProvincia == p.IdProvincia);
v.InnerJoin(l).On(v.IdLocalidad == l.IdLocalidad);
v.InnerJoin(s).On(v.IdSucursal == s.IdSucursal);
VendedorCollection vendedores = new VendedorCollection();
vendedores.Load(v);
return vendedores;

}

}


La foto en tiempo de diseño


  #6 (permalink)  
Antiguo 05/05/2009, 14:24
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 23 años, 6 meses
Puntos: 19
Respuesta: Datagridview con dos origenes de datos distintos

Muy buena solución, te felicito y gracias por compartirla
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
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 16:07.