:
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;
}
次の方法でそれを呼び出すことができます行う。
MSDNが言うように、WindowsフォームでのDataGridコントロールがIDataErrorInfo
を実装するオブジェクトからのエラーを読み取ることができます。
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); }
}
}
次に、あなたがあなたの検証ルールを設定するには、いくつかの検証技術を使用することができます。
グリッドのデータソースのコレクション内のあなたのPOCOオブジェクト、IDataErrorInfo
はのは、このような何かを言わせて実装する必要があります。
私はDataAnnotationを使用して検証ロジックを実装したいと思います。だから、
、あなたのクラスは可能性がnullにすることはできませんというのは、あなたのクラスは、プロパティ(名前を)持っているとしましょう:あなたはこの
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>();
}
}
ようなエラーがバリデータを使用している場合だろうその後
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); }
}
}
エラーに応じてセルごとまたは行ごとにグリッドに表示されます。
オブジェクトのインライン編集を計画している場合は、INotifyPropertyChanged
も実装する必要があります。
この手法は、検証ロジックをユーザーインターフェイスから切り離すという利点があります。
これはWindowsフォームアプリケーションの場合ですか? –
いくつかの検証イベントがあります。すべての行をループすると効率的ではありません。 – Plutonix
はい、Windowsフォーム –