1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Manipulação de vários botões em simultâneo C#

Discussão em 'Programação' iniciada por Ragazzo04, 20 de Março de 2013. (Respostas: 26; Visualizações: 2008)

  1. Ragazzo04

    Ragazzo04 Power Member

    Boas noite pessoal


    Eu gostaria que ajudassem aqui num probleminha que estou a ter com o manuseamento de vários botões em simultâneo.

    [​IMG]


    Eu preciso que os butões passem do estado enable=false para true consoante o numero obtido por este select a BD


    Código:
    string cnn = "server = localhost ; user id = root ; pwd = 'root';database=gabineteinformatica";
             MySqlConnection myConnection = new MySqlConnection(cnn);
             MySqlCommand myCommand = myConnection.CreateCommand();
             myConnection.Open();
             myCommand.CommandText = "SELECT count(idmaquinas) FROM maquinas INNER JOIN local ON maquinas.Local_idLocal = local.idLocal WHERE Local_Nome = @L_N";
             myCommand.Parameters.AddWithValue("@L_N", labelLocalMaquina.Text);
             MySqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
            
    {
                 int numMaquinasSQL = Convert.ToInt32(myReader[0]);
    

    Todos os botões tem o nome nButtonX (1<X<30), eu queria que ao carregar o form e o select devolver X, os butões de 1 até X ficassem enable=true...


    A minha ideia seria do tipo:


    Código:
    for(int numMaquinas = 1; numMaquinas <= numMaquinasSQL ; numMaquinas++)
                 {
                     //(Sem ideia do que por aqui dentro)
                 }
    
     
  2. Wed

    Wed

    Ora dependendo do número em que começam os botões (Ex: nButton0 ou nButton1) o contador "numMaquinas" também começa em 0 ou 1 (Na avaliação da condição de paragem, se o contador for 0 é numMaquinas < numMaquinasSQL, se for 1 é numMaquinas <= numMaquinasSQL).

    Nota: O número de máquinas que a DB dá é sempre linear? Ou pode saltar da máquina 1 para a 15?

    Ps: Se não percebi bem ou não me fiz entender/errei peço que me corrijam. :)
     
    Última edição: 20 de Março de 2013
  3. Ragazzo04

    Ragazzo04 Power Member

    a numeração dos botões começa em nButton1 e vai até nButton30
    o numero que a BD devolve varia entre 0 e 30, consoante o local escolhido.

    vou testar a solução dada, obrigado pela ajuda

    Edit: Já testei e dá o seguinte erro no nButton

     
    Última edição: 20 de Março de 2013
  4. nunoemanuel

    nunoemanuel Power Member

    Porque não utilizas o atributo Tag? Atribuis a mesma Tag aos botões que queres que tenham o mesmo comportamento, e depois apenas precisas de os percorrer.

    Algo do género

    Código:
    foreach (Control c in Controls)
    	if (c.Tag == "botaoDaCena")
    		c.Visible = True:
    
    Cumprimentos
     
  5. Ragazzo04

    Ragazzo04 Power Member

    Colocando na propriedade tag "botaoDaCena" em todos os botões?
     
  6. Wed

    Wed

    Na prática acho que já consegui:

    Código:
            
            Button[] buttons = new Button[13];  
    
            private void Form1_Load(object sender, EventArgs e) {
                buttons[0] = button1;
                buttons[1] = button2;
                buttons[2] = button3;
                buttons[3] = button4;
                buttons[4] = button5;
                buttons[5] = button6;
                buttons[6] = button7;
                buttons[7] = button8;
                buttons[8] = button9;
                buttons[9] = button10;
                buttons[10] = button11;
                buttons[11] = button12;
                buttons[12] = button13;
            }
    
    
            private void button14_Click(object sender, EventArgs e) {
                for (int i = 0; i < buttons.Length; i++) 
                    buttons[i].Enabled = false;
            }
    
            [IMG]http://docs.xtremerpm.org/Tiago/Images/zwame-help.png[/IMG]
    
    Mas não faz sentido ter de criar os botões todos manualmente...Algo que ainda não consegui resolver mas que vou tentar logo ao fim da tarde,no entanto se conseguisses era porreiro.

    Vê o executável aqui

    Cumps.
     
  7. nunoemanuel

    nunoemanuel Power Member

    Talvez esteja a perceber mal o teu problema.

    Tu tens uma consulta a uma BD que te retorna um valor inteiro.

    Depois queres que os botões cujo nome é inferior ao valor retornado pela BD sejam escodidos/mostrados.

    É isto ?

    Se for este o problema, ao criares o botão, dinamicamente ou estaticamente, usas o atributo Tag para lhe dar um valor inteiro. Quando quiseres modificar o estado dos botões, apenas tens que os percorrer (usando p.ex. o método que coloquei acima) e comparar a Tag com o valor retornado pela BD.

    Cumprimentos
     
  8. Ragazzo04

    Ragazzo04 Power Member

    Eu tentei assim, e não faz nada =\

    Código:
    Button[] buttons = new Button[29];
    
    
                buttons[0] = nButton1;
                buttons[1] = nButton2;
                buttons[2] = nButton3;
                buttons[3] = nButton4;
                buttons[4] = nButton5;
                buttons[5] = nButton6;
                buttons[6] = nButton7;
                buttons[7] = nButton8;
                buttons[8] = nButton9;
                buttons[9] = nButton10;
                buttons[10] = nButton11;
                buttons[11] = nButton12;
                buttons[12] = nButton13;
                buttons[13] = nButton14;
                buttons[14] = nButton15;
                buttons[15] = nButton16;
                buttons[16] = nButton17;
                buttons[17] = nButton18;
                buttons[18] = nButton19;
                buttons[19] = nButton20;
                buttons[20] = nButton21;
                buttons[21] = nButton22;
                buttons[22] = nButton23;
                buttons[23] = nButton24;
                buttons[24] = nButton25;
                buttons[25] = nButton26;
                buttons[26] = nButton27;
                buttons[27] = nButton28;
                buttons[28] = nButton29;
                buttons[29] = nButton30;
    
    
                string cnn = "server = localhost ; user id = root ; pwd = 'root';database=gabineteinformatica";
                MySqlConnection myConnection = new MySqlConnection(cnn);
                MySqlCommand myCommand = myConnection.CreateCommand();
                myConnection.Open();
                myCommand.CommandText = "SELECT count(idmaquinas) FROM maquinas INNER JOIN local ON maquinas.Local_idLocal = local.idLocal WHERE Local_Nome = @L_N";
                myCommand.Parameters.AddWithValue("@L_N", labelLocalMaquina.Text);
                MySqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
                
                    int numMaquinasSQL = Convert.ToInt32(myReader[0]);
    
    
                    for (int i = 0; i < numMaquinasSQL; i++)
                    {
                        buttons[i].Enabled = false;
                    }
    
    Vês algum problema?
     
  9. Ragazzo04

    Ragazzo04 Power Member

    sim o select devolve-me o numero de butões que eu quero que fiquei enabled.

    eu tentei assim mas não me deixa sequer fazer a comparação com o int do select...

    Código:
    string cnn = "server = localhost ; user id = root ; pwd = 'root';database=gabineteinformatica";
                MySqlConnection myConnection = new MySqlConnection(cnn);
                MySqlCommand myCommand = myConnection.CreateCommand();
                myConnection.Open();
                myCommand.CommandText = "SELECT count(idmaquinas) FROM maquinas INNER JOIN local ON maquinas.Local_idLocal = local.idLocal WHERE Local_Nome = @L_N";
                myCommand.Parameters.AddWithValue("@L_N", labelLocalMaquina.Text);
                MySqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
                
                    int numMaquinasSQL = Convert.ToInt32(myReader[0]);
    
    
                    
                    foreach (Control c in Controls)
                        if (c.Tag = numMaquinasSQL)
                        {
                            c.Enabled = true;
                        }
    
    
     
  10. mcog_blaster

    mcog_blaster Power Member

    c.Tag devolve object /= int

    e essa comparação apenas te vai colocar um botao a true, sempre.
     
  11. Ragazzo04

    Ragazzo04 Power Member

    mas então não estou a conseguir perceber como trabalhar com as tags
    cada botão deve ter uma tag distinta certo? tipo button1 -> 1 ; button -> 2 e por aí a fora?
     
  12. nunoemanuel

    nunoemanuel Power Member

    O código que colocaste atrás tem vários erros.

    No if estás a fazer uma atribuição ao invés de uma comparação.

    Depois, não podes comparar inteiros com strings.

    Os botões são criados dinamicamente? Ou criaste-os em modo desenho ?

    Se os criaste dinamicamente, quando os crias tens que atribuir o respectivo Tag, senão tens que ir ao editor, e colocar lá o tag.
     
  13. Ragazzo04

    Ragazzo04 Power Member

    os botões foram criados em modo desenho, e já coloquei tag's.

    para ver se entendi, com este pedaço de código que deste como exemplo ele apenas iria colocar enable o botão que tivesse a tag "botaoDaCena" certo?


    Código:
    foreach (Control c in Controls)
         if (c.Tag == "botaoDaCena") 
                 c.Visible = True;
     
  14. nunoemanuel

    nunoemanuel Power Member


    Neste caso ia colocar a Visible todos os controls do teu form com a Tag "botaoDaCena".

    Cumprimentos
     
  15. Wed

    Wed

    Colocaste nos Event - Load?

    Faz um Watch à variável numMaquinasSQL para teres a certeza que te está a dar o valor correto.
     
  16. Ragazzo04

    Ragazzo04 Power Member

    Antes demais queria agradecer a todos a ajuda que me deram para me desenvencilhar deste problema...

    Infelizmente o tempo esta a escassear para a entrega deste projecto e tive que optar por uma solução não tão prática mas que se revelou eficaz neste caso.

    Optei por uma solução que me fez prever todas as situações possíveis e que se traduziu em quase 1000 linhas de código repetitivo...

    Código:
     
    public void contaMaquinas()
            {
                string cnn = "server = localhost ; user id = root ; pwd = 'root';database=gabineteinformatica";
                MySqlConnection myConnection = new MySqlConnection(cnn);
                MySqlCommand myCommand = myConnection.CreateCommand();
                myConnection.Open();
                myCommand.CommandText = "SELECT count(idmaquinas) FROM maquinas INNER JOIN local ON maquinas.Local_idLocal = local.idLocal WHERE Local_Nome = @L_N";
                myCommand.Parameters.AddWithValue("@L_N", labelLocalMaquina.Text);
                MySqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
                while (myReader.Read())
                {
                    int numMaquinasSQL = Convert.ToInt32(myReader[0]);
    
    
                    if (numMaquinasSQL == 30)
                    {
                        nButton1.Enabled = true;
                        nButton2.Enabled = true;
                        nButton3.Enabled = true;
                        nButton4.Enabled = true;
                        nButton5.Enabled = true;
                        nButton6.Enabled = true;
                        nButton7.Enabled = true;
                        nButton8.Enabled = true;
                        nButton9.Enabled = true;
                        nButton10.Enabled = true;
                        nButton11.Enabled = true;
                        nButton12.Enabled = true;
                        nButton13.Enabled = true;
                        nButton14.Enabled = true;
                        nButton15.Enabled = true;
                        nButton16.Enabled = true;
                        nButton17.Enabled = true;
                        nButton18.Enabled = true;
                        nButton19.Enabled = true;
                        nButton20.Enabled = true;
                        nButton21.Enabled = true;
                        nButton22.Enabled = true;
                        nButton23.Enabled = true;
                        nButton24.Enabled = true;
                        nButton25.Enabled = true;
                        nButton26.Enabled = true;
                        nButton27.Enabled = true;
                        nButton28.Enabled = true;
                        nButton29.Enabled = true;
                        nButton30.Enabled = true;
                    }
    
    (...)
    
    if (numMaquinasSQL == 1)
                    {
                        nButton1.Enabled = true;
                        nButton2.Enabled = false;
                        nButton3.Enabled = false;
                        nButton4.Enabled = false;
                        nButton5.Enabled = false;
                        nButton6.Enabled = false;
                        nButton7.Enabled = false;
                        nButton8.Enabled = false;
                        nButton9.Enabled = false;
                        nButton10.Enabled = false;
                        nButton11.Enabled = false;
                        nButton12.Enabled = false;
                        nButton13.Enabled = false;
                        nButton14.Enabled = false;
                        nButton15.Enabled = false;
                        nButton16.Enabled = false;
                        nButton17.Enabled = false;
                        nButton18.Enabled = false;
                        nButton19.Enabled = false;
                        nButton20.Enabled = false;
                        nButton21.Enabled = false;
                        nButton22.Enabled = false;
                        nButton23.Enabled = false;
                        nButton24.Enabled = false;
                        nButton25.Enabled = false;
                        nButton26.Enabled = false;
                        nButton27.Enabled = false;
                        nButton28.Enabled = false;
                        nButton29.Enabled = false;
                        nButton30.Enabled = false;
                    }
    			
    
    
    
    
                }
                myReader.Close();
                myConnection.Close();
               
            }
    
    
    

    Novamente Obrigado a todos...
     
  17. nunoemanuel

    nunoemanuel Power Member

    Boas,

    Não sei se isso é para avaliação, mas caso seja eu não deixava as coisas assim.

    Cumprimentos
     
  18. Santux

    Santux Power Member

    Sim, depende um bocado para o que é, mas é uma solução um bocado daily wtf
     
  19. mcog_blaster

    mcog_blaster Power Member

    Não compreendo o que possa estar a dificultar o resolução desse problema..
     

Partilhar esta Página