public static List <HistorialCalificacionSemestral> seleccionarHistorial(calificaciones_semestrales calificacion_semestral)
        {
            // Código necesario para los métodos que
            // utilicen la base de datos
            CBTis123_Entities dbContext = Vinculo_DB.generarContexto();

            List <HistorialCalificacionSemestral> listaHistorial = new List <HistorialCalificacionSemestral>();

            try
            {
                historial_calificaciones_semestrales historialBruto =
                    dbContext.
                    historial_calificaciones_semestrales.
                    SingleOrDefault(
                        h =>
                        h.idCalificacion_Semestral == calificacion_semestral.idCalificacion_Semestral
                        );

                if (historialBruto != null)
                {
                    string   s1 = historialBruto.cambios;
                    string[] s2 = s1.Split(new string[] { separadorRegistro }, StringSplitOptions.RemoveEmptyEntries);

                    string[][] valoresFinales = new string[s2.Length][];

                    for (int i = 0; i < s2.Length; i++)
                    {
                        string s = s2[i];

                        valoresFinales[i] = s.Split(new string[] { separadorCampo }, StringSplitOptions.None);
                    }

                    foreach (string[] sArr in valoresFinales)
                    {
                        HistorialCalificacionSemestral h = new HistorialCalificacionSemestral();

                        int posicion = 0;

                        h.nombreDeCampo  = sArr[posicion++];
                        h.valorAnterior  = sArr[posicion++];
                        h.valorNuevo     = sArr[posicion++];
                        h.fuenteDeCambio = sArr[posicion++];
                        h.fecha          = sArr[posicion++];

                        int      idUsuario = Convert.ToInt32(sArr[posicion++]);
                        usuarios u         = dbContext.usuarios.SingleOrDefault(u1 => u1.idUsuario == idUsuario);

                        h.usuarioAutor = u;

                        listaHistorial.Add(h);
                    }
                }
            }
            catch (Exception e)
            {
                ControladorVisual.mostrarMensaje(ControladorExcepciones.crearResultadoOperacionException(e));
            }

            return(listaHistorial);
        }
        public static IList <estudiantes> seleccionarEstudiantesRecursamiento(IList <calificaciones_semestrales>[] arrListasCalificaciones)
        {
            // Creamos la lista que contendrá los estudiantes que existen en todas las listas...
            IList <estudiantes> listaEstudiantes = new List <estudiantes>();

            IList <calificaciones_semestrales> listaBase = arrListasCalificaciones[0];

            foreach (calificaciones_semestrales cs in listaBase)
            {
                bool flag = true;

                foreach (IList <calificaciones_semestrales> lista in arrListasCalificaciones)
                {
                    calificaciones_semestrales csI = lista.FirstOrDefault(cs1 => cs1.nControl == cs.nControl);
                    flag = csI != null;

                    if (!flag)
                    {
                        break;
                    }
                }

                if (flag)
                {
                    listaEstudiantes.Add(cs.estudiantes);
                }
            }

            return(listaEstudiantes);
        }
        public static List <calificaciones_semestrales> crearListaCalificaciones(string[][] tabla, int idCatedra = -1, catedras catedra = null)
        {
            // Código necesario para los métodos que
            // utilicen la base de datos
            CBTis123_Entities dbContext = Vinculo_DB.generarContexto();

            List <calificaciones_semestrales> listaCalificaciones = new List <calificaciones_semestrales>();

            foreach (string[] row in tabla)
            {
                if (row.Length < 13)
                {
                    continue;
                }

                calificaciones_semestrales c = new calificaciones_semestrales();

                string ncontrol = row[1];
                string nombres  = row[2];

                // ASISTENCIAS
                if (row[6] != null && row[6] != "")
                {
                    c.asistenciasParcial1 = Convert.ToInt32(row[6]);
                }
                else
                {
                    c.asistenciasParcial1 = null;
                }

                if (row[7] != null && row[7] != "")
                {
                    c.asistenciasParcial2 = Convert.ToInt32(row[7]);
                }
                else
                {
                    c.asistenciasParcial2 = null;
                }

                if (row[8] != null && row[8] != "")
                {
                    c.asistenciasParcial3 = Convert.ToInt32(row[8]);
                }
                else
                {
                    c.asistenciasParcial3 = null;
                }


                // CALIFICACIONES PARCIALES
                if (row[3] != null && row[3] != "")
                {
                    c.calificacionParcial1 = Convert.ToDouble(row[3]);
                }
                else
                {
                    c.calificacionParcial1 = null;
                }

                if (row[4] != null && row[4] != "")
                {
                    c.calificacionParcial2 = Convert.ToDouble(row[4]);
                }
                else
                {
                    c.calificacionParcial2 = null;
                }

                if (row[5] != null && row[5] != "")
                {
                    c.calificacionParcial3 = Convert.ToDouble(row[5]);
                }
                else
                {
                    c.calificacionParcial3 = null;
                }

                estudiantes estudianteDeCalificacion = dbContext.estudiantes.SingleOrDefault(e => e.ncontrol == ncontrol);

                if (estudianteDeCalificacion == null)
                {
                    estudianteDeCalificacion = new estudiantes()
                    {
                        idEstudiante = -1, nombrecompleto = nombres, nombres = nombres, ncontrol = ncontrol
                    };
                }

                c.estudiantes = estudianteDeCalificacion;


                c.idEstudiante             = c.estudiantes.idEstudiante;
                c.firmado                  = Convert.ToBoolean(row[12]);
                c.idCalificacion_Semestral = -1;
                c.recursamiento            = false;
                c.tipoDeAcreditacion       = row[11];
                c.catedras                 = catedra;
                c.idCatedra                = idCatedra;


                listaCalificaciones.Add(c);
            }

            return(listaCalificaciones);
        }
        public static void inicializarCalificaciones(catedras catedra)
        {
            // Código necesario para los métodos que
            // utilicen la base de datos
            CBTis123_Entities dbContext = Vinculo_DB.generarContexto();

            try
            {
                // Primero, obtenemos todos los estudiantes
                // que pertenecen al grupo de la cátedra
                List <grupos_estudiantes> listaEstudiantesFK =
                    dbContext.
                    grupos_estudiantes.
                    Where(
                        ge =>
                        ge.idGrupo == catedra.idGrupo
                        ).ToList();

                List <estudiantes> listaEstudiantes = new List <estudiantes>();

                foreach (grupos_estudiantes ge in listaEstudiantesFK)
                {
                    listaEstudiantes.Add(ge.estudiantes);
                }


                // Ahora, obtendremos todas las calificaciones
                // que ya existen en la base de datos.
                List <calificaciones_semestrales> listaCalificaciones = new List <calificaciones_semestrales>();

                listaCalificaciones = dbContext.calificaciones_semestrales.Where(c => c.idCatedra == catedra.idCatedra).ToList();


                // Ya que tenemos las calificaciones, iteramos
                // sobre la lista para saber qué alumnos tienen
                // ya un registro. Si no tienen registro, lo agregamos

                // Eliminación de los alumnos que ya tienen calificación
                foreach (calificaciones_semestrales c in listaCalificaciones)
                {
                    listaEstudiantes.RemoveAll(e => e.idEstudiante == c.idEstudiante);
                }

                // De los estudiantes que restan, agregamos una calificación por default
                foreach (estudiantes e in listaEstudiantes)
                {
                    calificaciones_semestrales c = new calificaciones_semestrales
                    {
                        firmado       = false,
                        idCatedra     = catedra.idCatedra,
                        idEstudiante  = e.idEstudiante,
                        recursamiento = false,
                        verificado    = true
                    };

                    dbContext.calificaciones_semestrales.Add(c);
                }

                // Si hubo estudiantes sin calificación, guardamos los cambios
                if (listaEstudiantes.Count > 0)
                {
                    dbContext.SaveChanges();
                }
            }
            catch (Exception e)
            {
                ControladorVisual.mostrarMensaje(ControladorExcepciones.crearResultadoOperacionException(e));
            }
        }
        public static ResultadoOperacion actualizarCalificacionesDesdeSiseems(IList <calificaciones_semestrales> listaCalificaciones, string clase = "Desconocida")
        {
            // Código necesario para los métodos que
            // utilicen la base de datos
            CBTis123_Entities dbContext = Vinculo_DB.generarContexto();
            bool cambios = false;

            try
            {
                // Iteramos sobre las calificaciones que nos pasaron para registrar a los estudiantes
                foreach (calificaciones_semestrales c in listaCalificaciones)
                {
                    // Si su estudiante no existe, lo agregamos a la base de datos
                    if (c.idEstudiante == -1)
                    {
                        estudiantes estudianteC = c.estudiantes;

                        estudianteC.idEstudiante = 0;
                        //estudianteC.ncontrol = estudianteC.ncontrol.Substring(0, 18);
                        //estudianteC.nombrecompleto = estudianteC.nombrecompleto.Substring(0, 60);
                        //estudianteC.nombres = estudianteC.nombres.Substring(0, 30);
                        estudianteC.curp       = "";
                        estudianteC.apellido1  = "";
                        estudianteC.apellido2  = "";
                        estudianteC.nss        = "";
                        estudianteC.verificado = false;

                        c.estudiantes = dbContext.estudiantes.Add(estudianteC);
                        cambios       = true;
                    }
                }

                // Si hubo cambios en la base de datos los guardamos
                if (cambios)
                {
                    dbContext.SaveChanges();
                }

                cambios = false;

                // Iteramos sobre las calificaciones que nos pasaron
                // y si no existe alguna, creamos una temporal antes de
                // que registremos los verdaderos valores
                foreach (calificaciones_semestrales c in listaCalificaciones)
                {
                    calificaciones_semestrales cUpdated = dbContext.calificaciones_semestrales.SingleOrDefault(
                        c1 => c1.idCatedra == c.idCatedra && c1.idEstudiante == c.idEstudiante
                        );

                    if (cUpdated == null)
                    {
                        cUpdated = new calificaciones_semestrales()
                        {
                            firmado       = false,
                            idCatedra     = c.idCatedra,
                            idEstudiante  = c.idEstudiante,
                            recursamiento = true
                        };

                        dbContext.calificaciones_semestrales.Add(cUpdated);
                        cambios = true;
                    }
                }

                if (cambios)
                {
                    dbContext.SaveChanges();
                }

                // Finalmente registramos el bonche de calificaciones
                return(actualizarCalificaciones(listaCalificaciones, "Importación de SISEEMS"));
            }
            catch (Exception e)
            {
                return(ControladorExcepciones.crearResultadoOperacionException(e));
            }
        }
        // UPDATES
        public static ResultadoOperacion actualizarCalificaciones(IList <calificaciones_semestrales> listaCalificaciones, string razon)
        {
            // Código necesario para los métodos que
            // utilicen la base de datos
            CBTis123_Entities dbContext = Vinculo_DB.generarContexto();

            // Setteamos variables necesarias para el método
            int calificacionesModificadas = 0;
            ResultadoOperacion innerRO    = null;

            bool cambios = false;

            try
            {
                // Iteramos sobre la lista que nos pasaron
                foreach (calificaciones_semestrales c in listaCalificaciones)
                {
                    // Creamos un StringBuilder para guardar cualquier cambio
                    StringBuilder logCambios = new StringBuilder();

                    // Obtenemos las calificaciones que hay en la DB
                    calificaciones_semestrales cUpdated = dbContext.calificaciones_semestrales.SingleOrDefault(
                        c1 => c1.idCatedra == c.idCatedra && c1.idEstudiante == c.idEstudiante
                        );

                    // Si hay algún cambio en cualquiera de los campos,
                    // se agregará el registro al StringBuilder, y se
                    // encenderá la bandera de que hubo cambio

                    // PRIMERO, las asistencias
                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.asistenciasParcial1, c.asistenciasParcial1) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Asistencias parcial 1",
                                cUpdated.asistenciasParcial1.ToString(),
                                c.asistenciasParcial1.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.asistenciasParcial1 = c.asistenciasParcial1;
                        cambios = true;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.asistenciasParcial2, c.asistenciasParcial2) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Asistencias parcial 2",
                                cUpdated.asistenciasParcial2.ToString(),
                                c.asistenciasParcial2.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.asistenciasParcial2 = c.asistenciasParcial2;
                        cambios = true;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.asistenciasParcial3, c.asistenciasParcial3) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Asistencias parcial 3",
                                cUpdated.asistenciasParcial3.ToString(),
                                c.asistenciasParcial3.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.asistenciasParcial3 = c.asistenciasParcial3;
                        cambios = true;
                    }


                    // SEGUNDO, las calificaciones
                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.calificacionParcial1, c.calificacionParcial1) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Calificación parcial 1",
                                cUpdated.calificacionParcial1.ToString(),
                                c.calificacionParcial1.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.calificacionParcial1 = c.calificacionParcial1;
                        cambios = true;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.calificacionParcial2, c.calificacionParcial2) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Calificación parcial 2",
                                cUpdated.calificacionParcial2.ToString(),
                                c.calificacionParcial2.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.calificacionParcial2 = c.calificacionParcial2;
                        cambios = true;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.calificacionParcial3, c.calificacionParcial3) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Calificación parcial 3",
                                cUpdated.calificacionParcial3.ToString(),
                                c.calificacionParcial3.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.calificacionParcial3 = c.calificacionParcial3;
                        cambios = true;
                    }


                    //TERCERO, otros datos que se pueden modificar en el DGV
                    if (cUpdated.firmado != c.firmado)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Firmado",
                                cUpdated.firmado.ToString(),
                                c.firmado.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.firmado = c.firmado;
                        cambios          = true;
                    }

                    if (cUpdated.tipoDeAcreditacion != c.tipoDeAcreditacion)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Tipo de acreditación",
                                cUpdated.tipoDeAcreditacion,
                                c.tipoDeAcreditacion,
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.tipoDeAcreditacion = c.tipoDeAcreditacion;
                        cambios = true;
                    }

                    if (cUpdated.recursamiento != c.recursamiento)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Firmado",
                                cUpdated.recursamiento.ToString(),
                                c.recursamiento.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.recursamiento = c.recursamiento;
                        cambios = true;
                    }

                    if (cUpdated.verificado != c.verificado)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Tipo de acreditación",
                                cUpdated.verificado.ToString(),
                                c.verificado.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.verificado = c.verificado;
                        cambios             = true;
                    }

                    // Ahora, para guardar en el historial,
                    // comprobamos que exista. Si no existe,
                    // lo creamos y agregmos los cambios del StringBuilder.
                    // Si ya existe, simplemente agregamos los
                    // cambios al final de la cadena.
                    historial_calificaciones_semestrales historial = dbContext.historial_calificaciones_semestrales.SingleOrDefault(h => h.idCalificacion_Semestral == cUpdated.idCalificacion_Semestral);

                    if (historial == null)
                    {
                        historial = new historial_calificaciones_semestrales()
                        {
                            idCalificacion_Semestral = cUpdated.idCalificacion_Semestral,
                            cambios = logCambios.ToString()
                        };

                        dbContext.historial_calificaciones_semestrales.Add(historial);
                    }
                    else
                    {
                        historial.cambios += logCambios.ToString();
                    }
                }

                // Si hubo cambios, se guardan
                if (cambios)
                {
                    calificacionesModificadas = dbContext.SaveChanges();
                }
            }
            catch (Exception e)
            {
                innerRO = ControladorExcepciones.crearResultadoOperacionException(e);
            }

            int listaCalificacionesCount = listaCalificaciones.Count;

            return
                (!cambios
                ?
                 new ResultadoOperacion(
                     EstadoOperacion.NingunResultado,
                     "No se guardó ninguna calificación - " + razon,
                     null,
                     innerRO)
                :
                 calificacionesModificadas > 0
                ?
                 new ResultadoOperacion(
                     EstadoOperacion.Correcto,
                     "Calificaciones actualizadas - " + razon,
                     null,
                     innerRO)
                :
                 new ResultadoOperacion(
                     EstadoOperacion.ErrorAplicacion,
                     "No se han actualizado las calificaciones - " + razon,
                     "CalAct " + calificacionesModificadas.ToString(),
                     innerRO));
        }
Ejemplo n.º 7
0
        // Métodos visuales
        private void configurarDGVCalificaciones(BindingList <calificaciones_semestrales> listaCalificacionesBinding)
        {
            cmdImportar.Enabled = listaCalificacionesBinding != null;

            // Si la colección es originalmente nula, o vacía, salimos.
            if (listaCalificacionesBinding == null || listaCalificacionesBinding.Count < 1)
            {
                dgvCalificaciones.DataSource = null;
                dgvCalificaciones.Columns["tipoDeAcreditacion1"].Visible = false;

                configurarBotones(false);

                return;
            }

            // Ordenamos la binding list...
            listaCalificacionesBinding = new BindingList <calificaciones_semestrales>(
                listaCalificacionesBinding.
                OrderBy(
                    c =>
                    c.estudiantes.ToString()).
                ToList()
                );

            // Agregamos todos los datos al dgv
            dgvCalificaciones.DataSource = listaCalificacionesBinding;

            // Ahora, obtenemos la colección de columnas...
            DataGridViewColumnCollection columnas = dgvCalificaciones.Columns;

            // Iteramos sobre todas las columnas para hacerlas invisibles
            foreach (DataGridViewColumn c in columnas)
            {
                c.Visible = false;
            }

            // Itero sobre las filas para agregar algunas cosas
            foreach (DataGridViewRow row in dgvCalificaciones.Rows)
            {
                calificaciones_semestrales cActual = (calificaciones_semestrales)row.DataBoundItem;

                // Primero, el número de lista
                row.HeaderCell.Value = String.Format("{0}", row.Index + 1);

                // Segundo, el color de fondo para mostrar a los de recursamiento
                if (cActual.recursamiento)
                {
                    row.DefaultCellStyle.BackColor = Color.LightGreen;
                }

                // Tercero, seleccionamos el tipo de acreditación
                // A NP NA RV R
                DataGridViewCell cell = row.Cells["tipoDeAcreditacion1"];
                cell.Value = cActual.tipoDeAcreditacion;
            }

            // Muestro únicamente las que me interesan
            columnas["nControl"].Visible             = true;
            columnas["calificacionParcial1"].Visible = true;
            columnas["calificacionParcial2"].Visible = true;
            columnas["calificacionParcial3"].Visible = true;
            columnas["asistenciasParcial1"].Visible  = true;
            columnas["asistenciasParcial2"].Visible  = true;
            columnas["asistenciasParcial3"].Visible  = true;
            columnas["tipoDeAcreditacion"].Visible   = false;
            columnas["tipoDeAcreditacion1"].Visible  = true;
            //columnas["recursamiento"].Visible = true;
            columnas["firmado"].Visible            = true;
            columnas["estudiantes"].Visible        = true;
            columnas["promedio"].Visible           = true;
            columnas["asistenciasTotales"].Visible = true;
            //columnas["verificado"].Visible = true;

            // Cambio el título
            columnas["nControl"].HeaderText             = "Núm. control";
            columnas["calificacionParcial1"].HeaderText = "Cal. P1";
            columnas["calificacionParcial2"].HeaderText = "Cal. P2";
            columnas["calificacionParcial3"].HeaderText = "Cal. P3";
            columnas["asistenciasParcial1"].HeaderText  = "Asis. P1";
            columnas["asistenciasParcial2"].HeaderText  = "Asis. P2";
            columnas["asistenciasParcial3"].HeaderText  = "Asis. P3";
            columnas["tipoDeAcreditacion"].HeaderText   = "Tipo de Acreditación";
            columnas["tipoDeAcreditacion1"].HeaderText  = "Tipo de Acreditación";
            columnas["recursamiento"].HeaderText        = "Recursamiento";
            columnas["firmado"].HeaderText            = "Firmado";
            columnas["estudiantes"].HeaderText        = "Estudiante";
            columnas["promedio"].HeaderText           = "Promedio";
            columnas["asistenciasTotales"].HeaderText = "Asistencias totales";
            columnas["verificado"].HeaderText         = "Verificado";

            // Las muestro en un orden particular
            int intOrden = 0;

            columnas["nControl"].DisplayIndex             = intOrden++;
            columnas["estudiantes"].DisplayIndex          = intOrden++;
            columnas["calificacionParcial1"].DisplayIndex = intOrden++;
            columnas["calificacionParcial2"].DisplayIndex = intOrden++;
            columnas["calificacionParcial3"].DisplayIndex = intOrden++;
            columnas["asistenciasParcial1"].DisplayIndex  = intOrden++;
            columnas["asistenciasParcial2"].DisplayIndex  = intOrden++;
            columnas["asistenciasParcial3"].DisplayIndex  = intOrden++;
            columnas["promedio"].DisplayIndex             = intOrden++;
            columnas["asistenciasTotales"].DisplayIndex   = intOrden++;
            columnas["tipoDeAcreditacion"].DisplayIndex   = intOrden++;
            columnas["tipoDeAcreditacion1"].DisplayIndex  = intOrden++;
            columnas["firmado"].DisplayIndex       = intOrden++;
            columnas["recursamiento"].DisplayIndex = intOrden++;
            columnas["verificado"].DisplayIndex    = intOrden++;

            // Limito la edición de los campos
            columnas["nControl"].ReadOnly      = true;
            columnas["estudiantes"].ReadOnly   = true;
            columnas["recursamiento"].ReadOnly = true;
            columnas["verificado"].ReadOnly    = true;

            // Y finalmente, le doy formato a las columnas de calificaciones,
            // para que sólo acepten dos decimales, y otras cosas más...
            columnas["calificacionParcial1"].DefaultCellStyle.Format = "N2";
            columnas["calificacionParcial2"].DefaultCellStyle.Format = "N2";
            columnas["calificacionParcial3"].DefaultCellStyle.Format = "N2";
            columnas["promedio"].DefaultCellStyle.Format             = "N2";

            columnas["recursamiento"].DefaultCellStyle.ForeColor = Color.LightGray;

            columnas["nControl"].Width            = 100;
            columnas["estudiantes"].Width         = 220;
            columnas["tipoDeAcreditacion1"].Width = 100;
            columnas["firmado"].Width             = 40;

            // Botones que sólo funcionan si hay DataSource
            configurarBotones(true);
        }
Ejemplo n.º 8
0
        private void configurarDGVCalificacionesSiseems(BindingList <calificaciones_semestrales> listaCalificacionesBinding)
        {
            // Si la colección es originalmente nula, o vacía, salimos.
            if (listaCalificacionesBinding == null || listaCalificacionesBinding.Count < 1)
            {
                dgvCalificacionesSiseems.DataSource = null;
                dgvCalificacionesSiseems.Columns["tipoDeAcreditacion1"].Visible = false;
                dgvCalificacionesSiseems.Columns["actualizar"].Visible          = false;

                return;
            }

            // Ordenamos la binding list...
            listaCalificacionesBinding = new BindingList <calificaciones_semestrales>(
                listaCalificacionesBinding.
                OrderBy(
                    c =>
                    c.estudiantes.apellido1 +
                    c.estudiantes.apellido2 +
                    c.estudiantes.nombres).
                ToList()
                );

            // Agregamos todos los datos al dgv
            dgvCalificacionesSiseems.DataSource = listaCalificacionesBinding;

            // Ahora, obtenemos la colección de columnas...
            DataGridViewColumnCollection columnas = dgvCalificacionesSiseems.Columns;

            // Iteramos sobre todas las columnas para hacerlas invisibles
            // y de sólo lectura
            foreach (DataGridViewColumn c in columnas)
            {
                c.Visible  = false;
                c.ReadOnly = true;
            }

            // Volvemos editable la columna de actualizar
            columnas["actualizar"].ReadOnly = false;

            // Itero sobre las filas para agregar algunas cosas
            int i = 0;

            foreach (DataGridViewRow row in dgvCalificacionesSiseems.Rows)
            {
                // Primero, el número de lista
                row.HeaderCell.Value = String.Format("{0}", row.Index + 1);

                calificaciones_semestrales cFila = ((calificaciones_semestrales)row.DataBoundItem);

                // Segundo, el color de fondo para mostrar a los de recursamiento
                // (Probablemente en este DGV nunca se muestren)
                if (cFila.recursamiento)
                {
                    row.DefaultCellStyle.BackColor = Color.LightGreen;
                }

                // Tercero, seleccionamos el tipo de acreditación
                // A NP NA RV R
                DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)row.Cells["tipoDeAcreditacion1"];
                cell.Value = listaCalificacionesBinding[i].tipoDeAcreditacion;
                i++;



                // ESTO ES ADICIONAL PARA RESALTAR LAS DIFERENCIAS
                calificaciones_semestrales cEquivalente = calificacionesActuales.SingleOrDefault(c => c.idEstudiante == cFila.idEstudiante);
                // -- Ya existen, pero las calificaciones son diferentes (LIGHT BLUE)
                // -- Además de que se pone como default el valor TRUE para actualizar
                // -- y los botones se desactivarán
                if (cEquivalente != null)
                {
                    encontrados++;
                    bool flag = false;


                    if (ControladorMiscelaneo.compararNullableDouble(cFila.calificacionParcial1, cEquivalente.calificacionParcial1) != 0)
                    {
                        flag = true;

                        row.Cells["calificacionParcial1"].Style.BackColor = colorDiferenciasResaltado;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cFila.calificacionParcial2, cEquivalente.calificacionParcial2) != 0)
                    {
                        flag = true;

                        row.Cells["calificacionParcial2"].Style.BackColor = colorDiferenciasResaltado;
                    }


                    if (ControladorMiscelaneo.compararNullableDouble(cFila.calificacionParcial3, cEquivalente.calificacionParcial3) != 0)
                    {
                        flag = true;

                        row.Cells["calificacionParcial3"].Style.BackColor = colorDiferenciasResaltado;
                    }



                    if (ControladorMiscelaneo.compararNullableDouble(cFila.asistenciasParcial1, cEquivalente.asistenciasParcial1) != 0)
                    {
                        flag = true;

                        row.Cells["asistenciasParcial1"].Style.BackColor = colorDiferenciasResaltado;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cFila.asistenciasParcial2, cEquivalente.asistenciasParcial2) != 0)
                    {
                        flag = true;

                        row.Cells["asistenciasParcial2"].Style.BackColor = colorDiferenciasResaltado;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cFila.asistenciasParcial3, cEquivalente.asistenciasParcial3) != 0)
                    {
                        flag = true;

                        row.Cells["asistenciasParcial3"].Style.BackColor = colorDiferenciasResaltado;
                    }



                    if (cFila.tipoDeAcreditacion != cEquivalente.tipoDeAcreditacion)
                    {
                        flag = true;

                        row.Cells["tipoDeAcreditacion"].Style.BackColor = colorDiferenciasResaltado;
                    }

                    if (cFila.firmado != cEquivalente.firmado)
                    {
                        flag = true;

                        row.Cells["firmado"].Style.BackColor = colorDiferenciasResaltado;
                    }



                    if (flag)
                    {
                        diferencias++;

                        row.DefaultCellStyle.BackColor = colorDiferencias;
                        row.Cells["actualizar"].Value  = true;

                        cmdGuardarDiferencias.Enabled = true;
                        cmdSeleccionarNinguno.Enabled = true;
                        cmdSeleccionarTodos.Enabled   = true;
                    }
                    // -- Si no, entonces no se pondrá color, y se hará inactualizable
                    // -- tal registro, y los botones se desactivarán
                    else
                    {
                        row.Cells["actualizar"].Value    = false;
                        row.Cells["actualizar"].ReadOnly = true;

                        cmdGuardarDiferencias.Enabled = true;
                        cmdSeleccionarNinguno.Enabled = true;
                        cmdSeleccionarTodos.Enabled   = true;
                    }
                }
                // -- No existe en nuestro registro (LIGHT RED)
                else
                {
                    if (cFila.idEstudiante != -1)
                    {
                        noEncontradosGrupo++;

                        row.DefaultCellStyle.BackColor = colorNoEncontradosGrupo;
                    }
                    else
                    {
                        noEncontradosDB++;

                        row.DefaultCellStyle.BackColor = colorNoEncontradosDB;
                    }

                    row.Cells["recursamiento"].Value = false;
                    row.Cells["actualizar"].Value    = true;
                    row.Cells["verificado"].Value    = false;
                }
            }

            // Muestro únicamente las que me interesan
            columnas["actualizar"].Visible           = true;
            columnas["nControl"].Visible             = true;
            columnas["calificacionParcial1"].Visible = true;
            columnas["calificacionParcial2"].Visible = true;
            columnas["calificacionParcial3"].Visible = true;
            columnas["asistenciasParcial1"].Visible  = true;
            columnas["asistenciasParcial2"].Visible  = true;
            columnas["asistenciasParcial3"].Visible  = true;
            columnas["tipoDeAcreditacion"].Visible   = false;
            columnas["tipoDeAcreditacion1"].Visible  = true;
            columnas["firmado"].Visible            = true;
            columnas["estudiantes"].Visible        = true;
            columnas["promedio"].Visible           = true;
            columnas["asistenciasTotales"].Visible = true;

            // Cambio el título
            columnas["nControl"].HeaderText             = "Núm. control";
            columnas["calificacionParcial1"].HeaderText = "Cal. P1";
            columnas["calificacionParcial2"].HeaderText = "Cal. P2";
            columnas["calificacionParcial3"].HeaderText = "Cal. P3";
            columnas["asistenciasParcial1"].HeaderText  = "Asis. P1";
            columnas["asistenciasParcial2"].HeaderText  = "Asis. P2";
            columnas["asistenciasParcial3"].HeaderText  = "Asis. P3";
            columnas["tipoDeAcreditacion"].HeaderText   = "Tipo de Acreditación";
            columnas["tipoDeAcreditacion1"].HeaderText  = "Tipo de Acreditación (Combo)";
            columnas["firmado"].HeaderText            = "Firmado";
            columnas["estudiantes"].HeaderText        = "Estudiante";
            columnas["promedio"].HeaderText           = "Promedio";
            columnas["asistenciasTotales"].HeaderText = "Asistencias totales";

            // Las muestro en un orden particular
            int intOrden = 0;

            columnas["actualizar"].DisplayIndex           = intOrden++;
            columnas["nControl"].DisplayIndex             = intOrden++;
            columnas["estudiantes"].DisplayIndex          = intOrden++;
            columnas["calificacionParcial1"].DisplayIndex = intOrden++;
            columnas["calificacionParcial2"].DisplayIndex = intOrden++;
            columnas["calificacionParcial3"].DisplayIndex = intOrden++;
            columnas["asistenciasParcial1"].DisplayIndex  = intOrden++;
            columnas["asistenciasParcial2"].DisplayIndex  = intOrden++;
            columnas["asistenciasParcial3"].DisplayIndex  = intOrden++;
            columnas["promedio"].DisplayIndex             = intOrden++;
            columnas["asistenciasTotales"].DisplayIndex   = intOrden++;
            columnas["tipoDeAcreditacion"].DisplayIndex   = intOrden++;
            columnas["tipoDeAcreditacion1"].DisplayIndex  = intOrden++;
            columnas["firmado"].DisplayIndex = intOrden++;

            // Y finalmente, le doy formato a las columnas de calificaciones,
            // para que sólo acepten dos decimales, y otras cosas más...
            columnas["calificacionParcial1"].DefaultCellStyle.Format = "N2";
            columnas["calificacionParcial2"].DefaultCellStyle.Format = "N2";
            columnas["calificacionParcial3"].DefaultCellStyle.Format = "N2";
            columnas["promedio"].DefaultCellStyle.Format             = "N2";

            // Construcción del resumen
            lblEncontrados.Text        = "Se encontraron " + encontrados + " alumno(s) pertenecientes al grupo.";
            lblDiferencias.Text        = diferencias + " alumnos tienen diferencias en sus calificaciones.";
            lblNoEncontradosGrupo.Text = noEncontradosGrupo + " alumnos no pertenecen al grupo.";
            lblNoEncontradosDB.Text    = noEncontradosDB + " alumnos no se encuentran en la base de datos.";

            // Si las diferencias y los alumnos no pertenecientes son 0
            // entonces deshabilitamos el botón de guardar diferencias
        }
        // Métodos de inicialización
        public FrmHistorialDeCambios(calificaciones_semestrales calificacion)
        {
            InitializeComponent();

            this.calificacion = calificacion;
        }