Windows Forms-ErrorProvider + DataGridView
Как я могу подключить ErrorProvider с отдельными ячейками в элементе управления DataGridView?
5 ответов
Я не уверен, что вы можете использовать ErrorProvider таким образом, однако DataGridView имеет встроенную в него функциональность, которая в основном та же идея.
идея проста. DataGridViewCell имеет свойство ErrorText. Вы обрабатываете событие OnCellValidating, и если проверка не выполняется, вы устанавливаете свойство текста ошибки, и вы получаете красный значок ошибки для отображения в ячейке. Вот какой псевдо-код:
public Form1()
{
this.dataGridView1.CellValidating += new DataGridViewCellValidatingEventHandler(dataGridView1_CellValidating);
}
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (!this.Validates(e.FormattedValue)) //run some custom validation on the value in that cell
{
this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "Error";
e.Cancel = true; //will prevent user from leaving cell, may not be the greatest idea, you can decide that yourself.
}
}
проблема с решением BFree заключается в том, что ничего не отображается, пока ячейка находится в режиме редактирования, но если я заканчиваю редактирование, я получаю ошибку формата данных (потому что мое значение-двойное). Я решил это, прикрепив ErrorProvider непосредственно к элементу управления редактирования ячейки следующим образом:
private ErrorProvider ep = new ErrorProvider();
private void DGV_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0)
return;
double val;
Control edit = DGV.EditingControl;
if (edit != null && ! Double.TryParse(e.FormattedValue.ToString(), out val))
{
e.Cancel = true;
ep.SetError(edit, "Numeric value required");
ep.SetIconAlignment(edit, ErrorIconAlignment.MiddleLeft);
ep.SetIconPadding(edit, -20); // icon displays on left side of cell
}
}
private void DGV_CellEndEdt(object sender, DataGridViewCellEventArgs e)
{
ep.Clear();
}
вы можете просто реализовать IDataErrorInfo
в ваши BusinessObjects и установите BindingSource в качестве источника данных для ErrorProvider. Таким образом, проверка стажера BusinessObject отображается в DataGrid и во всех полях, к которым привязаны объекты автоматически.
private void myGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
var dataGridView = (DataGridView)sender;
var cell = dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
if ( ... ) // Validation success
{
cell.ErrorText = string.Empty;
return;
}
dataGridView.EndEdit();
cell.ErrorText = error;
e.Cancel = true;
}
вы можете добавить столбец (например, DataGridViewTextBoxColumn) в dataGridView.Столбцы, в которых CellTemplate имеет собственную реализацию (например, наследуется от DataGridViewTextBoxCell). Затем в вашей реализации-обработайте проверку, как вам нравится-рендеринг и позиционирование панели редактирования в соответствии с вашими потребностями.
вы можете проверить образец наhttp://msdn.microsoft.com/en-us/library/aa730881 (VS.80).aspx.
но опять же-может быть простое решение.