Jump to content

[vb.net 2005] click em botão com index


zephirus

Recommended Posts

Olá a todos.

Tenho uma dúvida que provavelmente até é simples.

Eu programava em VB6 e era possível fazer arrays de controls. No vb.net isso não é possível e já consegui dar a volta à questão MAS só em parte.

A minha dúvida agora é a seguinte:

Como exemplo, tenho 3 labels de nome label1, label2 e label3

Consigo por exemplo atribuir-lhes o valor text através de um if mas o que eu queria agora era, ao clicar num desses labels, que me aparecesse uma msgbox com o nome desse label. Ora, o que me aparece agora são 3 "Sub label#_Click(ByVal.....". Como é que faço para programar apenas uma vez e usar os indexs?

Se calhar fui confuso, peço desculpa. Qualquer ajuda é bem vinda.

Link to comment
Share on other sites

Private Sub Label1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) _
    Handles Label1.Click, Label2.Click, Label3.Click

        'o que eu queria agora era, ao clicar num desses labels, 
        'que me aparecesse uma msgbox com o nome desse label:
        Dim lbl As New Label
        lbl = sender

        MessageBox.Show("Voce clicou na " & lbl.Text)


    End Sub
Link to comment
Share on other sites

Epá, que maravilha! É isso mesmo. Hoje estive grande parte do dia a tentar perceber como ter os arrays. Muito obrigado!

Já agora e para perceber bem o código, vê se estou a interpretar tudo bem:

Pelo que percebi, depois do Handles tenho de colocar à mão todos os controls que quero que estejam associados ao click no label1, correcto?

E e sender é o nome do controle onde carreguei, certo? Por acaso, isto não percebi muito bem...

Link to comment
Share on other sites

Estava a tentar não chatear com mais uma questão mas depois de tanto procurar lá terá de ser.

Tendo eu os 3 labels, label1, label2 e label3, quero ao carregar num botão, que ele me mude a cor de fundo de 2 dos 3 botões, mas aleatoriamente.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Randomize()
        For i As Integer = 1 To 2 'no caso de 2 botoes
              Me.Controls("label" & Int(Rnd() * 50) + 1).BackColor = Color.LightGreen
        Next
End Sub

Esse código não funciona mas penso que não andarei longe. O que é que falta ai?

Link to comment
Share on other sites

Caro zephirus...

...para a tua pergunta "Pelo que percebi, depois do Handles tenho de colocar à mão todos os controls que quero que estejam associados ao click no label1, correcto?" - A resposta é: Neste exemplo, sim. Caso tenhas reparado o exemplo que te dei exibe o conteúdo da label (pois, usei a propriedade TEXT). Caso quisesses mesmo no nome da label deves alterar, no código que te indiquei, a propriedade TEXT para NAME.

...para a tua pergunta "E e sender é o nome do controle onde carreguei, certo? Por acaso, isto não percebi muito bem..." - A resposta é: http://visualbasic.about.com/od/learnvbnet/a/eventhandler.htm

...para a tua pergunta "..quero ao carregar num botão, que ele me mude a cor de fundo de 2 dos 3 botões, mas aleatoriamente." - Não fiquei seguro sobre se realmente queres mudar a cor de fundo dos botões ou, se te referes à alteração da cor das labels, de qualquer modo, julgo que se fizeres download deste exemplo (http://www.vb-helper.com/howto_net_random_colors.html) ele poderá ser uma mais valia para ti.

Link to comment
Share on other sites

Tens toda a razão. Então aqui fica:

        Randomize()
        For i As Integer = 1 To 50
            listadenumeros(i - 1).BackColor = defaultcolor
        Next
        listatemporaria.Items.Clear()
        For i As Integer = 1 To 50
            listatemporaria.Items.Add(i)
        Next
        Dim r As Integer
        For i As Integer = 1 To Int(RandomNumBox.Text)
            r = Int((listatemporaria.Items.Count - 1 + 1) * Rnd() + 1)
            listadenumeros(listatemporaria.Items(r - 1) - 1).BackColor = Color.LightGreen
            listatemporaria.Items.RemoveAt(r - 1)
        Next
Explicação:

listadenumeros é uma lista que criei, com 50 números:

Dim listadenumeros As List(Of Label) = New List(Of Label)
 

O primeiro passo foi pôr a cor default em todos os labels;

A listatemporaria é uma listbox normalíssima. Primeiro limpo-a e depois acrescento os 50 números de 1 a 50;

A última parte do código é simples:

1. Ciclo de 1 até ao número de labels que quero mudar a cor (RandomNumBox.Text)

2. Crio o index que quero aleatoriamente (r) e mudo o label correpondente a esse index

3. Retiro o número da lista para que no próximo ciclo ele apenas crie um index aleatório dos números que sobraram;

PS: já agora explico outra coisa que não me ocorreu ao início. Da primeira vez que escrevi o código, fiz um IF para saber se o label que calhou mudar de cor, já estava com a cor mudada ou não. Se estivesse, fazia random de novo. O problema é que se houver 100 labels e eu quiser mudar a cor de 99 aleatoriamente, o código enrola-se nos IF's. Isto não acontece se eu retirar o próximo label de uma lista onde só constam labels que possam ser mudados de cor.

Confuso? É da hora! Qualquer dúvida, digam.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.