none
Introducir datos en un campo de un proyecto relacionado con otro Visual Studio RRS feed

  • Pregunta

  • Hola a todos, trabajo en Visual Studio 2010.

    Os comento lo que quiero hacer a ver si es posible.

    Tengo mi proyecto, el cual consta de dos proyecto. Uno es una librería llamada "LibBas" , la cual contiene todos los controles que utilizo en mi proyecto  así como un formulario base, el cual cojo en el otro proyecto principal cuando creo un formulario nuevo "formulario heredado".

    Cuando se ejecuta  el proyecto principal se tiene que validar el usuario y este puede ser "Adm" o "User" y dependiendo de si es uno u otro algunos controles tendrán que estar activos para poder escribir en él o solo mostrarse los datos. He creado una variable  dentro de la Configuración del proyecto principal llamada "RolUser" para poder utilizar esta variable dentro de todo el proyecto principal. He relacionado el proyecto "LibBas" dentro del principal .

    Mi pregunta es la siguiente: podría relacionar la variable "RolUser" creada en el proyecto principal con el proyecto "LibBas" para así, por ejemplo, cuando utilizo  el control TextBox poder poner una función If para  así controlar la propiedad Enabled y ponerla a True o False según sea el Rol del Usuario que haya entrado en el proyecto.  

    Si fuera posible, me ahorraría mucho código ya que utilizo muchos controles TextBox en mi proyecto y hay muchos que son de solo lectura para cuando el usuario es "User" y no tendría que pensar si lo es o no.

    Espero haberme explicado bien.

    Gracias de antemano.


    Saluditos, Charo

    martes, 6 de octubre de 2015 18:41

Respuestas

  • En el module, te falta poner "Public":

    Public Module FuncioneBasicas
        Public RolUserLB As String
    End Module

    De lo contrario el módulo es "Friend" y solo se ve dentro de la librería, pero no en el programa principal. La variable también tiene que ser Public.

    Después de eso, desde el programa principal lo llamas así:

    LibBas.FuncioneBasicas.RolUserLB = ...

    • Marcado como respuesta charoeci1 jueves, 8 de octubre de 2015 9:53
    miércoles, 7 de octubre de 2015 12:26

Todas las respuestas

  • Exactamente tal como lo describes no se puede hacer. Es decir, el proyecto referenciado no puede acceder a una variable del proyecto referenciante. Lo que se hace en estos casos es que el referenciante inyecte en el referenciado algún parámetro por cuya mediación se pueda acceder a la variable. Por ejemplo, pasándole como argumento el this (o el Me si programas en VB) de la clase que contiene la variable en el momento de instanciar la clase del proyecto referenciado (cosa que requeriría que dicha clase se defina en el proyecto referenciado), o pasándole un delegado que apunte a una función de retrollamada que le devuelva el valor de la variable.
    miércoles, 7 de octubre de 2015 7:33
  • Hola Alberto. No te entiendo exactamente lo que me quieres decir, pero he realizado lo siguiente.

    Dentro del proyecto del que heredo los controles "LibBas", he creado una clase clsVarUsuario con una variable publica llamada RolUser. Dentro de uno de los controles he llamado a esta clase Dim clsRolUser As New clsVarUsuario y he puesto lo siguiente dentro de este  procedimiento:

     Public Sub New(ByVal Container As System.ComponentModel.IContainer)
            MyClass.New()
            If clsRolUser.RolUser = "ADM" Then Me.Enabled = False Else Me.Enabled = True
            'Requerido para la compatibilidad con el Diseñador de composiciones de clases Windows.Forms
            Container.Add(Me)

        End Sub

    Ahora, dentro del proyecto principal, en el formulario login he realizado la siguiente:

    - He Importado  la LibBas.

    - y he añadido el rol del usuario a la variable creada en la clase clsVarUsuario  del proyecto heredado.

     Dim clsvar As New LibBas.clsVarUsuario 

    clsvar.RolUser = tb.Rows(0).Item(2)

    Ahora en un formulario del proyecto principal he insertado el control que quiero que se escriba o  no dependiendo del rol del usuario pero cuando lo ejecuto se escribe de las dos maneras, siendo Adm o User, así que no se como solucionar este problema.

    Gracias de antemano.


    Saluditos, Charo

    miércoles, 7 de octubre de 2015 8:37
  • Has cometido un error bastante serio: estás usando dos instancias distintas de la clase clsVarUsuario.

    Cuando en el LibBas haces "Dim clsRolUser As New clsVarUsuario" se crea una instancia del clsVarUsuario que dentro tiene una variable llamada RolUser.

    Y cuando en el proyecto principal haces "Dim clsvar As New LibBas.clsVarUsuario", vuelves a crear una nueva instancia de clsVarUsuario que dentro tiene OTRA variable RolUser. Por lo tanto, lo que metes en este segundo RolUser no le llega a la librería que usa otro RolUser distinto.

    El remedio es declarar RolUser como Shared:

    Public Shared RolUser as String

    Y luego, en el LibBas la llamas como clsVarUsuario.RolUser (sin hacer un New del clsVrUsuario), y en el form principal la llamas como LibBas.clsVarUsuario.RolUser (también sin hacer un New).

    También podrias declarar la variable en un Module dentro del LibBas. Esto automáticamente la hace "Shared".

    miércoles, 7 de octubre de 2015 9:52
  • Hola Alberto.

    Mira lo que he hecho ahora según tu comentario o lo que he entendido de el.

    En el proyecto LibBas te envío una imagen con lo que he hecho.

    Ahora, el el proyecto principal en el formulario donde se loguean no se como llamar al módulo del proyecto LibBas para poder meter el dato en la variable RolUserLB. Dentro de este formulario he hecho referencia a la LibBas "Imports LibBas" pero cuando pongo LibBas. no me sale el nombre del módulo "FuncionesBasicas" ni el nombre de la variable RolUserLB .

    A ver si voy por buen camino o no.

    Gracias de antemano.


    Saluditos, Charo


    • Editado charoeci1 miércoles, 7 de octubre de 2015 11:23
    miércoles, 7 de octubre de 2015 11:23
  • En el module, te falta poner "Public":

    Public Module FuncioneBasicas
        Public RolUserLB As String
    End Module

    De lo contrario el módulo es "Friend" y solo se ve dentro de la librería, pero no en el programa principal. La variable también tiene que ser Public.

    Después de eso, desde el programa principal lo llamas así:

    LibBas.FuncioneBasicas.RolUserLB = ...

    • Marcado como respuesta charoeci1 jueves, 8 de octubre de 2015 9:53
    miércoles, 7 de octubre de 2015 12:26
  • Hola Alberto, te comento: 

    He hecho lo que me has dicho pero cuando pongo "LibBas." , en el programa principal, no me sale el nombre del módulo FuncioneBasicas que es donde tengo la variable RolUserLB. Simplemente me salen todos los controles que tengo creados.

    Gracias de antemano.


    Saluditos, Charo

    jueves, 8 de octubre de 2015 9:21
  • Tiene que funcionarte seguro, lo he probado con una Solución que hice solo para eso. Puse un proyecto principal con la Referencia a la librería de clases, en la librería añadí un Module con el código exacto que copié y pegué en la respuesta anterior, y desde el proyecto principal funcionó poniendo LibBas.FuncioneBasicas.RolUserLB. Si no te funciona, te debe faltar algo; comprueba que tienes puestos los dos Public (tanto en el módulo como en la variable). Comprueba también que la librería compila correctamente sin errores; si no está compilada puede fallarte el Intellisense en el proyecto que la referencia.
    jueves, 8 de octubre de 2015 9:34
  • Hola Alberto, no había puesto a Public el nombre del módulo solo el de la variable.

    Ya me funciona, gracias.


    Saluditos, Charo

    jueves, 8 de octubre de 2015 9:53