我有一个由一些行和列组成的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
}
}
}
答案 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
。
这种方法的好处是可以将验证逻辑与用户界面分离。