If it's ok for you to remove the rows not only from being displayed but also from the original DataTable, then do this:
DataTable dataTable = ((DataView)CheckedListBox1.DataSource).Table;
IEnumerable<DataRow> selectedRows = CheckedListBox1.CheckedItems.Cast<DataRowView>().Select(x => x.Row);
HashSet<DataRow> selectedRowsHashset = new HashSet<DataRow>(selectedRows);
for (int rowIndex = dataTable.Rows.Count - 1; rowIndex >= 0; rowIndex--)
{
if (!selectedRowsHashset.Contains(dataTable.Rows[rowIndex]))
{
dataTable.Rows.RemoveAt(rowIndex);
}
}
If you only want the rows removed from being displayed, then do this:
DataTable sourceDataTable = ((DataView)CheckedListBox1.DataSource).Table;
DataTable newDataTable = sourceDataTable.Clone();
foreach (DataRow sourceRow in CheckedListBox1.CheckedItems.Cast<DataRowView>().Select(x => x.Row))
{
DataRow newRow = newDataTable.NewRow();
for (int columnIndex = 0; columnIndex < newDataTable.Columns.Count; columnIndex++)
{
newRow[columnIndex] = sourceRow[columnIndex];
}
newDataTable.Rows.Add(newRow);
}
CheckedListBox1.DataSource = newDataTable;