如何验证所有datagridview单元格?

时间:2016-12-15 16:07:35

标签: c# winforms validation datagridview

我有一个由一些行和列组成的DataGridView。我想检查我的DataGridView的所有单元格是否为空单元格,如果任何行中的任何单元格为空,则给我一条消息。我有一个代码,但它只检查第一行的单元格 这是我的代码:

    foreach (DataGridViewRow rw in dgv_absence.Rows)
    {
        if (rw.Cells[0].Value == null || rw.Cells[0].Value == DBNull.Value || string.IsNullOrWhiteSpace(rw.Cells[0].FormattedValue.ToString()) || rw.Cells[1].Value == null || rw.Cells[1].Value == DBNull.Value || string.IsNullOrWhiteSpace(rw.Cells[1].FormattedValue.ToString()))
        {
            MessageBox.Show("message","title");
            return;
        }
        else
        {
            for (int i = 0; i < dgv_absence.Rows.Count - 1; i++)
            {
                // do some thing
            }
        }
    }

3 个答案:

答案 0 :(得分:0)

而不是仅定位每行第一个单元格的Cells [0],您还需要在内部for循环中循环遍历单元格。像这样:

        foreach (DataGridViewRow row in dataGridView.Rows)
        {
            foreach (DataGridViewCell cell in row.Cells)
            {

            }
        }

答案 1 :(得分:0)

如果一个单元格为空,则可以调用此方法返回:

 public Boolean IsDataGridViewEmpty( DataGridView dataGridView)
    {
        bool isEmpty = false;
        foreach (DataGridViewRow row in dataGridView.Rows)
        {
            if (!row.IsNewRow)
            {
                foreach (DataGridViewCell cell in row.Cells)
                {
                    //if (!string.IsNullOrEmpty(cell.Value.ToString ()))
                    //{
                    if (string.IsNullOrEmpty(cell.Value.ToString().Trim()))
                    {
                        isEmpty = true;
                        break; // TODO: might not be correct. Was : Exit For
                        //  }
                    }
                }
            }
        }
        return isEmpty;
    }

你可以通过以下方式来打电话:

  if (!IsDataGridViewEmpty( dgv_absence))
        {
           MessageBox.Show("message","title");
             return;
        }

答案 2 :(得分:0)

这就是我要做的。

Windows窗体上的DataGrid控件可以读取实现IDataErrorInfo

的对象的错误

正如MSDN所说。

  

IDataErrorInfo提供提供用户界面可以绑定的自定义错误信息的功能。

您的POCO对象位于网格的数据源集合中,应该实现IDataErrorInfo让我们这样说:

public class MyEntity : IDataErrorInfo
{
    public string this[string columnName]
    {
        get
        {
            // here you can validate each property of your class (POCO object)
            var result = string.Join(Environment.NewLine, Validator.Validate(this, columnName).Select(x => x.ErrorMessage));
            return result;
        }
    }

    public string Error
    {
        get
        {
            // here you can errors related to the whole object (ex: Password, and PasswordConfirmation do not match)
            return string.Join(Environment.NewLine, Validator.Validate(this)
                                                                .Select(x => x.ErrorMessage));
        }
    }

    public Boolean IsValid
    {
        get { return string.IsNullOrEmpty(Error); }
    }
}

然后您可以使用一些验证技术来设置验证规则。

我喜欢使用DataAnnotation来实现我的验证逻辑。

所以,让我们说你的班级有一个属性(名字),你的班级可以不是null:

public class MyEntity : IDataErrorInfo
{
    [Required]
    public string Name { get; set; }

    public string this[string columnName]
    {
        get
        {
            // here you can validate each property of your class (POCO object)
            var result = string.Join(Environment.NewLine, Validator.Validate(this, columnName).Select(x => x.ErrorMessage));
            return result;
        }
    }

    public string Error
    {
        get
        {
            // here you can validate errors related to the whole object (ex: Password, and PasswordConfirmation do not match)
            return string.Join(Environment.NewLine, Validator.Validate(this)
                                                                .Select(x => x.ErrorMessage)
                                                                .Union(ModelError.Select(m => m.Value)));
        }
    }

    public Boolean IsValid
    {
        get { return string.IsNullOrEmpty(Error); }
    }
}

然后,如果你使用像这样的验证器

public class Validator : IValidator
{
    public IEnumerable<ErrorInfo> Validate(object instance)
    {
        IEnumerable<ErrorInfo> errores = from property in instance.GetType().GetProperties()
            from error in GetValidationErrors(instance, property)
            select error;
        if (!errores.Any())
        {
            errores = from val in instance.GetAttributes<ValidationAttribute>(true)
                where
                    val.GetValidationResult(null, new ValidationContext(instance, null, null)) !=
                    ValidationResult.Success
                select
                    new ErrorInfo(null,
                        val.GetValidationResult(null, new ValidationContext(instance, null, null)).ErrorMessage,
                        instance);
        }

        return errores;
    }

    public IEnumerable<ErrorInfo> Validate(object instance, string propertyName)
    {
        PropertyInfo property = instance.GetType().GetProperty(propertyName);
        return GetValidationErrors(instance, property);
    }

    private IEnumerable<ErrorInfo> GetValidationErrors(object instance, PropertyInfo property)
    {
        var context = new ValidationContext(instance, null, null);
        context.MemberName = property.Name;
        IEnumerable<ErrorInfo> validators = from attribute in property.GetAttributes<ValidationAttribute>(true)
            where
                attribute.GetValidationResult(property.GetValue(instance, null), context) !=
                ValidationResult.Success
            select new ErrorInfo(
                property.Name,
                attribute.FormatErrorMessage(property.Name),
                instance
                );

        return validators.OfType<ErrorInfo>();
    }
}

错误将出现在每个单元格或每行的网格上,具体取决于错误。

请注意,如果您打算在线编辑对象,还应该实施INotifyPropertyChanged

这种方法的好处是可以将验证逻辑与用户界面分离。