How to make one-click buttons?

I have several buttons in which all of them have come codes. I want the user to only can make click the buttons once. How can I do it without having a long disable buttons code?

Dim oneClick As Integer
Private Sub btnPro_Click(sender As Object, e As EventArgs) Handles btnPro.Click
    oneClick += 1
    If oneClick = 1 Then
        Dim ucP As New ucPro
        fillMenu(ucP)
    End If
End Sub

This is the code I come up with.

EDIT : The point is that I want to click a button once, but the others can be clicked. For example, I have a form with 6 buttons, every button has some codes. If I click Button1, it'll do such code only once, therefore if I click it again, it will not do that code, because it already did it. Then, if I click Button2, it'll do the code once. And what about if I click Button1 again? well, it'll be able to do that code because I clicked to another button.

Sorry for the way I explain myself. I hope you get it.

Upvotes: 0

Views: 421

Answers (2)

jmcilhinney
jmcilhinney

Reputation: 54417

Based on your rather poor explanation, it sounds like what you actually mean is that you only want each button to act once in a row, i.e. once you click a button you need to click another button before the first button does anything again. In that case, the proper way to handle this is to not use Button controls.

Instead of using Button controls and handling their Click events, you should be using RadioButton controls and handling their CheckedChanged events. You can set the Appearance property to Button and they will look just like regular Buttons. When checked, they will appear depressed and that will indicate to the user that they can't be used again.

Here's an example of a form using such controls:

RadioButton buttons

And here's what the appropriate code might look like:

Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
    If RadioButton1.Checked Then
        'Do something.
    End If
End Sub

Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
    If RadioButton1.Checked Then
        'Do something else.
    End If
End Sub

Private Sub RadioButton3_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton3.CheckedChanged
    If RadioButton1.Checked Then
        'Do yet something else.
    End If
End Sub

Here's what the form might look like when a RadioButton has been checked:

Checked RadioButton

As you can see, it's nice and clear to the user which one they cannot use.

EDIT:

If you are really determined to use Button controls then you absolutely should be disabling them as that is the standard way that feedback has been provided to the user for decades. It's very simple to disable a Button if and only if it is the last one clicked. Here's an example:

Private Sub AllButtons_Click(sender As Object, e As EventArgs) Handles Button3.Click,
                                                                       Button2.Click,
                                                                       Button1.Click
    For Each btn In Controls.OfType(Of Button)
        btn.Enabled = (btn IsNot sender)
    Next
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Do something.
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'Do something else.
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    'Do yet something else.
End Sub

Note that you can handle multiple events with a single method and multiple methods can handle a single event, both of which are demonstrated here. All four of those methods were generated automatically by the designer, so I just had to add the body code. Note that the first method assumes that all Button controls on the form will be treated this way. If that's not the case then would need a slight adjustment but nothing too major.

Upvotes: 1

Fabio
Fabio

Reputation: 32445

Keep track of last clicked button and you can use one handler for all involved buttons

Private _lastClickedButton As Button = Nothing

Private Sub Button_Click(sender As Object, e As EventArgs)
    Dim button = DirectCast(sender, Button)

    If button Is _lastClickedButton Then Exit Sub

    _lastClickedButton = button

    ' Now based on button instance you can execute corresponding logic/method
End Sub

Upvotes: 2

Related Questions