Your code would work perfectly if you manually populated the DataGridView.
But because the grid is databound, any changes to the grid layout, ie a new column, will result in an error because that column is not part of the original database table.
The error occurs because the change in the datagrid will trigger an event in the grid to perform a change in the underlying datatable.
Now, if you add a boolean column to the datatable before binding it to the datagrid, then the checkbox column will be shown, and any changes to it will not result in error.
Try
cmd.CommandText = "SELECT *" & _
"FROM oracle database
Dim da As New OracleDataAdapter(cmd)
Dim DMdt As New DataTable
da.Fill(DMdt)
If DMdt.Rows.Count > 0 Then
DMDt.Columns.Add(New DataColumn("Part", GetType(Boolean)))
Me.DataGridView1.DataSource = DMdt
'filter the datatable
da.Dispose()