2016-10-13 13 views
0

私は、Datagridviewの最初のセルにComboboxCellを持っています。このコンボボックスには私のDBのDatasourceがあります。私がそれから項目を選択すると、行の他のすべてのセルが私のDBからのレコードによって取り込まれます。今度は、Comboboxcellの選択項目に基づいて行の重複を避けたいと考えています。その後、私はそのComboboxcellをクリアし、コードを実行し続けます。ほぼすべてを管理していましたが、問題はmsgboxが表示された後にコードが機能しなくなりました。つまり、再びComboboxCell Itemを選択すると、新しい行でも何も起こりません。ここに私のコード全体があります:Datagridview - コンボボックスの重複を防ぐ

Private Sub My_DGV_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles My_DGV.CellValueChanged 

     If My_DGV.Columns(e.ColumnIndex).Name = "Column1" Then 

      'Prevent duplicates 
      For i As Integer = 0 To My_DGV.RowCount - 2 
       For j As Integer = i + 1 To My_DGV.RowCount - 2 
        If My_DGV.Rows(i).Cells(0).Value = My_DGV.Rows(j).Cells(0).Value Then 
         MsgBox("You allready selected this item. Duplicates are not allowed.", MsgBoxStyle.Information, "Warning") 
         My_DGV.Rows(j).Cells(0).Value = " " 
         Dim cbx As ComboBox = DGV_APO.EditingControl 
         cbx.SelectedIndex = -1 
         Exit Sub 
        End If 

       Next 
      Next 

      OracleconnOpen() 

      Using cmd As New OracleCommand() 

       Dim SQL As String = "Select NAMES,SURNAMES,STATE FROM My_Table" 
       Dim Concat_SQL As String = " Where " 
       SQL = String.Concat(SQL, Concat_SQL, " ID_NUMBER = :id") 
       cmd.Parameters.Add(New OracleParameter("id", My_DGV.CurrentRow.Cells(0).Value)) 
       cmd.Connection = OracleconnOpen() 
       cmd.CommandText = SQL 
       cmd.CommandType = CommandType.Text 

       Dim dr As OracleDataReader = cmd.ExecuteReader() 
       Dim dt As New DataTable 
       dt.Load(dr) 

       My_DGV.CurrentRow.Cells(1).Value = dt.Rows(0)("NAMES").ToString() 
       My_DGV.CurrentRow.Cells(2).Value = dt.Rows(0)("SURNAMES").ToString() 
       My_DGV.CurrentRow.Cells(3).Value = dt.Rows(0)("STATE").ToString() 

      End Using 

      OracleconnClose() 

     End If 

End Sub 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

     'SELECT from my DB 
     Dim SQL As String = "SELECT ID_NUMBER from My_Table" 
     Dim dtb As New DataTable() 

     Try 

      OracleconnOpen() 'Open my connection 

      Using dad As New OracleDataAdapter(SQL, OracleconnOpen) 
       dad.Fill(dtb) 
      End Using 

      Column1.DisplayMember = "ID_NUMBER" 
      Column1.DataSource = dtb 

     Catch ex As Exception 
      MessageBox.Show(ex.Message) 

     Finally 

      OracleconnClose() 'Close my connection 
     End Try 

End Sub 

Private Sub My_DGV_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles My_DGV.CurrentCellDirtyStateChanged 

     If My_DGV.IsCurrentCellDirty Then My_DGV.CommitEdit(DataGridViewDataErrorContexts.Commit) 

End Sub 

Private Sub My_DGV_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles DGV_APO.DataError 

     e.ThrowException = False 
End Sub 

私は間違っていますか?どんな助けもありがたい。

答えて

0

この値を変更したときにexitサブが実行された後は、常に実行されるExit Sub呼び出しがループ内にあります。ループを終了して、重複が見つかった後にコードを実行し続ける場合は、Ifステートメント内で実行する必要があります。このコードは、一致しない場合でも最初の行が比較された後に動作を停止する必要があります。

+0

返信いただきありがとうございますが、それは投稿中にここで行われた間違いです。 My ExitサブはIf文内にあります。私は再び質問を編集しました。コードもこの方法では機能しません。 – LuckyLuke82

+0

残りの答えはまだ正しいです。 IF文の中に入ると、それはサブを終了します。つまり、ループの後のコードは実行されません。 – MaCron

関連する問題