none
dois itens de menu - retorno proc RRS feed

  • Pergunta

  • estou lendo uma procedure onde o retorno da mesma está sendo de duas linhas.

    então faço o seguinte:

    SqlDataReader dr = cn.ListaMenu();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        menu.Title = dr["nom_menu"].ToString();
                        mnu.Items.Add(menu);
                       
                    }
                }

    só que está incluindo somente o ultimo registro. pq? deveria incluir os dois registros que vem retorna da proc.

    detalhe: está passando pelo while duas vezes, conforme retorno. porém, está montando o menu somente com o último registro.

    quarta-feira, 16 de maio de 2012 18:12

Respostas

Todas as Respostas

  • Olha esse exemplo

    Menu masterTabMenu = NavigationMenu;
    
                //    MenuItem RH = new MenuItem();
                //    RH.Text = "Recursos Humanos";
    
                //    MenuItem Rh1 = new MenuItem();
                //    Rh1.Text = "Cadastro Funcionário";
                //    Rh1.NavigateUrl = "~/forms/RH/Cadastrofuncionario.aspx";
    
                //    MenuItem Rh2 = new MenuItem();
                //    Rh2.Text = "Demonstrativo descontos; 
                //    Rh2.NavigateUrl = "~/About.aspx";
    
                //    MenuItem Rh3 = new MenuItem();
                //    Rh3.Text = "Gerar Arquivo";
                //    Rh3.NavigateUrl = "~/About.aspx";
    
                //    MenuItem Rh4 = new MenuItem();
                //    Rh4.Text = "Relatorio Usuário";
                //    Rh4.NavigateUrl = "~/forms/RH/RelatorioUsuarios.aspx";
    
                //    MenuItem Rh5 = new MenuItem();
                //    Rh5.Text = "Recrutamento";
                //    Rh5.NavigateUrl = "~/About.aspx";
    
                //    MenuItem Rh6 = new MenuItem();
                //    Rh6.Text = "Registrar Descontos";
                //    Rh6.NavigateUrl = "~/About.aspx";
    
                //    RH.ChildItems.Add(Rh1);
                //    RH.ChildItems.Add(Rh2);
                //    RH.ChildItems.Add(Rh3);
                //    RH.ChildItems.Add(Rh4);
                //    RH.ChildItems.Add(Rh5);
                //    RH.ChildItems.Add(Rh6);
    
                //    masterTabMenu.Items.Add(RH);


    Junior

    quarta-feira, 16 de maio de 2012 18:23
  • e onde esse exemplo se encaixa no que eu preciso?
    quarta-feira, 16 de maio de 2012 18:27
  • só vc tornar o seu dinamico coisa que o que te mandei não está por isso ele só mostra o ultimo, coloca um i int e incrementa ele e coloca como indice do seu mnu.

    Junior

    quarta-feira, 16 de maio de 2012 18:50
  • Para de preguiça e começa a pensar amigo...

    Veja se esse exemplo funciona:

    SqlDataReader dr = cn.ListaMenu();
    if (dr.HasRows)
    {
    
    Menu mnu = NavigationMenu;
    
    	while (dr.Read()){
    	
    		MenuItem itm = new MenuItem();
    		itm.Text = dr["nom_menu"].ToString();
    		itm.NavigateUrl = "link";
    		
    		mnu.Items.Add(menu);
    		itm.Dispose();
    	
    	}
    }
    

    Não sei se vai funcionar, apenas peguei o seu código mais o código do Junior e juntei tudo.

    Boa sorte!


    Não esqueça de marcar como útil uma resposta que te ajude.
    "A diversão é a alma do negócio"

    quarta-feira, 16 de maio de 2012 19:19
  • SqlDataReader dr = cn.ListaMenu();
                if (dr.HasRows){
                    while (dr.Read()){
                        menu.Title = dr["nom_menu"].ToString();
                        mnu.Items.Add(menu);
                    }
                }
    Veja que neste seu exemplo você não cria (instancia) um novo menu para ser adicionado no mnu! Você simplesmente adiciona 2x o mesmo valor!

    É ajudando os outros que nos ajudamos...

    quinta-feira, 17 de maio de 2012 02:32
  • Pessoal, acontece que meu resultado vem do retorno de uma procedure. por tanto eu não tenho como instanciar, exceto a minha classe para chamar minha procedure. e essa retorna uma SqDataReader. Vejam:

    public SqlDataReader ListaMenu()
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "retorna_menu";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                return cmd.ExecuteReader();
            }

    e aqui o que eu faço para chamar e preencher:

    SqlDataReader dr = cn.ListaMenu();
                if (dr.HasRows){
                    while (dr.Read()){
                        menu.Title = dr["nom_menu"].ToString();
                        mnu.Items.Add(menu);
                    }
                }
    por isso que não entendi por que devo instanciar. Até porque não estou usando o obejto menu do dot.net. estou fazendo na "mão".
    quinta-feira, 17 de maio de 2012 13:19
  • Rafa o problema não é como vc vai instanciar e sim colocar um indice no seu item do menu, pq como está ele passa o primeiro grava o nome e vc adiciona, ai vem o segundo registro ele faz a mesma coisa por cima do anterior por isso no seu menu so aparece o último.

    veja isso

    http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/d07d0dc8-8493-4d95-af09-12376d9c17cd

    ou

    http://imasters.com.br/artigo/19627/sql-server/montando-menu-dinamico-com-banco-de-dados-parte-final

    ou

    http://devutils.blogspot.com.br/2010/07/menu-dinamico-buscando-itens-de-menu-da.html


    Junior

    quinta-feira, 17 de maio de 2012 13:51
  • fiz as adaptações  que preciso desses exemplos que você me passou e não funcionou. continua pegando o ultimo. fiz de outra forma também e nada, veja:

    SqlDataReader dr = cn.ListaMenu();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        ModuloItem itm = new ModuloItem();
                        itm.descricao = dr["nom_menu"].ToString();
                        //itm.NavigateUrl = "link";
                        menu.Title = itm.descricao;
                        mnu.Items.Add(menu);
                       
                    }
                }

    minha classe ModuloItem:

        public class ModuloItem
        {
            public Int32 idItem { get; set; }
            public string modulo { get; set; }
            public string descricao { get; set; }
            public string link { get; set; }
        }

    onde estou errando?

    quinta-feira, 17 de maio de 2012 14:27
  • fiz o seguinte: eu criei um array onde armazenos o resultado do retorno da proc. o que eu queria saber como posso atribuir os valores de uma array para um objeto e/ou variável. fiz o seguinte:

      string[] menu_;
                menu_ = new string[2];
                int i = 0;
                SqlDataReader dr = cn.ListaMenu();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        menu_[i] = dr["nom_menu"].ToString();
                        i = i + 1;
                    }
                }
                menu.Title = menu_[];
                mnu.Items.Add(menu);
    só q quando faço menu.Title = menu_[] me dá erro de conversão. tem como eu atribuir para uma variável ou objeto um array, sem precisar percorre-lo?
    quinta-feira, 17 de maio de 2012 14:38
  • fiz também conforme primeiro exemplo e não funciona:

    SqlDataReader dr = cn.ListaMenu();

    if (dr.HasRows)

    {

    while (dr.Read())

    {

    ModuloItem moduloItemTemp = new ModuloItem();

    moduloItemTemp.idItem = dr[

    "id_menu"].ToString();

    ModuloItemTemp.descricao = dr[

    "nom_menu"].ToString();

    objItemMenu.Add(moduloItemTemp);

    }

    }

     

    for (int i = 0; i < objItemMenu.Count; i++)

    {

    menu.Title = objItemMenu[i].descricao;

    mnu.Items.Add(menu);

    }

    quinta-feira, 17 de maio de 2012 14:57
  • consegui.

    value pra todos.

    • Marcado como Resposta Harley Araujo segunda-feira, 21 de maio de 2012 13:41
    quinta-feira, 17 de maio de 2012 15:37
  • SqlDataReader dr = cn.ListaMenu();
                if (dr.HasRows){
                    while (dr.Read()){
                        menu.Title = dr["nom_menu"].ToString();
                        mnu.Items.Add(menu);
                    }
                }

    Veja que neste seu exemplo você não cria (instancia) um novo menu para ser adicionado no mnu! Você simplesmente adiciona 2x o mesmo valor!


    É ajudando os outros que nos ajudamos...

    O que eu disse foi que você está informando o valor do title do menu baseado no registro atual do datareader, quando voce faz um loop dessa forma, somente 1 valor ficará visivel e somente 1 menu será exibido!

    Você encontrou o que estava acontecendo, poste aqui pra sabermos, assim quando outras pessoas tiverem semelhantes dúvidas encontraram resultados antes de criar um novo tópico no forum!
    Que bom que resolveu, boa sorte!

    É ajudando os outros que nos ajudamos...

    quinta-feira, 17 de maio de 2012 20:07
  • consegui.

    value pra todos.

    Você conseguiu através de alguma dica ou material informado neste tópico ou conseguiu de uma outra forma.?
    Poste aqui como conseguiu, assim quando outras pessoas tiverem a mesma dúvida saberão como fazer...

    É ajudando os outros que nos ajudamos...

    terça-feira, 7 de agosto de 2012 20:36