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.

но опять же-может быть простое решение.