Here's the answer I've finally found, if anybody cares:
Although it seems intuitive, you CANNOT check the new value by referencing the grid. It's necessary instead to reference the underlying table in the dataset (even though the table has NOT actually been updated - it makes no sense to me, but then very little MS has done with .NET makes sense to me) using the ColumnChanging event. Here's some genericized code that works:
Private Sub ColumnChangingValidation(ByVal sender As Object, _
ByVal e As System.Data.DataColumnChangeEventArgs)
' first check the column name because this subroutine
' is not column specific (that would be too easy)
If (e.Column.ColumnName.Equals("Server")) Then
' Validate e.ProposedValue, which is
' what the user entered
If YourValidationRoutine(e.ProposedValue) = False Then
' set the row hover message on the table that
' makes it magically appear on the grid
e.Row.RowError = "The Server column contains an error"
' set the column hover message on the table that
' makes it magically appear on the grid
e.Row.SetColumnError(e.Column, "Value cannot be " & _ CType(e.ProposedValue, String) & " - Expected blah, blah, blah...")
End If
End If
End Sub
Next, the ColumnChanging event has to be related to the table in the dataset:
AddHandler DataSetName.Tables("TableName").ColumnChanging, AddressOf ColumnChangingValidation
Then when the user enters a value into the indicated column and tabs out or clicks on another cell or another control, the event fires and the error indicator appears on the grid row and column. I haven't figured out hwo to cancel the update to the field in the table yet, but it should only take me another week or so to figure out that minor detail.
If you want to know how to do this in C#, you can find MicroSoft's ever-so-helpful example code at:
http://msdn.microsoft.com/library/de...ridcontrol.asp