none
Agregar una consulta sql server a un datagridview. RRS feed

  • Pregunta

  • Necesito agregar, una consulta a un datagridview, en una especifica columna, ya que en el datagridview ya tiene agregadas una columnas, y quiero que cierto campo me lo cargue en la columna que yo eliga, y no me las agregue al final.?
    miércoles, 28 de marzo de 2018 22:11

Respuestas

  • Un DGV idealmente está vinculado a datos usando una colección de una clase que representa los registros a mostrar, donde cada propiedad de la clase representa una columna.  Simple y sencillamente debe ejecutar la consulta y asignar a la propiedad que desea el valor de dicha consulta SQL.

    Ejemplo:  Ya tengo cargado un DGV que muestra información de usuarios de un sistema.  El DGV también tiene una columna que indica, qué sé yo, digamos cuántas operaciones de escritura ha hecho el usuario.  Esa cuenta está en una tabla en base de datos, y no son datos que extrajimos originalmente cuando llenamos el DGV.

    //Esta es una implementación de INotifyPropertyChanged.
    public class NotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void DispararPropertyChanged(string nombrePropiedad)
        {
            PropertyChanged?.Invoke(new PropertyChangedEventArgs(nombrePropiedad));
        }
    
        protected virtual bool GuardarYNotificar<TDato>(ref TDato almacen, TDato nuevoValor, string [CallerMemberName] string nombrePropiedad = null)
        }
            bool cambio = Object.Equals(almacen, nuevoValor);
            if (cambio)
            {
                DispararPropertyChanged(nombrePropiedad);
            }
            return cambio;
        }
    }
    
    //Esta es la clase que representa un usuario.  Implementa INotifyPropertyChanged a través de herencia.
    public class Usuario : NotifyPropertyChanged
    {
        private long m_id;
        public long Id
        {
            get { return m_id; }
            set { GuardarYNotificar(ref m_id, value); }
        }
    
        private string m_nombre;
        public string Nombre
        {
            get { return m_nombre; }
            set { GuardarYNotificar(ref m_nombre, value); }
        }
    
        private long m_opsEscritura;
        public long OpsEscritura
        {
            get { return m_opsEscritura; }
            set { GuardarYNotificar(ref m_opsEscritura, value); }
        }
    }
    
    //Carga inicial del DGV.
    //Primero una propiedad a nivel de formulario para fácil acceso de los datos.
    private List<Usuario> m_usuarios;
    private List<Usuario> Usuarios
    {
        get { return m_usuarios; }
        set
        {
            m_usuarios = value;
            dataGridView1.DataSource = m_usuarios;
        }
    }
    
    //Luego la carga.
    private void fmUsuarios_Load(object sender, EventArgs e)
    {
        //Una capa de datos provee la lista de usuarios.
        Usuarios = capaDatos.UsuariosDeSistema();
        //Listo.  La propiedad asigna la fuente de datos de la grilla automáticamente.
    }
    
    //Luego digamos que con un timer actualizamos los valores de operaciones de escritura.
    //Para ello recibimos datos de la capa de datos en una nueva clase:
    public class OpsEscritura
    {
        public long IdUsuario { get; set; }
        public long Operaciones { get; set; }
    }
    
    private void miTimer_Tick(object sender, EventArgs e)
    {
        List<OpsEscritura> ops = capaDatos.OperacionesEscrituraPorUsuario();
        //Ahora hay que publicar en la grilla.  Para esto solamente tenemos que actualizar la propiedad OpsEscritura de los objetos ligados a la grilla.
        //Usaré LINQ para encontrar los objetos por ID, pero idealmente la colección de usuarios debería ser de tipo
        //System.Collections.ObjectModel.KeyedCollection o similar.
        foreach (OpsEscritura op in ops)
        {
            Usuario u = Usuarios.Where(i => i.Id == op.IdUsuario).FirstOrDefault();
            if (u != null)
            {
                u.OpsEscritura = op.Operaciones;  //Esta asignación automáticamente actualiza la grilla.
            }
        }
    }


    Jose R. MCP
    Code Samples

    viernes, 30 de marzo de 2018 6:59
    Moderador