Here is a way to fake the DataGridView into doing what I think you want to do. Start with a new WinForm project and add a dgv to the form. Then add this to the Form1.vb code.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' make some data to show
Dim dt As New DataTable()
With dt
.Columns.Add("Header", GetType(String))
.Columns.Add("C1", GetType(Int32))
.Columns.Add("C2", GetType(Int32))
.Rows.Add(New Object() {"A", 2, 3})
.Rows.Add(New Object() {"B", 4, 5})
.Rows.Add(New Object() {"C", 6, 7})
End With
' Setup the DGV to use the "Header" column as the row header
With DataGridView1
.DataSource = dt
.AllowUserToAddRows = False
.RowHeadersVisible = True
.Columns("Header").Visible = False ' hide the header column
.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders
End With
End Sub
Private Sub DataGridView1_RowPrePaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPrePaintEventArgs) Handles DataGridView1.RowPrePaint
' sorting clears the headertext, so set before each row paint
DataGridView1.Rows(e.RowIndex).HeaderCell.Value = DataGridView1.Rows(e.RowIndex).Cells("Header").Value
End Sub
**** Edit:
After thinking it over a bit, this may be a better approach depending on what you are trying to accomplish.
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' make some data to show
Dim dt As New DataTable()
With dt
.Columns.Add("Header", GetType(String))
.Columns.Add("C1", GetType(Int32))
.Columns.Add("C2", GetType(Int32))
.Columns.Add("C3", GetType(Int32))
.Rows.Add(New Object() {"A", 2, 3, 7})
.Rows.Add(New Object() {"B", 4, 5, 8})
.Rows.Add(New Object() {"C", 6, 7, 2})
End With
DataGridView1.DataSource = dt.DefaultView
Dim NumColToFreeze As Int32 = 2
With DataGridView1
.RowHeadersVisible = True
For i As Int32 = 0 To NumColToFreeze - 1
.Columns(i).Frozen = True ' prevents column from scrolling out of view
.Columns(i).DefaultCellStyle = .RowHeadersDefaultCellStyle ' make it look like a header
.Columns(i).ReadOnly = True
Next
End With
End Sub
End Class