Fixed by using DataTable rather then DataGridView. I was populating the DGV from DT.
If ComboBoxExport.Text = "Save As CSV" Then
Dim sfd As SaveFileDialog = New SaveFileDialog()
sfd.Title = "Save File Dialog"
sfd.InitialDirectory = "C:\"
sfd.Filter = "Text file (*.csv)|*.csv|Text file (*.txt)|*.txt|All files (*.*)|*.*"
sfd.FilterIndex = 1
'sfd.RestoreDirectory = True
Try
Dim headers = (From header As DataGridViewColumn In DataGridView1.Columns.Cast(Of DataGridViewColumn)()
Select header.HeaderText).ToArray
Dim dt = DirectCast(DataGridView1.DataSource, DataTable)
Using sw As New IO.StreamWriter(sfd.FileName)
sw.WriteLine(String.Join(",", headers))
For ii = 0 To dt.Rows.Count - 1
For yy = 0 To dt.Columns.Count - 1
sw.Write(If(dt.Rows(ii).ItemArray(yy)?.ToString(), ""))
If yy < dt.Columns.Count - 1 Then
sw.Write(",")
Else
sw.WriteLine()
End If
Next
Next
End Using
Catch ex As Exception
MsgBox("Save As CSV Error: " & ex.Message)
End Try
End If