Sv Community El Salvador
Soporte y Tecnología => Tutoriales => Topic started by: Non Servium on May 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
--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!!!
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!!)
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)
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
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
-
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:
-
Muy interensante.
Gracias....revisando.
-
gracias men ........revisando ... se te agradece :drinks:
-
De nada comunidad! :D :thumbsup:
en lo q pueda servirles! ;)
-
Muchas gracias esta muy bien tu explicación :thumbsup:
-
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
-
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
-
Hola amigo:
Estoy manejando Visual studio 2010 versión ultimate, y SQL server 2008.... Gracias por tu ayuda....
Buen dia
-
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.
-
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
-
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
-
Excelente!! Gracias!! solo me falta un detalle :thumbsup: :drinks:
-
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.
-
1) Ponele un punto en
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
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:
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:
Menu[0].Tag = MenuPadre["UrlMenu"].ToString();
-
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?
-
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
-
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)
-
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.?
-
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.