Sv Community El Salvador

Soporte y Tecnología => Tutoriales => Mensaje iniciado por: Non Servium en mayo 06, 2011, 02:43:04 pm

Título: MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Non Servium en mayo 06, 2011, 02:43:04 pm
Bueno les traigo acá nuevamente a mis apreciados communiters un tuto q esta de voladas en algo xD  ;)

Alcance: Es para un sistema con usuarios y roles... Pues es la propia plantilla de eso.
Explicación: Un usuario "x" tiene permisos concedidos a ciertos catálogos, permisos de lectura, escritura y eliminación... estos pueden ser restringidos, modificados, etc.  :shockd:
Requerimientos: Visual Studio 2008 (o usen el código fuente para integrarlo al 2005), SQL Server 2008 (o les paso el script q use) :) y tener ganas de aprender  :thumbsup:

Pasos light  :rofl: (para q no se aburran asumiré y obviaré unas partes)

1 - Create una base de datos SQL llamada MenuDinamico...
2 - Corre el Script

Código: [Seleccionar]
--HACEMOS UN ESQUEMA PARA Q SE VEA MAS BONITO JAJA
USE [MenuDinamico]
GO

CREATE SCHEMA [SIS] AUTHORIZATION [dbo]
GO

--CREAMOS TABLA MENUS
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [SIS].[TBL_Menus](
[Id_Menu] [int] IDENTITY(1,1) NOT NULL,
[Id_MenuPadre] [int] NULL,
[DescripcionMenu] [varchar](255) NOT NULL,
[PosicionMenu] [int] NOT NULL,
[HabilitadoMenu] [bit] NOT NULL,
[UrlMenu] [varchar](255) NULL,
[FormularioAsociado] [bit] NOT NULL,
 CONSTRAINT [PK_TBL_Menus] PRIMARY KEY CLUSTERED
(
[Id_Menu] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [SIS].[TBL_Menus] ADD  CONSTRAINT [DF_TBL_Menus_HabilitadoMenu]  DEFAULT (1) FOR [HabilitadoMenu]
GO

ALTER TABLE [SIS].[TBL_Menus] ADD  CONSTRAINT [DF_TBL_Menus_FormularioAsociado]  DEFAULT (0) FOR [FormularioAsociado]
GO

--CREAMOS TABLA PERFILES
USE [MenuDinamico]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [SIS].[TBL_Perfiles](
[Id_Perfil] [int] IDENTITY(1,1) NOT NULL,
[NombrePerfil] [varchar](25) NOT NULL,
[DescripcionPerfil] [varchar](255) NOT NULL,
 CONSTRAINT [PK_TBL_Perfiles] PRIMARY KEY CLUSTERED
(
[Id_Perfil] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [AK_TBL_Perfiles] UNIQUE NONCLUSTERED
(
[NombrePerfil] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

--CREAMOS TABLA USUARIOS
USE [MenuDinamico]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [SIS].[TBL_Usuarios](
[Id_Usuario] [int] IDENTITY(1,1) NOT NULL,
[Id_Perfil] [int] NOT NULL,
[IdentificadorUsuario] [varchar](20) NOT NULL,
[ContraseniaUsuario] [varchar](20) NOT NULL,
[NombreUsuario] [varchar](50) NOT NULL,
 CONSTRAINT [PK_TBL_Usuarios] PRIMARY KEY CLUSTERED
(
[Id_Usuario] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [AK_TBL_Usuarios] UNIQUE NONCLUSTERED
(
[IdentificadorUsuario] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [SIS].[TBL_Usuarios]  WITH NOCHECK ADD  CONSTRAINT [FK_TBL_Usuarios_TBL_Perfiles] FOREIGN KEY([Id_Perfil])
REFERENCES [SIS].[TBL_Perfiles] ([Id_Perfil])
GO

ALTER TABLE [SIS].[TBL_Usuarios] CHECK CONSTRAINT [FK_TBL_Usuarios_TBL_Perfiles]
GO

--CREAMOS TABLA PERMISOS POR PERFIL
USE [MenuDinamico]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [SIS].[TBL_PerfilesPermisos](
[Id_PerfilPermisos] [int] IDENTITY(1,1) NOT NULL,
[Id_Perfil] [int] NOT NULL,
[Id_Menu] [int] NOT NULL,
[Lectura] [bit] NOT NULL,
[Escritura] [bit] NOT NULL,
[Eliminacion] [bit] NOT NULL,
 CONSTRAINT [PK_TBL_PerfilesPermisos] PRIMARY KEY CLUSTERED
(
[Id_PerfilPermisos] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [AK_TBL_PerfilesPermisos] UNIQUE NONCLUSTERED
(
[Id_Perfil] ASC,
[Id_Menu] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [SIS].[TBL_PerfilesPermisos]  WITH NOCHECK ADD  CONSTRAINT [FK_TBL_PerfilesPermisos_TBL_Menus] FOREIGN KEY([Id_Menu])
REFERENCES [SIS].[TBL_Menus] ([Id_Menu])
GO

ALTER TABLE [SIS].[TBL_PerfilesPermisos] CHECK CONSTRAINT [FK_TBL_PerfilesPermisos_TBL_Menus]
GO

ALTER TABLE [SIS].[TBL_PerfilesPermisos]  WITH NOCHECK ADD  CONSTRAINT [FK_TBL_PerfilesPermisos_TBL_Perfiles] FOREIGN KEY([Id_Perfil])
REFERENCES [SIS].[TBL_Perfiles] ([Id_Perfil])
GO

ALTER TABLE [SIS].[TBL_PerfilesPermisos] CHECK CONSTRAINT [FK_TBL_PerfilesPermisos_TBL_Perfiles]
GO

ALTER TABLE [SIS].[TBL_PerfilesPermisos] ADD  CONSTRAINT [DF_TBL_PerfilesPermisos_lectura]  DEFAULT (1) FOR [Lectura]
GO

ALTER TABLE [SIS].[TBL_PerfilesPermisos] ADD  CONSTRAINT [DF_TBL_PerfilesPermisos_escritura]  DEFAULT (0) FOR [Escritura]
GO

--INSERTANDO DATOS DE PRUEBA

--Menus
INSERT INTO [SIS].[TBL_Menus]
([Id_MenuPadre]
      ,[DescripcionMenu]
      ,[PosicionMenu]
      ,[HabilitadoMenu]
      ,[UrlMenu]
      ,[FormularioAsociado]) VALUES
      (0, 'Sistema', 1, 1, NULL, 0)
     
INSERT INTO [SIS].[TBL_Menus]
([Id_MenuPadre]
      ,[DescripcionMenu]
      ,[PosicionMenu]
      ,[HabilitadoMenu]
      ,[UrlMenu]
      ,[FormularioAsociado]) VALUES
      (1, 'Perfiles', 1, 1, 'Catalogos.Frm_Perfiles', 1)
     
INSERT INTO [SIS].[TBL_Menus]
([Id_MenuPadre]
      ,[DescripcionMenu]
      ,[PosicionMenu]
      ,[HabilitadoMenu]
      ,[UrlMenu]
      ,[FormularioAsociado]) VALUES
      (1, 'Permisos', 2, 1, 'Catalogos.Frm_PerfilesPermisos', 1)
     
INSERT INTO [SIS].[TBL_Menus]
([Id_MenuPadre]
      ,[DescripcionMenu]
      ,[PosicionMenu]
      ,[HabilitadoMenu]
      ,[UrlMenu]
      ,[FormularioAsociado]) VALUES
      (1, 'Usuarios', 3, 1, 'Catalogos.Frm_Usuarios', 1)
     
INSERT INTO [SIS].[TBL_Menus]
([Id_MenuPadre]
      ,[DescripcionMenu]
      ,[PosicionMenu]
      ,[HabilitadoMenu]
      ,[UrlMenu]
      ,[FormularioAsociado]) VALUES
      (0, 'Inventarios', 2, 1, NULL, 0)
     
INSERT INTO [SIS].[TBL_Menus]
([Id_MenuPadre]
      ,[DescripcionMenu]
      ,[PosicionMenu]
      ,[HabilitadoMenu]
      ,[UrlMenu]
      ,[FormularioAsociado]) VALUES
      (5, 'Kardex', 1, 1, 'Inventarios.Frm_Kardex', 1)
     
INSERT INTO [SIS].[TBL_Menus]
([Id_MenuPadre]
      ,[DescripcionMenu]
      ,[PosicionMenu]
      ,[HabilitadoMenu]
      ,[UrlMenu]
      ,[FormularioAsociado]) VALUES
      (5, 'Facturas de Compras', 2, 1, 'Inventarios.Frm_FacturasCompras', 1)
     
INSERT INTO [SIS].[TBL_Menus]
([Id_MenuPadre]
      ,[DescripcionMenu]
      ,[PosicionMenu]
      ,[HabilitadoMenu]
      ,[UrlMenu]
      ,[FormularioAsociado]) VALUES
      (5, 'Remisiones', 3, 1, 'Inventarios.Frm_Remisiones', 1)
     
--Perfiles
INSERT INTO [MenuDinamico].[SIS].[TBL_Perfiles]
           ([NombrePerfil]
           ,[DescripcionPerfil])
     VALUES
           ('Administrador del Sistema'
           ,'Administra y da Mantenimiento a todas las opciones del Sistema')
GO

INSERT INTO [MenuDinamico].[SIS].[TBL_Perfiles]
           ([NombrePerfil]
           ,[DescripcionPerfil])
     VALUES
           ('Perfil de inventarios'
           ,'El perfil encargado de dar mantenimiento a diversos catálogos de inventarios')
GO

--Usuarios
INSERT INTO [MenuDinamico].[SIS].[TBL_Usuarios]
           ([Id_Perfil]
           ,[IdentificadorUsuario]
           ,[ContraseniaUsuario]
           ,[NombreUsuario])
     VALUES
           (1--1 Admin
           ,'imorales'
           ,'abc123'
           ,'Ilich Daniel Morales')
GO

INSERT INTO [MenuDinamico].[SIS].[TBL_Usuarios]
           ([Id_Perfil]
           ,[IdentificadorUsuario]
           ,[ContraseniaUsuario]
           ,[NombreUsuario])
     VALUES
           (1--1 Admin
           ,'mperez'
           ,'mperez'
           ,'María Pérez')
GO

INSERT INTO [MenuDinamico].[SIS].[TBL_Usuarios]
           ([Id_Perfil]
           ,[IdentificadorUsuario]
           ,[ContraseniaUsuario]
           ,[NombreUsuario])
     VALUES
           (2--2 Mantto
           ,'jgomez'
           ,'jgomez'
           ,'Juan Gómez')
GO

--Permisos por perfiles
INSERT INTO [MenuDinamico].[SIS].[TBL_PerfilesPermisos]
           ([Id_Perfil]
           ,[Id_Menu]
           ,[Lectura]
           ,[Escritura]
           ,[Eliminacion])
     SELECT 1, 1, 1, 1, 1
     UNION SELECT 1, 2, 1, 1, 1
     UNION SELECT 1, 3, 1, 1, 1
     UNION SELECT 1, 4, 1, 1, 1
     UNION SELECT 1, 5, 1, 1, 1
     UNION SELECT 1, 6, 1, 1, 0
     UNION SELECT 1, 7, 1, 0, 1
     UNION SELECT 1, 8, 1, 0, 1
     UNION SELECT 2, 5, 1, 1, 1
     UNION SELECT 2, 6, 1, 0, 0
     UNION SELECT 2, 7, 1, 1, 1
     UNION SELECT 2, 8, 1, 1, 1
GO

--Vista que ayuda un ve.... para analizar los menus disponibles
USE [MenuDinamico]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

USE [MenuDinamico]
GO

/****** Object:  View [SIS].[Qry_PerfilesPermisos]    Script Date: 05/05/2011 17:07:45 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [SIS].[Qry_PerfilesPermisos]
AS
SELECT     SIS.TBL_Menus.DescripcionMenu, SIS.TBL_Menus.FormularioAsociado, SIS.TBL_Menus.Id_Menu, SIS.TBL_Menus.Id_MenuPadre, SIS.TBL_Menus.PosicionMenu,
                      SIS.TBL_Menus.HabilitadoMenu, SIS.TBL_Menus.UrlMenu, SIS.TBL_PerfilesPermisos.Id_Perfil, SIS.TBL_PerfilesPermisos.Lectura,
                      SIS.TBL_PerfilesPermisos.Escritura, SIS.TBL_PerfilesPermisos.Eliminacion
FROM         SIS.TBL_PerfilesPermisos INNER JOIN
                      SIS.TBL_Menus ON SIS.TBL_PerfilesPermisos.Id_Menu = SIS.TBL_Menus.Id_Menu

GO

EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPane1', @value=N'[0E232FF0-B466-11cf-A24F-00AA00A3EFFF, 1.00]
Begin DesignProperties =
   Begin PaneConfigurations =
      Begin PaneConfiguration = 0
         NumPanes = 4
         Configuration = "(H (1[40] 4[20] 2[20] 3) )"
      End
      Begin PaneConfiguration = 1
         NumPanes = 3
         Configuration = "(H (1 [50] 4 [25] 3))"
      End
      Begin PaneConfiguration = 2
         NumPanes = 3
         Configuration = "(H (1 [50] 2 [25] 3))"
      End
      Begin PaneConfiguration = 3
         NumPanes = 3
         Configuration = "(H (4 [30] 2 [40] 3))"
      End
      Begin PaneConfiguration = 4
         NumPanes = 2
         Configuration = "(H (1 [56] 3))"
      End
      Begin PaneConfiguration = 5
         NumPanes = 2
         Configuration = "(H (2 [66] 3))"
      End
      Begin PaneConfiguration = 6
         NumPanes = 2
         Configuration = "(H (4 [50] 3))"
      End
      Begin PaneConfiguration = 7
         NumPanes = 1
         Configuration = "(V (3))"
      End
      Begin PaneConfiguration = 8
         NumPanes = 3
         Configuration = "(H (1[56] 4[18] 2) )"
      End
      Begin PaneConfiguration = 9
         NumPanes = 2
         Configuration = "(H (1 [75] 4))"
      End
      Begin PaneConfiguration = 10
         NumPanes = 2
         Configuration = "(H (1[66] 2) )"
      End
      Begin PaneConfiguration = 11
         NumPanes = 2
         Configuration = "(H (4 [60] 2))"
      End
      Begin PaneConfiguration = 12
         NumPanes = 1
         Configuration = "(H (1) )"
      End
      Begin PaneConfiguration = 13
         NumPanes = 1
         Configuration = "(V (4))"
      End
      Begin PaneConfiguration = 14
         NumPanes = 1
         Configuration = "(V (2))"
      End
      ActivePaneConfig = 0
   End
   Begin DiagramPane =
      Begin Origin =
         Top = 0
         Left = 0
      End
      Begin Tables =
         Begin Table = "TBL_PerfilesPermisos (SIS)"
            Begin Extent =
               Top = 6
               Left = 38
               Bottom = 155
               Right = 236
            End
            DisplayFlags = 280
            TopColumn = 0
         End
         Begin Table = "TBL_Menus (SIS)"
            Begin Extent =
               Top = 6
               Left = 274
               Bottom = 177
               Right = 472
            End
            DisplayFlags = 280
            TopColumn = 0
         End
      End
   End
   Begin SQLPane =
   End
   Begin DataPane =
      Begin ParameterDefaults = ""
      End
      Begin ColumnWidths = 9
         Width = 284
         Width = 1500
         Width = 1500
         Width = 1500
         Width = 1500
         Width = 1500
         Width = 1500
         Width = 1500
         Width = 1500
      End
   End
   Begin CriteriaPane =
      Begin ColumnWidths = 11
         Column = 1440
         Alias = 900
         Table = 1170
         Output = 720
         Append = 1400
         NewValue = 1170
         SortType = 1350
         SortOrder = 1410
         GroupBy = 1350
         Filter = 1350
         Or = 1350
         Or = 1350
         Or = 1350
      End
   End
End
' , @level0type=N'SCHEMA',@level0name=N'SIS', @level1type=N'VIEW',@level1name=N'Qry_PerfilesPermisos'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPaneCount', @value=1 , @level0type=N'SCHEMA',@level0name=N'SIS', @level1type=N'VIEW',@level1name=N'Qry_PerfilesPermisos'
GO
Te va a quedar una estructura bonita como esta...

(http://i234.photobucket.com/albums/ee66/ilichpunk/Proyectos_Tutoriales/base2.png)

3 - Analiza la bd y observa q Usuario tiene perfil y los permisos por perfil tiene menu y perfil  :huh:... Hasta q la comprendas pasate al 4 xD
4 - Bueno agregamos una solucion VS C# (Yo le puse "MenuDinamico")...
5 - Crea un MDI parent con un menu VACIO (osea no le hagas nada mas q ponerle nombre)  ;)

(http://i234.photobucket.com/albums/ee66/ilichpunk/Proyectos_Tutoriales/menu_ppal.png)

6 - Create un login asi como el mio! q se levante en el load del MDI xD

Tipo con todo esto!!!


Código: [Seleccionar]
        private DataTable dtMenus; //se guardaran los menus de la tabla SIS.TBL_Menus
        private System.Reflection.Assembly Ensamblado; //Ensamblado para levantar el catálogo
        private Ctrl_Datos.Cls_Seguridad Sistema; //Clase q hice para acceder a datos OLE-DB (SQL)
        private Int32 id_Perfil; //Variable para mantener el perfil vivo (para asignarla en el Load y usarla en un método)
        private void Frm_Mdi_Principal_Load(object sender, EventArgs e)
        {
            Frm_Login login = new Frm_Login();
            login.ShowDialog();
            if (login.IngresoCorrecto)
            {
                Ensamblado = System.Reflection.Assembly.GetExecutingAssembly();
                this.MenuPpal.Items.Clear(); //x si acaso xD
                this.CargarMenus(login.PerfilUsuario); //Ya lo hago, trankis xD
                id_Perfil = login.PerfilUsuario; //El catálogo tiene una propiedad publica
            }
            else
            {
                Application.Exit();
            }
        }

(http://i234.photobucket.com/albums/ee66/ilichpunk/Proyectos_Tutoriales/login.png)

Nota: Cuando hagan login, asegurate de buscar el Id_Usuario por identificadorUsuario y ContraseniaUsuario... retorna Id_Perfil (y Id_Usuario si fuese necesario) si existe, etc, etc.. ya lo sabras hacer...

7 - El método CargarMenus es una fumada q crea el menú según tu perfil con el q el usuario inicio sesión (en teoría) y no lo pasaré x aca xq es un re.... bastante xD En resumen, importante aclarar el evento debe declararse asii...
NuevoMenu[0].Click += new EventHandler(MenuItemClicked);

y el evento q hara es... (Lo q necesitaba un colega x ahii!!)


Código: [Seleccionar]
        private void MenuItemClicked(object sender, EventArgs e)
        {
            // if the sender is a ToolStripMenuItem
            if (sender.GetType() == typeof(ToolStripMenuItem))
            {
                string NombreFormulario = ((ToolStripItem)sender).Tag.ToString();
                Object ObjFrm;
                //Type tipo = default(Type);
                Type tipo = Ensamblado.GetType(Ensamblado.GetName().Name + "." + NombreFormulario);
                if (tipo == null)
                {
                    MessageBox.Show("No se encontró el formulario", "Error de ubicación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    if (!this.FormularioEstaAbierto(NombreFormulario))
                    {
                        ObjFrm = Activator.CreateInstance(tipo);
                        Plantilla Formulario = (Plantilla)ObjFrm;
                        Formulario.Id_Perfil = id_Perfil;
                        Formulario.MdiParent = this;
                        Formulario.Show();
                    }
                }
            }
        }

8 - Por tiempo les explicaré mas o menos lo q tienen q tener... Crear el menú según el perfil, Crear una plantilla mas o menos como esta...

(http://i234.photobucket.com/albums/ee66/ilichpunk/Proyectos_Tutoriales/plantilla.png)
y heredar tus formularios de esta plantilla :D

9 - el evento FormularioEstaAbierto debe tener... (Esto es lo q neceistas, tengo entendidoo)

Código: [Seleccionar]
        private Boolean FormularioEstaAbierto(String NombreDelFrm)
        {
            if (this.MdiChildren.Length > 0)
            {
                for (int i = 0; i < this.MdiChildren.Length; i++)
                {
                    //MessageBox.Show(NombreDelFrm.Substring(NombreDelFrm.IndexOf("Frm_"), NombreDelFrm.Length - NombreDelFrm.IndexOf("Frm_")));
                    if (this.MdiChildren[i].Name == NombreDelFrm.Substring(NombreDelFrm.IndexOf("Frm_"), NombreDelFrm.Length - NombreDelFrm.IndexOf("Frm_")))
                    {
                        MessageBox.Show("El formulario solicitado ya se encuentra abierto");
                        return true;
                    }
                }
                return false;
            }
            else
                return false;
        }

10 - Despues podes dejar plantoso (aprovechando lo d los permisos q tiene la base)  :thumbsup:
Solo usamos una función (q puse en mi clase de datos) q se le manden los label d los catalogos q usaron la plantilla, el Id_Perfil (heredado de Plantilla.cs) y la propiedad this.Name del formulario

Código: [Seleccionar]
public void ObtenerPermisos(int Id_Perfil, String nombreFormulario,
            ref global::System.Windows.Forms.Label Lbl_PermisoEliminacion,
            ref global::System.Windows.Forms.Label Lbl_PermisoEscritura,
            ref global::System.Windows.Forms.Label Lbl_PermisoLectura)
        {
            String sql = "SELECT Lectura, Escritura, Eliminacion FROM [SIS].[Qry_PerfilesPermisos] WHERE Id_Perfil = " + Id_Perfil + " AND UrlMenu LIKE '%" + nombreFormulario + "'";
            try
            {
                SqlDataAdapter sqlDa = new SqlDataAdapter(sql, cnn);
                DataTable permisos = new DataTable("Permisos");
                sqlDa.Fill(permisos);
                if (permisos.Rows.Count == 1)
                {
                    Lbl_PermisoEliminacion.Text += (Convert.ToInt32(permisos.Rows[0]["Eliminacion"]) == 1) ? "SI" : "NO";
                    Lbl_PermisoEscritura.Text += (Convert.ToInt32(permisos.Rows[0]["Escritura"]) == 1) ? "SI" : "NO";
                    Lbl_PermisoLectura.Text += (Convert.ToInt32(permisos.Rows[0]["Lectura"]) == 1) ? "SI" : "NO";
                }
                else
                {
                    Lbl_PermisoEliminacion.Text = "WDF? hay catalogos con el mismo nombre y diferente ubicacion?";
                    Lbl_PermisoEscritura.Text = "WDF? hay catalogos con el mismo nombre y diferente ubicacion?";
                    Lbl_PermisoLectura.Text = "WDF? hay catalogos con el mismo nombre y diferente ubicacion?";
                }
            }
            catch (Exception ex)
            {
                Lbl_PermisoEliminacion.Text = "ERROR";
                Lbl_PermisoEscritura.Text = "ERROR";
                Lbl_PermisoLectura.Text = "ERROR";
            }
        }


 :drinks:

Ya adjunto los archivos x si necesitan ver para creer jajaja  :D

Comenten si son buena gente  :bananajump: :roll:

Salud!!!


Jeinn!! ya les estaba enseñando mis bases xD
Título: Re: MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Non Servium en mayo 06, 2011, 02:56:02 pm
Back Up SQL 2008
http://cid-7f135d52e89ee063.office.live.com/self.aspx/.Public/BK^_MenuDinamico.bak (http://cid-7f135d52e89ee063.office.live.com/self.aspx/.Public/BK^_MenuDinamico.bak)

Script SQL
http://cid-7f135d52e89ee063.office.live.com/self.aspx/.Public/MenuDinamico.sql (http://cid-7f135d52e89ee063.office.live.com/self.aspx/.Public/MenuDinamico.sql)

Solución VS 2008
http://cid-7f135d52e89ee063.office.live.com/self.aspx/.Public/MenuDinamico.rar (http://cid-7f135d52e89ee063.office.live.com/self.aspx/.Public/MenuDinamico.rar)

Gracias ;)  me merezco mis ...  :drinks: :drinks:
Título: Re: MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: wsantos en mayo 07, 2011, 09:12:41 am
Muy interensante.

Gracias....revisando.
Título: Re: MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: kirchoff en mayo 07, 2011, 11:46:20 am
gracias men ........revisando ... se te agradece :drinks:
Título: Re: MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Non Servium en mayo 12, 2011, 02:40:49 pm
De nada comunidad! :D  :thumbsup:

en lo q pueda servirles! ;) 
Título: Re: MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: DavidR en enero 30, 2012, 01:29:29 pm
Muchas gracias esta muy bien tu explicación  :thumbsup:
Título: Re: MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: jmariche en julio 09, 2012, 03:57:21 pm
Hola amigo:

Esta excelente tu aplicación..... seria mucho pedir que por favor hicieras mas grande tu explicación, si gustas me la puedes enviar a mi correo es: jesusjonathanmb@hotmail.com.... Muchas gracias

Buen dia
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Non Servium en julio 10, 2012, 09:56:36 am
Hola amigo:

Esta excelente tu aplicación..... seria mucho pedir que por favor hicieras mas grande tu explicación, si gustas me la puedes enviar a mi correo es: jesusjonathanmb@hotmail.com.... Muchas gracias

Buen dia
Con gusto, más tarde te puedo responder a tu correo! ¿qué lenguaje de programación y gestor de base de datos ocupas?
Gracias por revivir este tema :D
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: jmariche en julio 10, 2012, 03:18:48 pm
Hola amigo:

Estoy manejando Visual studio 2010 versión ultimate, y SQL server 2008.... Gracias por tu ayuda....

Buen dia
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: ggonzalezr81 en agosto 04, 2012, 04:00:01 am
Hola amigo, déjame decirte que es un gran aporte. Fuiste muy explicativo.

Precisamente estoy trabajando en un programita que necesito que contenga un menú dinámico según los roles.

Logre ver la estructura de la base de datos y está genial. Pero no he podido ver la solución que publicaste. Cuando la abro el VS 2010 hace la migración, pero al final el proyecto no me abre.

Yo estoy trabajando en  VB.net  y me pareció ver que lo tuyo esta en C.

Te agradecería demasiado si me puedes mandar la solución tuya para darme una idea a nivel de pantallas el como hacer lo mio en VB.

Mi correo: ggonzalezr81@hotmail.com

Espero te encuentres bien.
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: dasagi en febrero 25, 2014, 10:30:04 am
Buen Dia!,

Estoy realizando un menu dinamico para windows Form en Visual 2010, me puedes por favor colocar de nuevo el codigo en visual para realizar el mio

Gracias
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Non Servium en febrero 25, 2014, 11:09:23 am
Buen Dia!,
Estoy realizando un menu dinamico para windows Form en Visual 2010, me puedes por favor colocar de nuevo el codigo en visual para realizar el mio
Gracias
Reviviendo tema muuuuy viejo... bueno, viendo que los links no están disponibles los voy a adjuntar aquí para todos nuevamente  :thumbsup:

Solución de Visual Studio 2010 y Backup de SQL Server
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: dasagi en febrero 25, 2014, 02:16:19 pm
Excelente!! Gracias!! solo me falta un detalle  :thumbsup:  :drinks:
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Arielrt17 en mayo 01, 2014, 10:53:38 pm
Buenas!, se que el Post es viejo pero quisiera hacerte una pregunta. Luego de agregar un nuevo formulario a la BD con su url y todo al ejecutar la aplicación me sale en el menú, pero al darle click me dice que el formulario no ha sido encontrado y por mas que eh revisado el código no encuentro el problema, si me pudieras ayudar te agradecería mucho.
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Non Servium en mayo 02, 2014, 08:17:13 am
1) Ponele un punto en
Código: [Seleccionar]
string NombreFormulario = ((ToolStripItem)sender).Tag.ToString();
y mirá que hace cuando llega a declarar la variable tipo unas líneas más abajo.

2) Comprobá que la ruta es correcta según Ensamblado.GetName().Name y NombreFormulario
Código: [Seleccionar]
Type tipo = Ensamblado.GetType(Ensamblado.GetName().Name + "." + NombreFormulario);
Si has puesto el formulario dentro de una carpeta, verifica que "Ensamblado.GetName().Name" traiga toda la ruta

3) Verifica que los espacios de nombre coincidan con el menú, pues se busca en base a este por el ensamblado no por el nombre
Por ejemplo:
Código: [Seleccionar]
namespace MenuDinamico.Catalogos
{
    public partial class Frm_Perfiles : MenuDinamico.Plantilla
    {
    }
}
Ya que por ocasiones sucede que cambiamos nombre a un formulario (De Form1.cs a MiFormulario.cs, por ejemplo) y no verificamos que la clase seguiría siendo Form1

4) Verifica que la ruta del formulario se asigne al menú en el MDI... es una línea que dice:
Código: [Seleccionar]
Menu[0].Tag = MenuPadre["UrlMenu"].ToString();
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Arielrt17 en mayo 02, 2014, 11:22:00 am
Gracias por tu respuesta.
Veras, eh verificado todo lo que me dices y esta todo bien a excepción de esta linea " Type tipo = Ensamblado.GetType(Ensamblado.GetName().Name + "." + NombreFormulario);" verifico y la direccion del formulario esta correcta en "Ensamblado.GetName().Name + "." + NombreFormulario" sin embargo cuando verifico esa variable tipo me dice el siguiente error "No se controlo NullReferenceException, referencia a objeto no establecida como instancia de un objeto " cual crees que seria el problema?
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: dajher en diciembre 26, 2014, 02:17:58 pm
que tal antes que nada agradecer.. es un excelente tema... solo que no pude descargar los archivos.. el servidor ya no esta disponible... que pasoo me podrian pasar estoos por favoor... se lo agradecería
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: Non Servium en abril 19, 2015, 05:58:53 pm
que tal antes que nada agradecer.. es un excelente tema... solo que no pude descargar los archivos.. el servidor ya no esta disponible... que pasoo me podrian pasar estoos por favoor... se lo agradecería

No había visto que ya no servían los links desde que es OneDrive :s ... bueno, creo que nunca es tarde jaja

NUEVO LINK (http://1drv.ms/1DqUDu0)
Título: MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: nillfrank en noviembre 04, 2018, 10:17:53 pm
Gran aporte  :yahoo:, revisando a pesar de tiempo es muy útil, ahora el tema de restringir cada control eso se podría alojar en un formulario de configuración por así decirlo para que esa asignación sea dinámica.?
Título: Re:MenuStrip dinámico según Perfiles (roles) de Usuario con Win Forms C#
Publicado por: g00mba en noviembre 05, 2018, 11:35:00 am
Gran aporte  :yahoo:, revisando a pesar de tiempo es muy útil, ahora el tema de restringir cada control eso se podría alojar en un formulario de configuración por así decirlo para que esa asignación sea dinámica.?
usa una solucion compatible con OpenID-Connect. esas cosas hechas a pata no son aceptables.