Windows Forms - ErrorProvider + DataGridView - PullRequest
8 голосов
/ 27 апреля 2009

Как я могу подключить ErrorProvider к отдельным ячейкам в элементе управления DataGridView?

Ответы [ 5 ]

7 голосов
/ 29 июля 2013

Проблема, с которой я столкнулся при решении 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();
}
5 голосов
/ 27 апреля 2009

Я не уверен, что вы можете использовать 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.
            }
        }
2 голосов
/ 01 апреля 2010

Вы можете просто внедрить IDataErrorInfo в свои BusinessObjects и установить BindingSource как DataSource для ErrorProvider. Таким образом, ваша внутренняя проверка BusinessObject отображается в DataGrid и во всех полях, к которым привязаны объекты автоматически.

1 голос
/ 22 июля 2009
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;
}
0 голосов
/ 27 апреля 2009

Вы можете добавить столбец (например, DataGridViewTextBoxColumn) в dataGridView.Columns, для которого CellTemplate установлен в вашу собственную реализацию (скажем, унаследовано от DataGridViewTextBoxCell). Затем в вашей реализации - выполняйте валидацию по своему усмотрению - отрисовку и расположение панели редактирования в соответствии с вашими потребностями.

Вы можете проверить образец на http://msdn.microsoft.com/en-us/library/aa730881(VS.80).aspx.

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

...