Not too proud of this, but was able to work around teh problem in your sample by adding a timer to your usercontrol, and then triggerring it from the GridLeave event. The idea was to postpone trying to set teh focus back to teh grid for a few milliseconds while teh framework did what it wanted to do with teh focus. Below is teh code.
Looking at the callstack, the framework goes up through all the nested controls trying to trigger validations, and it seems to do this even if an earlier validation fails. This is causing the multiple error displays.
Postponing setting the focus back to the grid seems to let the framework clear itself, and seems to avoid this problem in your sample.
private void gridControl1_Leave(object sender, System.EventArgs e)
{
if(this.gridControl1.CurrentCell.IsModified && !IsValidValue())
{
//this.gridControl1.Focus();
this.timer1.Interval = 20;
this.timer1.Enabled = true;
}
}
private void timer1_Tick(object sender, System.EventArgs e)
{
this.timer1.Enabled = false;
this.gridControl1.Focus();
}