2016-10-13 2 views
0

У меня есть ComboboxCell в первой ячейке Datagridview. Этот combobox имеет Datasource из моей БД. Когда я выбираю Item from It, все остальные ячейки в строке заполняются записью из моей БД. Теперь я хочу предотвратить дублирование записей строк на основе выбранного элемента Comboboxcell. После этого я хочу очистить Comboboxcell и сохранить код. Мне удалось сделать почти все, но проблема в том, что после отображения msgbox код перестает работать - поэтому, когда я снова выбираю ComboboxCell Item, ничего не происходит, даже в новой строке. Вот мой весь код:Datagridview - предотвратить дубликаты в comboboxcell

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

У вас есть входящий подзаголовок внутри цикла, который всегда будет выполняться так, чтобы после завершения выхода никогда не было запущено, когда вы измените это значение. Если вы хотите выйти из цикла и продолжить выполнение кода после обнаружения дубликата, это должно быть сделано в инструкции If. Этот код должен перестать работать после сравнения первой строки, даже если это не совпадение.

+0

спасибо за отзыв, но это была просто ошибка, сделанная здесь во время публикации. Мое выступление находится внутри оператора If. Я снова редактировал вопрос. И код тоже не работает. – LuckyLuke82

+0

Остальная часть ответа по-прежнему верна. После того, как вы попадете в оператор IF, он закончит суб, что означает, что любой код после цикла не будет запущен. – MaCron