InvalidCastException quando você vincula DateTimePicker que contém um valor nulo no Visual Basic

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 313513
Sintomas
Quando você acoplar um controle DateTimePicker a uma fonte de dados, você receberá a seguinte mensagem de erro:
Ocorreu uma exceção sem tratamento do tipo 'System.InvalidCastException' em mscorlib.dll

Obter informações adicionais: objeto não pode ser convertido de DBNull em outros tipos.
Causa
Esse comportamento ocorre se o campo que esteja vinculado ao controle DateTimePicker contiver um valor nulo que é representado pelo objeto System.DBNull . O controle DateTimePicker não dá suporte o objeto System.DBNull .
Resolução
Para evitar esse comportamento, interceptar os dados antes que ele seja exibido no controle e, em seguida, alterar os dados para que ele seja válido.

Por exemplo, o código a seguir ajusta o registro o valor DBNull e altera o valor para um valor de data de 1 de janeiro de 1800. Esse código usa manipuladores de eventos com o controle DateTimePicker para monitorar quando o valor alterado. Se o valor for nulo, o valor é alterado para 1 de janeiro de 1800.
Private Sub Button1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles Button1.Click    Dim MyDataSet As New DataSet()    Dim MyTable As New Data.DataTable("dsTable")    Dim MyColumn As New DataColumn("HireDate")    MyDataSet.Tables.Add (MyTable)    MyColumn.AllowDBNull = True    MyColumn.DataType = GetType(System.DateTime)    MyTable.Columns.Add (MyColumn)    Dim MyData(0) As Object    MyTable.Rows.Add (MyData)    Dim MyBinding As New Binding("Value", MyDataSet.Tables("dsTable"), "HireDate")    AddHandler MyBinding.Format, AddressOf DTFormatter     AddHandler MyBinding.Parse, AddressOf DTParser     DateTimePicker1.DataBindings.Add (MyBinding)End SubPrivate Sub DTFormatter(ByVal sender As Object, ByVal e As ConvertEventArgs)    Dim b As Binding = CType(sender, Binding)    If Not e.DesiredType Is GetType(DateTime) Then        Return    End If    If e.value.GetType Is GetType(System.DBNull) Then        e.value = CType("1/1/1800", System.DateTime)    End IfEnd SubPrivate Sub DTParser(ByVal sender As Object, ByVal e As ConvertEventArgs)    If Not e.DesiredType Is GetType(DateTime) Then        Return    End If    If Not e.value.GetType Is GetType(DateTime) Then        Return    End If    Dim value As String = CType(e.Value, String)    If value.Equals("1/1/1800") Then        e.value = System.DBNull.value    End IfEnd Sub				
Situação
Esse comportamento é por design.
Mais Informações

Etapas para reproduzir o comportamento

  1. Inicie Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. Crie um novo aplicativo do Windows no Microsoft Visual Basic 2005 ou no Microsoft Visual Basic. NET.
  3. Arraste um controle Button e um controle DateTimePicker da caixa de ferramentas para o formulário.
  4. Clique duas vezes no controle Button para abrir a janela de código.
  5. Adicione o seguinte código ao manipulador de evento Click do controle Button .
    Private Sub Button1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles Button1.Click    Dim MyDataSet As New DataSet()    Dim MyTable As New Data.DataTable("dsTable")    Dim MyColumn As New DataColumn("HireDate")    Dim MyData(0) As Object    MyDataSet.Tables.Add (MyTable)    MyColumn.AllowDBNull = True    MyColumn.DataType = GetType(System.DateTime)    MyTable.Columns.Add (MyColumn)    MyTable.Rows.Add (MyData)    Dim MyBinding As New Binding("Value", MyDataSet.Tables("dsTable"), "HireDate")    DateTimePicker1.DataBindings.Add (MyBinding)End Sub					
  6. No menu Debug , clique em Iniciar para executar o programa.
  7. Clique no botão. Observe que você recebe a exceção não tratada mencionada na seção "Sintomas".

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 313513 - Última Revisão: 12/06/2006 23:26:02 - Revisão: 2.3

Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition

  • kbmt kbvs2005swept kbvs2005applies kbprb KB313513 KbMtpt
Comentários