2009-04-27 19 views

ответ

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. 
      } 
     } 
+1

Я попытался установить свойство ErrorText. Во время выполнения ничего не происходит! –

+0

Странно, это должно сработать ... Просто убедитесь, что ваш ErrorText не является пустой строкой, потому что это устраняет ошибку. –

+1

Он должен работать, я только что протестировал его. Единственное, о чем я могу думать, это то, что сам DataGridView обладает свойством ShowCellErrors. Убедитесь, что он не установлен в значение false. – BFree

0

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

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

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

1
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; 
} 
2

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

5

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