private void CargarInferencia()
    {
        TuCuento.Entidades.HistoriaDetalle oDetalle = new TuCuento.Entidades.HistoriaDetalle();
        List<TuCuento.Entidades.Condicion> oLstCond = new List<TuCuento.Entidades.Condicion>();
        TuCuento.Entidades.Condicion oCondicion;
        TuCuento.Entidades.CondicionValPosible oValPosible;
        DropDownList ddlVPosible;

        foreach (GridViewRow grdRow in gvCondiciones.Rows)
        {
            //Obtengo el combo
            ddlVPosible = (DropDownList)(gvCondiciones.Rows[grdRow.RowIndex].Cells[1].FindControl("ddlValPosible"));

            if (Convert.ToInt32(ddlVPosible.SelectedValue) > 0)
            {
                oCondicion = new TuCuento.Entidades.Condicion();
                oValPosible = new TuCuento.Entidades.CondicionValPosible();

                oValPosible.nCod_ValPosible = Convert.ToInt32(ddlVPosible.SelectedValue);
                oValPosible.sOperadorLogico = ddlVPosible.SelectedItem.Text.Substring(0, 2);
                oValPosible.sValor = ddlVPosible.SelectedItem.Text.Substring(2);

                //Obtengo el nCod_Condicion
                oCondicion.nCod_Condicion = Convert.ToInt32(Server.HtmlDecode(grdRow.Cells[0].Text.Trim()));
                oCondicion.sNombre = Server.HtmlDecode(grdRow.Cells[1].Text.Trim());
                oCondicion.lstValPosible = new List<TuCuento.Entidades.CondicionValPosible>();
                oCondicion.lstValPosible.Add(oValPosible);

                oLstCond.Add(oCondicion);
            }
        }

        foreach (ListItem item in lvAccionesInf.Items)
        {
            TuCuento.Entidades.Accion oAccion = new TuCuento.Entidades.Accion();
            oAccion.nCod_Accion = Convert.ToInt32(item.Value);
            oDetalle.Inferencia.Accion.Add(oAccion);
        }

        //oDetalle.Inferencia.Accion.nCod_Accion = Convert.ToInt32(lvAccionesInf.SelectedValue);
        oDetalle.Inferencia.Condiciones = oLstCond;
        oDetalle.nCod_Historia = Convert.ToInt32(HfnCod_Historia.Value);
        oDetalle.nCod_TipoHistoriaDetalle = Funciones.CodigoTipoHistoriaDetalle(Funciones.TipoHistoriaDetalle.Inferencia.ToString());

        if (HfnOrden.Value == "")
        {
            oDetalle.nOrden = lstDetalleHistoria.Count + 1;
            lstDetalleHistoria.Add(oDetalle);
        }
        else
        {
            oDetalle.nOrden = Convert.ToInt32(HfnOrden.Value)+1; //Porque el valor que tome en el hiden es el valor de la lista que comineza por 0
            lstDetalleHistoria[Convert.ToInt32(HfnOrden.Value)] = oDetalle;
        }

    }
    private void CargarListaDetalle(int nCod_Historia)
    {
        DataTable oTabla = TuCuento.Negocio.HistoriaDetalle_NEG.ListarDetalleHistoria(nCod_Historia);

        foreach (DataRow oFila in oTabla.Rows)
        {
            TuCuento.Entidades.HistoriaDetalle oDetalle = new TuCuento.Entidades.HistoriaDetalle();

            oDetalle.nCod_Historia = Convert.ToInt32(oFila["nCod_Historia"].ToString());
            oDetalle.nCod_TipoHistoriaDetalle = Convert.ToInt32(oFila["nCod_TipoHistoriaDetalle"].ToString());
            oDetalle.nOrden = Convert.ToInt32(oFila["nOrden"].ToString());

            Funciones.TipoHistoriaDetalle oTipo = (Funciones.TipoHistoriaDetalle)oDetalle.nCod_TipoHistoriaDetalle;

            if (Funciones.TipoHistoriaDetalle.Texto == oTipo)
            {
                DataTable oTexto = TuCuento.Negocio.HistoriaDetalle_NEG.TraerTexto(oDetalle.nCod_Historia, oDetalle.nOrden);

                oDetalle.Texto.sTexto = oTexto.Rows[0]["sTexto"].ToString();

            }
            else
            {
                TuCuento.Entidades.HistoriaDetInf oInferencia = new TuCuento.Entidades.HistoriaDetInf();
                //Traigo las condiciones
                DataTable oTablaInferencia = TuCuento.Negocio.HistoriaDetalle_NEG.TraerCondiciones(nCod_Historia,oDetalle.nOrden);

                foreach (DataRow oFilaInf in oTablaInferencia.Rows)
                {
                    TuCuento.Entidades.Condicion oCondicion = new TuCuento.Entidades.Condicion();
                    TuCuento.Entidades.CondicionValPosible oValPosible = new TuCuento.Entidades.CondicionValPosible();
                    
                    oCondicion.nCod_Condicion = Convert.ToInt32(oFilaInf["nCod_Condicion"].ToString());
                    oCondicion.sNombre = oFilaInf["sNombreCondicion"].ToString();
                    
                    oValPosible.nCod_ValPosible = Convert.ToInt32(oFilaInf["nCod_ValPosible"].ToString());
                    oValPosible.sOperadorLogico = oFilaInf["sOperadorLogico"].ToString().PadRight(2,Convert.ToChar(" "));
                    oValPosible.sValor = oFilaInf["sValor"].ToString();

                    oCondicion.lstValPosible = new List<TuCuento.Entidades.CondicionValPosible>();
                    oCondicion.lstValPosible.Add(oValPosible);

                    oInferencia.Condiciones.Add(oCondicion);
                }

                //Traigo las acciones
                oTablaInferencia = TuCuento.Negocio.HistoriaDetalle_NEG.TraerAccion(nCod_Historia, oDetalle.nOrden);

                foreach (DataRow oFilaInf in oTablaInferencia.Rows)
                {
                    TuCuento.Entidades.Accion oAccion = new TuCuento.Entidades.Accion();
                    oAccion.nCod_Accion = Convert.ToInt32(oFilaInf["nCod_Accion"].ToString());
                    //oInferencia.Accion.nCod_Accion = Convert.ToInt32(oFilaInf["nCod_Accion"].ToString());
                    oInferencia.Accion.Add(oAccion);
                }

                oDetalle.Inferencia = oInferencia;

            }

            lstDetalleHistoria.Add(oDetalle);
        }

    }
    protected void btnGrabar_Click(object sender, EventArgs e)
    {
        if (ValidarDatos())
        {
            //Cargo los datos en un objeto
            TuCuento.Entidades.Accion oAccion = new TuCuento.Entidades.Accion();

            oAccion.nCod_Dominio = Convert.ToInt32(ddlDominioCond.SelectedValue);

            if (HfAccion.Value == "EDIT")
                oAccion.nCod_Accion = Convert.ToInt32(HfnCod_Accion.Value);

            oAccion.sNombre = txtNombre.Text.Trim();
            oAccion.sDescripcion = txtDescripcion.Text.Trim();
            oAccion.nHab = (chkHab.Checked ? 1 : 0);
            if (rdTAHecho.Checked)
                oAccion.nCod_TipoAccion = Funciones.CodigoTipoAccion(Funciones.TipoAccion.ModHecho.ToString());
            else
                oAccion.nCod_TipoAccion = Funciones.CodigoTipoAccion(Funciones.TipoAccion.EjecutaHistoria.ToString());

            if (PanelHecho.Visible)
            {
                oAccion.Hecho = new TuCuento.Entidades.AccionHecho();
                oAccion.Hecho.nCod_Entidad = Convert.ToInt32(ddlEntidad.SelectedValue);
                oAccion.Hecho.nCod_Atributo = Convert.ToInt32(ddlAtributo.SelectedValue);
                oAccion.Hecho.sValor = sValorIngresado;
                oAccion.Historia = null;
            }
            else
            {
                oAccion.Historia = new TuCuento.Entidades.AccionHistoria();
                oAccion.Hecho = null;
                oAccion.Historia.nCod_Historia = Convert.ToInt32(ddlHistoria.SelectedValue);
            }
            
            if (TuCuento.Negocio.Accion_NEG.Persistir(oAccion))
            {
                InicializarPagina();
                LbMensaje.Text = "Se actualizaron los datos.";
            }
            else
            {
                Master.MensajeError = "Ocurrio un error al intentar grabar la acción, por favor, vuelva a intentarlo mas tarde. Disculpe las molestias.";
            }
        }
    }
    private void CargarListaAcciones()
    {
        if (lstAcciones == null)
        {
            DataTable oTabla = TuCuento.Negocio.Accion_NEG.ListarAcciones(-1, 1, Convert.ToInt32(ddlDominio.SelectedValue));

            if (oTabla.Rows.Count > 0)
                lstAcciones = new List<TuCuento.Entidades.Accion>();

            foreach (DataRow oRow in oTabla.Rows)
            {
                TuCuento.Entidades.Accion oAccion = new TuCuento.Entidades.Accion();

                oAccion.nCod_Accion = Convert.ToInt32(oRow["nCod_Accion"].ToString());
                oAccion.sNombre = oRow["sNombre"].ToString();

                lstAcciones.Add(oAccion);

            }
        }
    }
    private void CargarListaDetalle(int nCod_Historia)
    {
        DataTable oTabla = TuCuento.Negocio.HistoriaDetalle_NEG.ListarDetalleHistoria(nCod_Historia);
        List<TuCuento.Entidades.EntidadAtributo> lstEntidadNoMostrar = new List<TuCuento.Entidades.EntidadAtributo>();
        
        foreach (DataRow oFila in oTabla.Rows)
        {
            TuCuento.Entidades.HistoriaDetalle oDetalle = new TuCuento.Entidades.HistoriaDetalle();

            oDetalle.nCod_Historia = Convert.ToInt32(oFila["nCod_Historia"].ToString());
            oDetalle.nCod_TipoHistoriaDetalle = Convert.ToInt32(oFila["nCod_TipoHistoriaDetalle"].ToString());
            oDetalle.nOrden = Convert.ToInt32(oFila["nOrden"].ToString());

            Funciones.TipoHistoriaDetalle oTipo = (Funciones.TipoHistoriaDetalle)oDetalle.nCod_TipoHistoriaDetalle;

            if (Funciones.TipoHistoriaDetalle.Texto == oTipo)
            {
                DataTable oTexto = TuCuento.Negocio.HistoriaDetalle_NEG.TraerTexto(oDetalle.nCod_Historia, oDetalle.nOrden);

                oDetalle.Texto.sTexto = oTexto.Rows[0]["sTexto"].ToString();

            }
            else
            {
                TuCuento.Entidades.HistoriaDetInf oInferencia = new TuCuento.Entidades.HistoriaDetInf();
                //Traigo las condiciones
                DataTable oTablaInferencia = TuCuento.Negocio.HistoriaDetalle_NEG.TraerCondiciones(nCod_Historia, oDetalle.nOrden);

                foreach (DataRow oFilaInf in oTablaInferencia.Rows)
                {
                    TuCuento.Entidades.Condicion oCondicion = new TuCuento.Entidades.Condicion();
                    TuCuento.Entidades.CondicionValPosible oValPosible = new TuCuento.Entidades.CondicionValPosible();

                    oCondicion.nCod_Condicion = Convert.ToInt32(oFilaInf["nCod_Condicion"].ToString());
                    oCondicion.nCod_Entidad = Convert.ToInt32(oFilaInf["nCod_Entidad"].ToString());
                    oCondicion.nCod_Atributo = Convert.ToInt32(oFilaInf["nCod_Atributo"].ToString());

                    bool bEstaValPosible = false;
                    bool bEstaEntidadAtributo = false;

                    foreach (Inferencia oDato in lstInferencia)
                    {
                        if (oDato.nCod_Entidad == oCondicion.nCod_Entidad && oDato.nCod_Atributo == oCondicion.nCod_Atributo)
                        {
                            bEstaEntidadAtributo = true;
                            foreach (ValPosible oDatoVal in oDato.lstValPosible)
                            {
                                if (oDatoVal.nCod_ValPosible == Convert.ToInt32(oFilaInf["nCod_ValPosible"].ToString()))
                                {
                                    bEstaValPosible = true;
                                    break;
                                }
                            }
                            if (!bEstaValPosible)
                            {
                                ValPosible oCValPos = new ValPosible();
                                oCValPos.nCod_ValPosible = Convert.ToInt32(oFilaInf["nCod_ValPosible"].ToString());
                                oCValPos.sOperadorLogico = oFilaInf["sOperadorLogico"].ToString();
                                oCValPos.sValor = oFilaInf["sValor"].ToString();

                                if (oDato.lstValPosible == null)
                                {
                                    List<ValPosible> oValPos = new List<ValPosible>();
                                    oValPos.Add(oCValPos);
                                    oDato.lstValPosible = oValPos;
                                }
                                else
                                {
                                    oDato.lstValPosible.Add(oCValPos);
                                }
                                
                            }
                        }
                        if (bEstaEntidadAtributo)
                            break;
                    }

                    
                    if (!bEstaEntidadAtributo)
                    {
                        Inferencia oInf = new Inferencia(oCondicion.nCod_Entidad, oCondicion.nCod_Atributo, oFilaInf["sAtributo"].ToString());
                        List<ValPosible> oValPos = new List<ValPosible>();

                        ValPosible oCValPos = new ValPosible();
                        oCValPos.nCod_ValPosible = Convert.ToInt32(oFilaInf["nCod_ValPosible"].ToString());
                        oCValPos.sOperadorLogico = oFilaInf["sOperadorLogico"].ToString();
                        oCValPos.sValor = oFilaInf["sValor"].ToString();
                        oValPos.Add(oCValPos);
                        oInf.lstValPosible = oValPos;

                        lstInferencia.Add(oInf);
                    }
                                    
                    oValPosible.nCod_ValPosible = Convert.ToInt32(oFilaInf["nCod_ValPosible"].ToString());
                    oValPosible.sOperadorLogico = oFilaInf["sOperadorLogico"].ToString();
                    oValPosible.sValor = oFilaInf["sValor"].ToString();

                    oCondicion.lstValPosible = new List<TuCuento.Entidades.CondicionValPosible>();
                    oCondicion.lstValPosible.Add(oValPosible);

                    oInferencia.Condiciones.Add(oCondicion);
                }

                //Traigo las acciones
                oTablaInferencia = TuCuento.Negocio.HistoriaDetalle_NEG.TraerAccion(nCod_Historia, oDetalle.nOrden);

                foreach (DataRow oFilaInf in oTablaInferencia.Rows)
                {
                    TuCuento.Entidades.Accion oAccion = new TuCuento.Entidades.Accion();
                    oAccion.nCod_Accion = Convert.ToInt32(oFilaInf["nCod_Accion"].ToString());
                    oAccion.nCod_TipoAccion = Convert.ToInt32(oFilaInf["nCod_TipoAccion"].ToString());

                    //Si modifica un hecho busco cual es el hecho y lo agrego a la lista de hechos que no tengo que mostrar
                    if ((Funciones.TipoAccion)oAccion.nCod_TipoAccion == Funciones.TipoAccion.ModHecho)
                    {
                        DataTable oAccionModHecho = TuCuento.Negocio.Accion_NEG.ListarAcciones(oAccion.nCod_Accion, -1, -1);

                        TuCuento.Entidades.EntidadAtributo oEntAtrr = new TuCuento.Entidades.EntidadAtributo();
                        oEntAtrr.nCod_Entidad = Convert.ToInt32(oAccionModHecho.Rows[0]["nCod_Entidad"].ToString());
                        oEntAtrr.nCod_Atributo = Convert.ToInt32(oAccionModHecho.Rows[0]["nCod_Atributo"].ToString());

                        lstEntidadNoMostrar.Add(oEntAtrr);
                    }
                    else
                    {
                        oAccion.Historia = new TuCuento.Entidades.AccionHistoria();
                        oAccion.Historia.nCod_Historia = Convert.ToInt32(oFilaInf["nCod_HistoriaAccion"].ToString());
                    }

                    oInferencia.Accion.Add(oAccion);
                }

                oDetalle.Inferencia = oInferencia;

            }

            lstDetalleHistoria.Add(oDetalle);
        }

        //Quito las entidades y atributos que van a ser inferidos
        foreach (TuCuento.Entidades.EntidadAtributo oEnt in lstEntidadNoMostrar) 
        {
            foreach (Inferencia oInf in lstInferencia)
            {
                if (oEnt.nCod_Entidad == oInf.nCod_Entidad && oEnt.nCod_Atributo == oInf.nCod_Atributo)
                {
                    lstInferencia.Remove(oInf);
                    break;
                }
            }
        }

    }