I already wrote the code before I noticed your last remark, so I will post it anyway 
You probably realized by now that setting the DisplayIndex will not affect the e.ColumnIndex in the CellValueChanged event.
Imports Gizmox.WebGUI.Forms
Public Class DGVForm
Private intSelColIndex As Integer
Private Sub DGVForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim DT As DataTable = New DataTable
DT.Columns.Add("Col1", GetType(String))
DT.Columns.Add("Col2", GetType(String))
For i As Integer = 0 To 10
DT.Rows.Add("Row " + i.ToString, i.ToString)
Next
DataGridView1.DataSource = DT
Dim checkCol As DataGridViewCheckBoxColumn = New DataGridViewCheckBoxColumn
checkCol.Name = "Selected"
DataGridView1.Columns.Add(checkCol)
checkCol.DisplayIndex = 0
intSelColIndex = checkCol.Index
End Sub
Private Sub DataGridView1_CellValueChanged(ByVal sender As System.Object, _
ByVal e As Gizmox.WebGUI.Forms.DataGridViewCellEventArgs) _
Handles DataGridView1.CellValueChanged
If e.ColumnIndex = intSelColIndex _
AndAlso e.RowIndex >= 0 _
AndAlso e.RowIndex < DataGridView1.Rows.Count - 1 Then
MessageBox.Show("Value of Select on Row=" + _
e.RowIndex.ToString() + " is now " + _
DataGridView1.Rows(e.RowIndex).Cells(intSelColIndex).Value.ToString())
End If
End Sub
End Class