/// <summary>
        /// Actualizar los datos de una posición del esquema de un manifiesto.
        /// </summary>
        /// <param name="p">Objeto PosicionEsquema con los datos de la posición a actualizar</param>
        public void actualizarPosicionEsquema(PosicionEsquema p)
        {
            SqlCommand comando = _manejador.obtenerProcedimiento("UpdateEsquemaManifiestoPosicion");

            _manejador.agregarParametro(comando, "@descripcion", p.Descripcion, SqlDbType.VarChar);
            _manejador.agregarParametro(comando, "@posicion_x", p.Posicion_x, SqlDbType.Decimal);
            _manejador.agregarParametro(comando, "@posicion_y", p.Posicion_y, SqlDbType.Decimal);
            _manejador.agregarParametro(comando, "@desplazamiento_vertical", p.Desplazamiento_vertical, SqlDbType.Decimal);
            _manejador.agregarParametro(comando, "@desplazamiento_horizontal", p.Desplazamiento_horizontal, SqlDbType.Decimal);
            _manejador.agregarParametro(comando, "@alto", p.Alto, SqlDbType.Decimal);
            _manejador.agregarParametro(comando, "@ancho", p.Ancho, SqlDbType.Decimal);
            _manejador.agregarParametro(comando, "@id_impresion", p.Id_impresion, SqlDbType.TinyInt);
            _manejador.agregarParametro(comando, "@posicion", p, SqlDbType.SmallInt);

            try
            {
                _manejador.ejecutarConsultaActualizacion(comando);
                comando.Connection.Close();
            }
            catch (Exception)
            {
                comando.Connection.Close();
                throw new Excepcion("ErrorPosicionesEsquemaActualizacion");
            }
        }
        /// <summary>
        /// Clic en el botón de agregar posición.
        /// </summary>
        private void btnAgregarPosicion_Click(object sender, EventArgs e)
        {
            string descripcion = txtDescripcion.Text;

            PosicionEsquema posicion = new PosicionEsquema(descripcion);

            BindingList <PosicionEsquema> posiciones = (BindingList <PosicionEsquema>)dgvPosiciones.DataSource;

            posiciones.Add(posicion);

            txtDescripcion.Text = string.Empty;
        }
        /// <summary>
        /// Eliminar los datos de una posición del esquema de un manifiesto.
        /// </summary>
        /// <param name="p">Objeto PosicionEsquema con los datos de la posición a eliminar</param>
        public void eliminarPosicionEsquema(PosicionEsquema p)
        {
            SqlCommand comando = _manejador.obtenerProcedimiento("DeleteEsquemaManifiestoPosicion");

            _manejador.agregarParametro(comando, "@posicion", p, SqlDbType.SmallInt);

            try
            {
                _manejador.ejecutarConsultaActualizacion(comando);
                comando.Connection.Close();
            }
            catch (Exception)
            {
                comando.Connection.Close();
                throw new Excepcion("ErrorPosicionesEsquemaActualizacion");
            }
        }
        /// <summary>
        /// Actualizar los valores de una posición del esquema.
        /// </summary
        private void dgvPosiciones_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvPosiciones.RowCount > 0)
            {
                DataGridViewRow fila     = dgvPosiciones.Rows[e.RowIndex];
                PosicionEsquema posicion = (PosicionEsquema)fila.DataBoundItem;

                try
                {
                    _mantenimiento.actualizarPosicionEsquema(posicion);
                }
                catch (Excepcion ex)
                {
                    ex.mostrarMensaje();
                }

                dgvPosiciones.Refresh();
            }
        }
        /// <summary>
        /// Obtener las posiciones del esquema de un manifiesto.
        /// </summary>
        /// <param name="e">Esquema para el cual se obtiene la lista de posiciones</param>
        public void obtenerPosicionesEsquema(ref EsquemaManifiesto e)
        {
            SqlCommand    comando    = _manejador.obtenerProcedimiento("SelectEsquemaManifiestoPosiciones");
            SqlDataReader datareader = null;

            _manejador.agregarParametro(comando, "@esquema", e, SqlDbType.TinyInt);

            try
            {
                datareader = _manejador.ejecutarConsultaDatos(comando);

                while (datareader.Read())
                {
                    short   id                        = (short)datareader["pk_ID"];
                    string  descripcion               = (string)datareader["Descripcion"];
                    decimal posicion_x                = (decimal)datareader["Posicion_X"];
                    decimal posicion_y                = (decimal)datareader["Posicion_Y"];
                    decimal desplazamiento_vertical   = (decimal)datareader["Desplazamiento_Vertical"];
                    decimal desplazamiento_horizontal = (decimal)datareader["Desplazamiento_Horizontal"];
                    decimal alto                      = (decimal)datareader["Alto"];
                    decimal ancho                     = (decimal)datareader["Ancho"];
                    byte    id_impresion              = (byte)datareader["ID_Impresion"];

                    PosicionEsquema posicion = new PosicionEsquema(descripcion, id: id, posicion_x: posicion_x, posicion_y: posicion_y,
                                                                   desplazamiento_vertical: desplazamiento_vertical,
                                                                   desplazamiento_horizontal: desplazamiento_horizontal,
                                                                   alto: alto, ancho: ancho, id_impresion: id_impresion);

                    e.agregarPosicion(posicion);
                }

                comando.Connection.Close();
            }
            catch (Exception)
            {
                comando.Connection.Close();
                throw new Excepcion("ErrorDatosConexion");
            }
        }