如何在DataGrid中验证空单元格或空值

3

我正在尝试验证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,它与一个名为People的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列下的单元格中输入任何数据,尝试移动离开该单元格时,它不会触发断点,这意味着验证甚至没有进行检查。

如果我在LastName列下的单元格中输入一些数据,然后尝试移动离开该单元格,它将尝试验证该单元格。因此它会触发断点。

那么,我的问题是如何验证空单元格?


如果有人认为我在使用过时的验证方法,请建议新的方法。 - Vishal
2个回答

5

只有当属性值被更改时,ValidationRule 才能起作用。但是,从空单元格转换而来时,值没有更改。因此,在这种情况下,验证规则将不会触发。

在 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,以便对LastName绑定进行验证:

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

Person类是由Entity Framework自动生成的。我是否仍然应该使用您建议的相同方法? - Vishal
是的,您可以将其与由EF生成的类一起使用。 - Rohit Vats
2
这个链接在这里也许会对你有所帮助。 - Rohit Vats
谢谢您的回答和文章。我也会阅读那篇文章。 - Vishal

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; 
}

基本上,您可以使用条件语句来验证数据。
这显然是验证单元格中是否存在某些内容的最标准方式...

非常感谢您的努力。很抱歉,在问题中我忘了提到我希望得到一个MVVM友好的答案。 - Vishal
您提供的解决方案是针对Winforms的。 - Vishal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接