2014-07-10 73 views
3

我想验证DataGrid中的单元格。这是我第一次验证的方法。由于我是新手,因此我在验证中遇到了一些问题。如何验证DataGrid中的空单元或空单元格

我创建了一个名为StringIsNullOrEmptyValidationRule.cs的类。此类检查,如果字符串为null或“”

这里是StringIsNullOrEmptyValidationRule.cs的代码:

class StringIsNullOrEmptyValidationRule : ValidationRule 
{ 
    private string _errorMessage = ""; 
    public string ErrorMessage 
    { 
     get 
     { 
      return _errorMessage; 
     } 
     set 
     { 
      _errorMessage = value; 
     } 
    } 

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     ValidationResult result = new ValidationResult(true, null); 

     if (value == null || ((string)value).Trim() == "") 
     { 
      result = new ValidationResult(false, this.ErrorMessage); 
     } 

     return result; 
    } 
} 

现在我有MainWindow.xaml一个DataGrid被绑定到一个ObservableCollection叫人。这是我的DataGrid:

<DataGrid x:Name="maindg" ItemsSource="{Binding People}" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="CellOrRowHeader"> 
    <DataGrid.Columns> 

     <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" /> 

     <DataGridTextColumn Header="Last Name"> 
      <DataGridTextColumn.Binding> 
       <Binding Path="LastName"> 
        <Binding.ValidationRules> 
         <local:StringIsNullOrEmptyValidationRule ErrorMessage="LastName is required" /> 
        </Binding.ValidationRules> 
       </Binding> 
      </DataGridTextColumn.Binding> 
     </DataGridTextColumn> 

     <DataGridTextColumn Header="City" Binding="{Binding City}" /> 

    </DataGrid.Columns> 

</DataGrid> 

问题:

我一直在StringIsNullOrEmptyValidationRule的validate方法的第一行设置一个断点。 当我在LastName Column下的单元格中没有输入任何数据时,尝试远离单元格时,它不会触及断点,这意味着验证甚至不检查。

如果我将某些数据输入到lastName列下的单元格,然后尝试移开单元格,它会尝试验证单元格。所以它达到了断点。

所以,我的问题是我如何验证NullOrEmpty单元?

+0

如果有人认为我使用过时的验证方法,那么请提出新的方法。 – Vishal

回答

4

有效性规则只适用的情况下,属性值被改变。但是,当你从空单元走,价值没有改变。因此,在这种情况下,验证规则不会被解雇。

落实Person类IDataErrorInfo,做您的验证那边是这样的:

public class Person : IDataErrorInfo 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string City { get; set; } 

    public string Error 
    { 
     get 
     { 
      return String.Concat(this[FirstName], " ", this[LastName], " ", 
           this[City]); 
     } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
      string errorMessage = null; 
      switch (columnName) 
      { 
       case "LastName": 
        if (String.IsNullOrWhiteSpace(LastName)) 
        { 
         errorMessage = "LastName is required."; 
        } 
        break; 
      } 
      return errorMessage; 
     } 
    } 
} 

而在你的XAML,你需要ValidatesOnDataError属性设置为true名字绑定:

<DataGridTextColumn Header="Last Name" Binding="{Binding LastName, 
              ValidatesOnDataErrors=True}"/> 
+0

人员类是由实体框架自动生成的。我仍然应该使用您建议的相同方法吗? – Vishal

+0

是的,你可以使用EF生成的类。 –

+2

链接[here](http://blogs.msdn.com/b/bethmassi/archive/2009/07/07/implementing-validation-in-wpf-on-entity-framework-entities.aspx)可能是你的兴趣也是如此。 –

1

这是在这里获得: http://msdn.microsoft.com/en-us/library/ykdxa0bc(v=vs.90).aspx

private void dataGridView1_CellValidating(object sender, 
DataGridViewCellValidatingEventArgs e) 
{ 
    string headerText = dataGridView1.Columns[e.ColumnIndex].HeaderText; 

    // Abort validation if cell is not in the CompanyName column. 
    if (!headerText.Equals("CompanyName")) return; 

    // Confirm that the cell is not empty. 
     if (string.IsNullOrEmpty(e.FormattedValue.ToString())) 
     { 
      dataGridView1.Rows[e.RowIndex].ErrorText = 
      "Company Name must not be empty"; 
      e.Cancel = true; 
} 

基本上你可以使用条件语句来验证数据。

这显然是验证的东西在细胞中存在的最标准的方式...

+0

感谢您的努力。对不起,我忘了在提问中提到我很想得到一个MVVM友好的答案。 – Vishal

+0

您提供的解决方案也适用于Winforms。 – Vishal

相关问题