Inquiridor
Input string was not in a correct format

Pergunta
-
Olá,
Tenho um Windows Application com C# e estou desenvolvendo uma tela simples de cadastro. Na tabela (access), o campo Matrícula é um Integer e permite Nulo. No meu Form, o campo textfield referente ao campo "Matrícula" está associado ao campo Matrícula do meu funcionariosBingingSource. Fiz esta associação através da opção Databinding >>Advanced [...] das propriedades do campo.
No momento de executar a tela, se o usuário for na opção "Add New..." do funcionariosBindingNavigator e inserir um novo registro SEM a inclusão do campo Matrícula, OK!!! Os dados são inseridos corretamente na base de dados. Porém, se o usuário entrar com o valor Matrícula, mesmo que por engano, e tentar apagar (deixar o campo vazio), a tela não permite que o usuário tire o foco do campo até que o valor digitado seja um Numérico. Até este momento, não vejo muito problema. O problema maior que vejo é que se o usuário tentar apagar o conteúdo digitado ele também não consegue tirar o foco do campo. Este "problema" também ocorre quando o registro já existe cadatrado com um valor numérico cadastrado no campo Matrícula e o usuário tenta apagar o conteúdo deste campo e salvar.
Finalmente, se ajustar a opção CausesValidation do campo para False, então é permitido que o usuário tire o foco do campo quando o conteúdo for apagado, mas o Update do funcionariosTableAdapter não atualiza corretamente, pois também entende que o valor informado não é válido. Mesmo nulo? Como pode ser tratado este caso? Como faço para permitir tirar o foco do campo quando informado nulo?
Obrigado.
Todas as Respostas
-
-
Sim, mas como resolver?
Como permitir que o usuário apague (deixando uma string vazia), e fazer nossos objetos de acesso a dados entenderem que estou digitando um valor Null e não uma string vazia? Tem como eu converter para um DBNull antes de passar para minha camada de persistência?
Obrigado, abraços.
-
Bem, eu estou sem o VS agora e não lembro como fazer isso gráficamente. Mas via código você pode usar o evento Parse do objeto Bind. Mais ou menos assim:
Dim b As Binding = Me.txtMatricula.DataBindings("Text")
AddHandler b.Parse, AddressOf TrataNulo
Private Sub TrataNulo(ByVal sender As Object, ByVal e As ConvertEventArgs)
If String.IsNullOrEmpty(e.Value.ToString) Then
e.Value = DBNull.Value
End If
End Sub -
no meu caso esse erro só acontece quando passo o sistema pro ar.
segue a consulta no bd
"select a.codigo, a.cod_imovel, a.titulo, a.referencia, a.valor, b.descricao, c.descricao as bairro from imovel a, tipo b, bairro c where a.bairro = c.codigo and a.tipo = b.codigo and a.tipo = 4 order by RND(a.cod_imovel)"