Wendelius
Ответ в решении 1 работает отлично. Но чтобы дать вам еще один аспект, если сценарий:
- вы используете несколько экземпляров таблицы данных с одинаковой структурой
- если вы используете таблицу данных, например, в таблице данных или аналогичной
- вы хотите сделать проверку между несколькими столбцами и так далее
Возможно, Вам будет полезно поместить проверки в одно место-таблицу данных.
Например, вы можете создать таблицу данных, специфичную для определенной структуры, и использовать событие RowChanging для выполнения проверки. Рассмотрим следующее определение таблицы данных
/// <summary>
/// Data table for specific usage
/// </summary>
public class MyDataTable : DataTable {
/// <summary>
/// Default constructor
/// </summary>
public MyDataTable() : base() {
this.RowChanging += MyDataTable_RowChanging;
this.Columns.Add(new DataColumn() {
ColumnName = "IntegerColumn",
AllowDBNull = false,
DataType = typeof(int)
});
this.Columns.Add(new DataColumn() {
ColumnName = "StringColumn",
AllowDBNull = true,
DataType = typeof(string)
});
}
/// <summary>
/// Validate the row
/// </summary>
private void MyDataTable_RowChanging(object sender, DataRowChangeEventArgs e) {
if ((int)e.Row["IntegerColumn"] <= 0) {
e.Row.SetColumnError(this.Columns["IntegerColumn"], "Value must be at least 1");
}
if ((int)e.Row["IntegerColumn"] > 10
&& (e.Row["StringColumn"] == DBNull.Value
|| string.IsNullOrEmpty((string)e.Row["StringColumn"]))) {
e.Row.SetColumnError(this.Columns["StringColumn"], "String column must be provided with a value if integer is greater than 10");
}
}
}
Теперь каждый раз, когда строка добавляется в таблицу данных, происходит событие RowChanging, позволяющее выполнить проверку для этой строки. Это происходит независимо от того, откуда добавляется строка. Если строка добавляется непосредственно через сетку, проверка все равно происходит.
Что касается использования, посмотрите на следующие примеры
MyDataTable myTable = new MyDataTable();
DataRow row;
// Add a row that will be invalid
row = myTable.NewRow();
row["IntegerColumn"] = -1;
myTable.Rows.Add(row);
row = myTable.NewRow();
row["IntegerColumn"] = 1;
myTable.Rows.Add(row);
// Add a row that will be invalid
row = myTable.NewRow();
row["IntegerColumn"] = 22;
myTable.Rows.Add(row);
row = myTable.NewRow();
row["IntegerColumn"] = 22;
row["StringColumn"] = "Some text";
myTable.Rows.Add(row);
// The table will have 4 rows and 2 of them have errors
if (myTable.HasErrors) {
foreach (DataRow errorRow in myTable.Rows) {
if (errorRow.HasErrors) {
foreach (DataColumn errorColumn in errorRow.GetColumnsInError()) {
System.Diagnostics.Trace.WriteLine(string.Format("{0}: {1}",
errorColumn.ColumnName,
errorRow.GetColumnError(errorColumn)));
}
}
}
}
Кроме того, одним из преимуществ является то, что многие элементы управления, привязываемые к таблице данных, проверяют, есть ли в строке ошибки. В этом случае они автоматически выделяют строку, обеспечивающую обратную связь с пользователем.
Пример написан быстро, поэтому он нуждается в дополнительной работе. Кроме того, прежде чем погрузиться в обработку событий в таблице данных, прочтите
Обработка Событий DataTable[
^]