private void ProcesarNodosEnTreeView(TreeNode MyTreeNode, dbGeneralDataContext MydbGeneralDataContext, out bool bError, out String sErrMessage)
    {
        bError      = false;
        sErrMessage = "";

        Roles_FuncionesAplicacion MyRole_FuncionesAplicacion;

        foreach (TreeNode MyTreeNode_Child in MyTreeNode.ChildNodes)
        {
            if (MyTreeNode_Child.Checked)
            // registramos el nodo en la tabla
            {
                MyRole_FuncionesAplicacion = new Roles_FuncionesAplicacion();

                MyRole_FuncionesAplicacion.RoleName     = Roles_ListBox.SelectedValue;
                MyRole_FuncionesAplicacion.FunctionName = MyTreeNode_Child.Text;

                MydbGeneralDataContext.Roles_FuncionesAplicacions.InsertOnSubmit(MyRole_FuncionesAplicacion);
                try
                {
                    MydbGeneralDataContext.SubmitChanges();
                }
                catch (Exception ex)
                {
                    ErrMessage_Span.InnerHtml        = "Ha ocurrido un error al intentar efectuar una operación en la base de datos.<br />El mensaje específico de error es: " + ex.Message;
                    ErrMessage_Span.Style["display"] = "block";

                    bError      = true;
                    sErrMessage = ex.Message;
                    return;
                }
            }

            ProcesarNodosEnTreeView(MyTreeNode_Child, MydbGeneralDataContext, out bError, out sErrMessage);

            if (bError)
            {
                // ocurrió un error en la ejecución (recursiva) de la función
                return;
            }
        }
    }
    protected void RegistrarAsociaciones_Button_Click(object sender, EventArgs e)
    {
        // el usuario debe haber seleccionado un rol

        if (Roles_ListBox.SelectedIndex == -1)
        {
            ErrMessage_Span.InnerHtml        = "Ud. debe seleccionar un rol al cual asociar las funciones.";
            ErrMessage_Span.Style["display"] = "block";

            return;
        }

        // primero eliminamos las funciones que ahora existen para el rol

        dbGeneralDataContext dbGeneral = new dbGeneralDataContext();

        var query = from q in dbGeneral.Roles_FuncionesAplicacions
                    where q.RoleName == Roles_ListBox.SelectedValue
                    select q;

        foreach (var MyRolesFunciones in query)
        {
            dbGeneral.Roles_FuncionesAplicacions.DeleteOnSubmit(MyRolesFunciones);

            try
            {
                dbGeneral.SubmitChanges();
            }
            catch (Exception ex)
            {
                ErrMessage_Span.InnerHtml        = "Ha ocurrido un error al intentar efectuar una operación en la base de datos.<br />El mensaje específico de error es: " + ex.Message;
                ErrMessage_Span.Style["display"] = "block";

                return;
            }
        }

        // recorremos los nodos seleccionados en el treeview y los guardamos en la tabla
        // Roles_FuncionesAplicacion para el rol seleccionado

        bool   bError;
        String sErrMessage;

        Roles_FuncionesAplicacion MyRole_FuncionesAplicacion;

        foreach (TreeNode MyTreeNode in TreeView1.Nodes)
        {
            if (MyTreeNode.Checked)
            // registramos el nodo en la tabla
            {
                MyRole_FuncionesAplicacion = new Roles_FuncionesAplicacion();

                MyRole_FuncionesAplicacion.RoleName     = Roles_ListBox.SelectedValue;
                MyRole_FuncionesAplicacion.FunctionName = MyTreeNode.Text;

                dbGeneral.Roles_FuncionesAplicacions.InsertOnSubmit(MyRole_FuncionesAplicacion);

                try
                {
                    dbGeneral.SubmitChanges();
                }
                catch (Exception ex)
                {
                    ErrMessage_Span.InnerHtml        = "Ha ocurrido un error al intentar efectuar una operación en la base de datos.<br />El mensaje específico de error es: " + ex.Message;
                    ErrMessage_Span.Style["display"] = "block";

                    return;
                }
            }

            ProcesarNodosEnTreeView(MyTreeNode, dbGeneral, out bError, out sErrMessage);

            if (bError)
            {
                // ocurrió un error en la ejecución (recursiva) de la función
                ErrMessage_Span.InnerHtml        = "Ha ocurrido un error en la ejecución de este proceso.<br />El mensaje específico obtenido para el error es: " + sErrMessage;
                ErrMessage_Span.Style["display"] = "block";

                return;
            }

            Message_Span.InnerHtml        = "Ok, las funciones han sido asociadas al rol seleccionado.";
            Message_Span.Style["display"] = "block";
        }
    }