2014-02-18 122 views
0

我有一个Telerik radGridView窗体上有一个单元格和行验证实施。没问题,运作良好。如果验证失败,防止gridview失去焦点

问题出现时,我留下一行不完整,然后单击窗体上其他位置的保存按钮。下面的RowValidating代码片段不起作用,因为一旦焦点从gridview移动到Save按钮,if(row!= null)总是为false,并且RowValidating代码永远不会执行。

private void radGridView1_RowValidating(object sender, RowValidatingEventArgs e) 
    { 
     var row = e.Row as GridViewDataRowInfo; 

     if (row != null) 
     { 
      var value = row.Cells["cboUnit"].Value.ToString(); 
      if (string.IsNullOrEmpty(value)) 
      { 
       e.Cancel = true; 
       row.ErrorText = "Unit Number is a required field"; 
      } 

      else 
      { 
       row.ErrorText = string.Empty; 
      } 

我怎么能留住焦点在网格中,以确保他整个网格允许用户离开电网,并保存之前验证?

+0

我对Telerik控件并不熟悉,但是我知道标准'DataGridView'只在'CurrentRow'发生变化时触发'RowValidating'事件。如果整个网格失去焦点,但'CurrentRow'保持不变,我相信你必须自己触发验证(例如调用Form.ValidateChildren()方法)。 – JosephHirn

+0

我会尝试替代方法来触发验证 - 无论网格的状况如何,Form.ValidateChilden()都会返回true。 – PeterJ

+0

你也可以尝试'Form.Validate()'。如果一切都失败了,你总是可以设置'grid.CurrentCell = null',它应该抛出'InvalidOperationException'。 – JosephHirn

回答

0

请尝试给出两个条件在一起。

private void radGridView1_RowValidating(object sender, RowValidatingEventArgs e) 
{ 
    var row = e.Row as GridViewDataRowInfo;   
     var value = row.Cells["cboUnit"].Value.ToString(); 
     if (string.IsNullOrEmpty(value) && row != null) 
     { 
      e.Cancel = true; 
      row.ErrorText = "Unit Number is a required field"; 
     } 

     else 
     { 
      row.ErrorText = string.Empty; 
     } 

我还没有试过代码,但希望这有助于!

+0

谢谢。但是这种方法的问题是if(string.IsNullOrEmpty(value)...)的代码失败如果value == null – PeterJ

+0

@PeterJ所以请给Or运算符而不是AND(&&)。这里我有And运算符。而不是||给出||以便它检查这两种情况,如果它们中的任何一个都失败了,它仍然可以工作。 – user3222297

+0

问题是,当row == null返回true时,string.IsNullOrEmpty自动也是true,所以代码永远不会执行。我想我可能在这里忽略了一些愚蠢的东西,但是在尝试几乎所有可以想象的选项的两天后,我仍然陷入了困境! – PeterJ