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

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.

capturarofa.png


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)
             }
 
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:
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

Error 1 'System.Windows.Forms.nButton' is a 'type' but is used like a 'variable'
 
Última edição:
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
 
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

Colocando na propriedade tag "botaoDaCena" em todos os botões?
 
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.
 
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
 
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.

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?
 
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

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;
                    }
 
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?
 
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?

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.
 
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.

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;
 
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;


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

Cumprimentos
 
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?

Colocaste nos Event - Load?

Faz um Watch à variável numMaquinasSQL para teres a certeza que te está a dar o valor correto.
 
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...
 
Back
Topo