To reproduce use this code:
public partial class Form1 : Form
{
RadGridView radGridView1 = new RadGridView();
public Form1()
{
InitializeComponent();
this.Controls.Add(this.radGridView1);
this.radGridView1.Dock = DockStyle.Fill;
this.radGridView1.AutoGenerateColumns = false;
this.radGridView1.TableElement.RowHeight = 30;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.AddNewRowPosition = SystemRowPosition.Bottom;
this.radGridView1.EnterKeyMode = RadGridViewEnterKeyMode.EnterMovesToNextCell;
this.radGridView1.NewRowEnterKeyMode = RadGridViewNewRowEnterKeyMode.EnterMovesToNextCell;
this.radGridView1.BeginEditMode = Telerik.WinControls.RadGridViewBeginEditMode.BeginEditOnKeystrokeOrF2;
this.radGridView1.EnableGrouping = false;
this.radGridView1.EnableAlternatingRowColor = true;
this.radGridView1.AllowAddNewRow = true;
this.radGridView1.AllowEditRow = true;
this.radGridView1.AllowDeleteRow = true;
this.radGridView1.EnableFiltering = true;
this.radGridView1.EnableSorting = true;
ArrayList arrayList = new ArrayList();
arrayList.Add(new Person() { Name = "Jack", Family = "J..." });
arrayList.Add(new Person() { Name = "Bob", Family = "B..." });
arrayList.Add(new Person() { Name = "Dani", Family = "D..." });
radGridView1.Columns.Add("ColName", "Name", "Name");
radGridView1.Columns.Add("ColFamily", "Family", "Family");
radGridView1.DataSource = arrayList;
this.radGridView1.CellValidating +=radGridView1_CellValidating;
}
private void radGridView1_CellValidating(object sender, CellValidatingEventArgs e)
{
GridViewDataColumn column = e.Column as GridViewDataColumn;
if ((e.Row is GridViewDataRowInfo || e.Row is GridViewNewRowInfo) && column != null
&& (column.Name == "ColName"))
{
if (e.Value == null || ((string)e.Value).Trim() == "") if (string.IsNullOrEmpty
((string)e.Value) || ((string)e.Value).Trim() == string.Empty || string.IsNullOrWhiteSpace
((string)e.Value))
{
if (e.ActiveEditor != null)
{
MessageBox.Show("Please enter your name");
e.Cancel = true;
}
}
}
}
}
public class Person
{
private string name;
private string family;
public string Name
{
get { return name; }
set { name = value; }
}
public string Family
{
get { return family; }
set { family = value; }
}
}
Try to add a new row by clicking the cell of the first column and leaving it empty. You will see the messagebox twice.
Workaround:
public class MyGridRowBehavior : GridNewRowBehavior
{
protected override bool ProcessEnterKey(KeyEventArgs keys)
{
GridViewNewRowInfo newRowInfo = (GridViewNewRowInfo)this.GridViewElement.CurrentRow;
if (this.GridViewElement.NewRowEnterKeyMode == RadGridViewNewRowEnterKeyMode.EnterMovesToNextCell)
{
bool editorClosed = !this.IsInEditMode;
if (this.IsInEditMode)
{
if (this.IsOnLastCell())
{
if (newRowInfo != null)
{
newRowInfo.GetType().GetMethod("DeferUserAddedRow", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(newRowInfo, null);
}
editorClosed = GridViewElement.EndEdit();
}
else
{
editorClosed = GridViewElement.CloseEditor();
}
}
if (editorClosed)
{
this.Navigator.SelectNextColumn();
this.GridViewElement.BeginEdit();
}
if (this.IsInEditMode && this.GridViewElement.CurrentRow is GridViewNewRowInfo &&
this.GridViewElement.BeginEditMode != RadGridViewBeginEditMode.BeginEditProgrammatically)
{
return this.GridViewElement.BeginEdit();
}
if (newRowInfo != null)
{
newRowInfo.GetType().GetMethod("RaiseUserAddedRow", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(newRowInfo, null);
}
return false;
}
return base.ProcessEnterKey(keys);
}
}
((BaseGridBehavior)this.radGridView1.GridBehavior).UnregisterBehavior(typeof(GridViewNewRowInfo));
((BaseGridBehavior)this.radGridView1.GridBehavior).RegisterBehavior(typeof(GridViewNewRowInfo), new MyGridRowBehavior());