private String GetTablaHerramientas(Int32 nivel, String numeracion, String tipo_herramienta, infoNodoProgramaGeneral infoNodo)
    {
        Int32 TAMANO_TABLA = 0;
        if (nivel == 1)
        {
            TAMANO_TABLA = 100;
        }
        else
        {
            Int32 porcentaje = 5 * (nivel - 1);
            TAMANO_TABLA = 100 - porcentaje;
        }

        String html_tabla = "<table border=\"0\" cellpadding=\"1\" cellspacing=\"0\" width=\"[TAMANO_TABLA]%\" align=\"right\">";
        html_tabla += "<tr>";
        html_tabla += "<td width=\"[TAMANO_TD_NUMERACION]\" valign=\"top\" style=\"text-align:left;\">";
        html_tabla += "[NUMERACION]";
        html_tabla += "</td>";
        html_tabla += "<td style=\"text-align: justify;\">";
        html_tabla += "[TEXTO]";
        html_tabla += "</td>";
        html_tabla += "</tr>";
        html_tabla += "</table>";

        html_tabla = html_tabla.Replace("[TAMANO_TABLA]", TAMANO_TABLA.ToString());

        if (tipo_herramienta == "SUBPROGRAMA")
        {
            html_tabla = html_tabla.Replace("[NUMERACION]", numeracion);
            html_tabla = html_tabla.Replace("[TEXTO]", "<b>" + infoNodo.SUB_NOMBRE + ":</b> " + infoNodo.SUB_DESCRIPCION);
            html_tabla = html_tabla.Replace("[TAMANO_TD_NUMERACION]", "5");
        }
        else
        {
            html_tabla = html_tabla.Replace("[NUMERACION]", "•");
            html_tabla = html_tabla.Replace("[TEXTO]", "<b>" + infoNodo.ACT_TIPO + " - " + infoNodo.ACT_NOMBRE + ":</b> " + infoNodo.ACT_DESCRIPCION + "<b>SECTOR:</b> " + infoNodo.ACT_SECTOR);
            html_tabla = html_tabla.Replace("[TAMANO_TD_NUMERACION]", "3");
        }

        return html_tabla;
    }
    private void CargarSubProgramasYActividadesDeProgramaGeneralEnLista(Decimal ID_PROGRAMA_GENERAL, Decimal ID_DETALLE_GENERAL_PADRE, Dictionary<String, infoNodoProgramaGeneral> diccionario, String numeracion)
    {
        int contador = 1;

        Programa _programa = new Programa(Session["idEmpresa"].ToString(), Session["USU_LOG"].ToString());
        DataTable tablaDetallesProgramaGeneral = _programa.ObtenerDetallesProgramaGeneralPorIdPadre(ID_PROGRAMA_GENERAL, ID_DETALLE_GENERAL_PADRE);

        //recorremos agregando los subprogramas al nodo padre
        foreach (DataRow fila in tablaDetallesProgramaGeneral.Rows)
        {
            if (fila["TIPO"].ToString().Trim() == TiposNodoProgramaGeneral.SUBPROGRAMA.ToString())
            {
                infoNodoProgramaGeneral nodo = new infoNodoProgramaGeneral();

                nodo.TIPO_NODO = TiposNodoProgramaGeneral.SUBPROGRAMA;
                nodo.SUB_DESCRIPCION = fila["DESCRIPCION_SUB_PROGRAMA"].ToString().Trim();
                nodo.SUB_NOMBRE = fila["NOMBRE_SUB_PROGRAMA"].ToString().Trim();

                Decimal ID_DETALLE_GENERAL = Convert.ToDecimal(fila["ID_DETALLE_GENERAL"]);

                if (numeracion == null)
                {
                    diccionario.Add(contador.ToString() + ":" + TiposNodoProgramaGeneral.SUBPROGRAMA.ToString(), nodo);
                    CargarSubProgramasYActividadesDeProgramaGeneralEnLista(ID_PROGRAMA_GENERAL, ID_DETALLE_GENERAL, diccionario, contador.ToString());
                }
                else
                {
                    diccionario.Add(numeracion + "." + contador.ToString() + ":" + TiposNodoProgramaGeneral.SUBPROGRAMA.ToString(), nodo);
                    CargarSubProgramasYActividadesDeProgramaGeneralEnLista(ID_PROGRAMA_GENERAL, ID_DETALLE_GENERAL, diccionario, numeracion + "." + contador.ToString());
                }
            }

            contador += 1;
        }

        //RECORREMOS AGREGANDO AHORA LAS ACTIVIDADES
        contador = 1;
        foreach (DataRow fila in tablaDetallesProgramaGeneral.Rows)
        {
            if (fila["TIPO"].ToString().Trim() == TiposNodoProgramaGeneral.ACTIVIDAD.ToString())
            {
                infoNodoProgramaGeneral nodo = new infoNodoProgramaGeneral();

                nodo.TIPO_NODO = TiposNodoProgramaGeneral.ACTIVIDAD;
                nodo.ACT_DESCRIPCION = fila["DESCRIPCION_ACTIVIDAD"].ToString().Trim();
                nodo.ACT_NOMBRE = fila["NOMBRE_ACTIVIDAD"].ToString().Trim();
                nodo.ACT_SECTOR = fila["SECTOR_ACTIVIDAD"].ToString().Trim();
                nodo.ACT_TIPO = fila["TIPO_ACTIVIDAD"].ToString().Trim();

                if (numeracion == null)
                {
                    diccionario.Add(contador.ToString() + ":" + TiposNodoProgramaGeneral.ACTIVIDAD.ToString(), nodo);
                }
                else
                {
                    diccionario.Add(numeracion + "." + contador.ToString() + ":" + TiposNodoProgramaGeneral.ACTIVIDAD.ToString(), nodo);
                }
            }
            contador += 1;
        }
    }