Ivan... Boa Noite...Identifiquei que o problema não está relacionado com o campo tipo imagem, mas sim a qualquer campo onde o BindingField não é utilizado para popular o seu conteúdo.
Por exemplo... Considere a situação onde no banco de dados um campo 'tempo' está sendo arquivado como minutos e, na tela, tenho que converter esses minutos em dois campos distintos, um para as horas e outro para os minutos.
Navegando nos registros do BO um método para popular os campos convertidos é invocado.
/// <summary>
/// Lendo dados do BO
/// </summary>
private void PopulaCampos()
{
//-- TempoExcedenteDiurno1 horas e minutos
this.nudTempoExcedenteDiurno1H.Value = tbHorarioPersonalizadoBO1.TempoExcedenteDiurno1Horas;
this.nudTempoExcedenteDiurno1M.Value = tbHorarioPersonalizadoBO1.TempoExcedenteDiurno1Minutos;
//-- TempoExcedenteDiurno2 horas e minutos
this.nudTempoExcedenteDiurno2H.Value = tbHorarioPersonalizadoBO1.TempoExcedenteDiurno2Horas;
this.nudTempoExcedenteDiurno2M.Value = tbHorarioPersonalizadoBO1.TempoExcedenteDiurno2Minutos;
//-- TempoExcedenteDiurno3 horas e minutos
this.nudTempoExcedenteDiurno3H.Value = tbHorarioPersonalizadoBO1.TempoExcedenteDiurno3Horas;
this.nudTempoExcedenteDiurno3M.Value = tbHorarioPersonalizadoBO1.TempoExcedenteDiurno3Minutos;
}
Então, ao salvar o registro o BO faz a crítica dos campos correspondentes. Se há erro preciso tratá-los para redirecionar o ícone do erro para esses campos, pois eles não estão ligados aos campos do BO via BindingField. Se não fizer isso, o usuário não fica sabendo qual campo está com erro. O código para isso:
private void tbHorarioPersonalizadoBO1_CheckRulesOnCurrentRow(CheckRulesEventArgs e)
{
foreach (BrokenRule loRule in tbHorarioPersonalizadoBO1.BrokenRules.ToArray())
{
if (loRule.FieldName.EndsWith("TempoExcedenteDiurno2", StringComparison.OrdinalIgnoreCase))
SetErrorProvider(nudTempoExcedenteDiurno2M, loRule.Description);
if (loRule.FieldName.EndsWith("TempoExcedenteDiurno3", StringComparison.OrdinalIgnoreCase))
}
}
Se há erro, beleza... O ícone do erro aparece na tela. No entanto, ao clicar em [Desfazer] e mesmo após isso, navegando nos registros, o ícone de alerta do erro permanece sobre o campo.
Para resolver isso, tive que forçar um "CleanErrorProvider()" quando o usuário pressiona um item do menu que não seja o botão Salvar. Veja o código abaixo:
private void MaintenanceFormToolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
if (e.ClickedItem.ToString().ToUpper() != "SALVAR")
ClearErrorProvider();
}
Não acho que essa seja a maneira mais adequada de tratar isso.