The way the DataGridView works is that the contents of each cell is simply drawn on until you actually start editing a cell. At that point a control of the appropriate type is created if one doesn't already exists and it is embedded in the cell. At that point, you have to handle events of that control rather than of the grid. To do that, you handle the EditingControlShowing event of the grid, get a reference to the editing control and use AddHandler to attach its event(s) to the appropriate handler(s).
One important point is that, if that's all you do, you'll end up handling the same event multiple times because you'll keep adding the same handler over and over. For that reason, you should precede AddHandler with RemoveHandler. That will have no effect if there's no existing handler, otherwise it will remove the existing handler before adding the new one. E.g.
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
'Make sure we are in the first column.
If Me.DataGridView1.CurrentCellAddress.X = 0 Then
'Remove the existing handler if there is one.
RemoveHandler .TextChanged, AddressOf TextBox_TextChanged
'Add a new handler.
AddHandler .TextChanged, AddressOf TextBox_TextChanged
Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)