none
Recuperando Referência de Objetos Através de String. RRS feed

  • Pergunta

  • Olá Pessoal,

    Tenho o seguinte problema:

    Estou desenvolvendo uma rotina para controle de acesso de usuários à determinados menus do sistema.

    O meu algoritmo lê a cordenada do menu apartir de um select do banco de dados. Ex.: Cadastro de Usuários -> 1.01.05, sabendo disso ele faz um array de strings e tranforma em um acesso a um componente, ficando assim: "mainMenu.MenuItems[1].MenuItems[1].MenuItems[5]";

    Com isso quero pegar a refêrencia desse objeto e torná-lo invisivel.

    Alguém pode me ajudar?

    sexta-feira, 17 de agosto de 2012 12:00

Respostas

  • Sem problemas Heitor.

        Uma forma que vc pode fazer é utilizar o Name do menu.... lembrando q no Windows Forms todos os componentes geram um field privado (vejo no arquivo .Designer.cs do seu form) voce pode acessar esses controls usando Reflection:

    using System.Linq;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1 {
        public partial class Form1 : Form {
            public Form1() {
                InitializeComponent();
    
                var control = FindControlByName("eeeeeToolStripMenuItem");
                if (control is ToolStripMenuItem) {
                    var menu = (control as ToolStripMenuItem);
                    MessageBox.Show(menu.Text);
                }
            }
    
            private object FindControlByName(string controlName) {
                var fields = from field in this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                             where field.Name == controlName
                             select field.GetValue(this);
    
                return fields.FirstOrDefault();
            }
        }
    }
    

    • Marcado como Resposta Heitor R. Barros segunda-feira, 20 de agosto de 2012 13:16
    sexta-feira, 17 de agosto de 2012 19:30
    Moderador

Todas as Respostas

  • Não entendi qual a sua dúvida, você quer saber como fazer o select no banco, como acessar o componente, como pegar a referencia ou como deixá-lo invisível?
    sexta-feira, 17 de agosto de 2012 12:32
  • Quero pegar a referência dele a partir de da string com o seu nome.
    sexta-feira, 17 de agosto de 2012 12:58
  • Se eu entendi bem, você quer tranformar sua string em linha de código. É isso mesmo né?

    Se não me engano, existe sim uma solução mas é um "puto" de um algoritmo. Já pesquisei uma vez acerca disso e acabei fazendo de outra forma.

    sexta-feira, 17 de agosto de 2012 13:00
  • O q você pode fazer, é guardar uma referência do elemento como o ID e assim você conseguirá acha-lo. Guardar linha de código será complicadissimo...
    sexta-feira, 17 de agosto de 2012 13:02
  • Vamos contextualizar melhor o problema:

    1. No seu banco você tem salvo o que exatamente? Dê um exemplo.

    2.Você já tem algum código pronta para formar essa string que você disse? Se tiver mostre-nos.

    sexta-feira, 17 de agosto de 2012 13:56
  • 1: Tenho o nome do mnuItem e a posição dele relativa ao MainMenu.

    2:Codigo

             //Alimenta D
                IDictionary<String,IUserFunction> dUserFunctions = new Dictionary<String,IUserFunction>();
                foreach (IUserFunction item in listItens)
                {
                    dUserFunctions.Add(item.Function.Form.ToString(), item);
                }
                //Percorre
                foreach (IFunction item in allFunctions)
                {
                    if (!dUserFunctions.ContainsKey(item.Form))
                    {
                        String[] treeMnu = item.FunctionRank.Split('.');
                        String toUnvisible = "mnuMDI";
                        for (int i = 0; i < treeMnu.Length; i++)
                        {
                            Int32 index = Convert.ToInt32(treeMnu[i]);
                            toUnvisible += ".MenuItems["+index+"]";
                        }                               
                    }
                    
                }


    sexta-feira, 17 de agosto de 2012 14:11
  • Agora, está mais claro, mas como nunca utilizei utilizei IDictionary não tenho capacidade sanar sua duvida. Desculpe.
    sexta-feira, 17 de agosto de 2012 14:19
  • É pode ser. Sabe como fazer?


    Alguem sabe como usar esse método: FindMenuItem(int type, IntPtr value) ?
    sexta-feira, 17 de agosto de 2012 15:45
  • Como faço para transformar uma string em código?
    sexta-feira, 17 de agosto de 2012 15:49
  • Ola Heitor,

        Existem varias formas de localizar um controle pela string do seu ID, porem isso varia com a plataforma que vc esta usando: ASP.NET MVC, ASP.NET WebForms, ASP.NET MVP, Windows Forms, Silverlight (Usando MVVM ou não), WPF, etc...

        Poderia ser mais especifico no seu hambiente de desenvolvimento ... ?

    Grato

    sexta-feira, 17 de agosto de 2012 16:48
    Moderador
  • Perdão Rui,

    Estou usando WF(Windows Forms).


    sexta-feira, 17 de agosto de 2012 16:50
  • Sem problemas Heitor.

        Uma forma que vc pode fazer é utilizar o Name do menu.... lembrando q no Windows Forms todos os componentes geram um field privado (vejo no arquivo .Designer.cs do seu form) voce pode acessar esses controls usando Reflection:

    using System.Linq;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1 {
        public partial class Form1 : Form {
            public Form1() {
                InitializeComponent();
    
                var control = FindControlByName("eeeeeToolStripMenuItem");
                if (control is ToolStripMenuItem) {
                    var menu = (control as ToolStripMenuItem);
                    MessageBox.Show(menu.Text);
                }
            }
    
            private object FindControlByName(string controlName) {
                var fields = from field in this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                             where field.Name == controlName
                             select field.GetValue(this);
    
                return fields.FirstOrDefault();
            }
        }
    }
    

    • Marcado como Resposta Heitor R. Barros segunda-feira, 20 de agosto de 2012 13:16
    sexta-feira, 17 de agosto de 2012 19:30
    Moderador