Thank you for your reply.
The TextBoxChanged event is raised both when the TextBox receives its value from the underlying cell, and when the user changes the text in the TextBox.
I understand the mechanics and understand that the event is raised when editing is started because the TextBox receives the value from the cell, and is indeed changed. But that value is the current value from the cell, which has not been changed. It is only truly "changed" when it is edited in the TextBox. I guess I expected that the event would be suppressed (or be suppressible) when the TextBox receives its value from the underlying cell. There may well be situations in which being able to respond to that initial event firing is important. I'm not sure. At any rate, the situation is that I'm just trying to implement row-based editing in an iGrid, in which the user is prevented from changing rows when the current row is not valid (is dirty).
I have today been experimenting with ways to suppress (actually, ignore) the initial event. The following seems to serve the purpose, so far. If you could comment on this idea I would appreciate it.
iGrid.CellValue(Of T) is an extension method.
Private Sub UserAdminGrid_TextBoxTextChanged(sender As Object, e As iGTextBoxTextChangedEventArgs) Handles UserAdminGrid.TextBoxTextChanged
Dim text = UserAdminGrid.TextBox.Text
Dim value = UserAdminGrid.CellValue(Of String)(e.RowIndex, e.ColIndex)
If Not text.Equals(value) Then
rowDirty = True