Gotrek65
Gotrek65

Reputation: 39

Prevent SelectedIndexChanged when removing an entry in VB.NET

So when I click the delete button and have someone selected in the listbox this code runs

'check if a member is selected
    If LBmembers.SelectedItems.Count = 0 Then
        MessageBox.Show("You have not selected a member to delete.")
    ElseIf LBmembers.SelectedItems.Count > 0 Then
        Dim i As String = LBmembers.SelectedItem
        Dim dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
        Dim dbSource = "Data Source= C:\Users\Gotrek65\Documents\Visual Studio 2013\Projects\Ice Mining Calculator\Ice Mining Calculator\members.mdb "
        Dim SqlQuery As String =
            "DELETE FROM tblMembers WHERE Member = @ID;"
        'remove member(i) from database
        Using con = New OleDb.OleDbConnection(dbProvider & dbSource)
            Using cmd = New OleDb.OleDbCommand(SqlQuery, con)
                con.Open()
                cmd.Parameters.AddWithValue("@ID", OleDb.OleDbType.Variant).Value = i
                cmd.ExecuteNonQuery()
                con.Close()
            End Using
        End Using
        TBtimestart.Text = ""
        TBtimeend.Text = ""
        TBtimecycle.Text = ""
        RBpro.Checked = False
        RBret.Checked = False
        RBcov.Checked = False
        RBskiff.Checked = False
        RBmack.Checked = False
        RBhulk.Checked = False
        LBmembers.Items.Remove(LBmembers.SelectedItem)
    End If



Private Sub LBmembers_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LBmembers.SelectedIndexChanged
        'unfinished
        'if the selected idex changes then the individual stats should be retrieved from database and updated
        Dim i As String = LBmembers.SelectedItem
        Dim dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
        Dim dbSource = "Data Source= C:\Users\Gotrek65\Documents\Visual Studio 2013\Projects\Ice Mining Calculator\Ice Mining Calculator\members.mdb "
        Dim SqlQuery As String = "SELECT StartTime, EndTime, ShipCode, CycleTime FROM tblMembers WHERE Member = @ID;"
        Using con = New OleDb.OleDbConnection(dbProvider & dbSource)
            Using cmd = New OleDb.OleDbCommand(SqlQuery, con)
                con.Open()
                cmd.Parameters.AddWithValue("'@ID'", OleDb.OleDbType.VarWChar).Value = i
                'EXCEPTION when deleting data from tblMembers function "Parameter @ID has no default value." 
                Using reader = cmd.ExecuteReader()
                    If reader.Read() Then
                        'reader is  outputing "System.Data.OleDb.OleDbDataReader"
                        'but running the same query in access just yields 4 blank values...
                        TBtimestart.Text = reader.ToString(0)
                        TBtimeend.Text = reader.ToString(1)
                        Dim j = Convert.ToInt32(reader.ToString(2))
                        TBtimecycle.Text = reader.ToString(3)
                        If j = 1 Then
                            RBpro.Checked = True
                        ElseIf j = 2 Then
                            RBret.Checked = True
                        ElseIf j = 3 Then
                            RBcov.Checked = True
                        ElseIf j = 4 Then
                            RBskiff.Checked = True
                        ElseIf j = 5 Then
                            RBmack.Checked = True
                        ElseIf j = 6 Then
                            RBhulk.Checked = True
                        Else
                            RBpro.Checked = False
                            RBret.Checked = False
                            RBcov.Checked = False
                            RBskiff.Checked = False
                            RBmack.Checked = False
                            RBhulk.Checked = False
                            Exit Sub
                        End If
                    End If
                    con.Close()
                End Using
            End Using
        End Using
    End Sub

trying to prevent the SelectedIndexChanged from running when deleting a entry/member from the listbox. Curious if there is a possible way to do this because this is just started to get silly.

Additional information about the program.

The LBmembers(listbox) is used to update a database from said list. Also when you select an entry in the listbox(LBmembers) it should go to the database(access DB tblMembers(columns: Member(text), StartTime(text), EndTime(text), ShipCode(number), CycleTime(number), WorkPercent(number), Share(number)) should be pulled from said database and populated into their specific boxes.

Let me know if you need more code information.

Upvotes: 2

Views: 576

Answers (1)

A simple flag to ignore the change when desired:

Private ignoreChange As Boolean
Private Sub DeleteBtn_Click(...
    ignoreChange = True
    '... lots of code
    LBmembers.Items.Remove(LBmembers.SelectedItem)

    ignoreChange = False
End Sub

Private Sub LBmembers_SelectedIndexChanged(sender ...
   If ignoreChange Then Exit Sub
   ' lots more code

End Sub

Upvotes: 2

Related Questions