none
Máscara Data em DataGridView RRS feed

  • Pergunta

  • Boas..
    Tenho um datagridview, preenchido da seguinte maneira

                sda.Fill(ds, "tabela")
                Dim dataSource As New BindingSource(ds.Tables("
    tabela"), Nothing)
                dgvDados.DataSource = dataSource

    E preciso que a coluna que é do tipo smalldatetime, tenha uma máscara igual ao sistema do controle MaskedTextBox.

    Desde já obrigado...
    segunda-feira, 17 de novembro de 2008 15:14

Respostas

Todas as Respostas

  • Se só quiser exibir o valor, formate o campo do DataGridView assim:

    dgvDados.Columns(<índice ou nome da coluna>).DefaultCellStyle.Format = "d"

    Onde "d" índica o formato de data curta configurado no sistema. Para outros especificadores de formato veja:

    http://msdn.microsoft.com/en-us/library/az4se3k1.aspx

    Se quiser entrar dados mascarados no DGV, dá mais trabalho:

    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=1341306&SiteID=21
    segunda-feira, 17 de novembro de 2008 15:37
  • O objectivo é mesmo mascarar, o outro método é simples, mas não corresponde ao que eu quero...
    segunda-feira, 17 de novembro de 2008 17:26
  • O que exatamente você quer? Explique melhor.
    segunda-feira, 17 de novembro de 2008 20:07
  • Quero o meu efeito do maskedtextbox..
    Ou seja, quando começa a inserir os dados na célula da tabela datetime, ele já aparece com a mascara dd-mm-aaaa, em que eu só tenho de escrever os números por que os '-' já estão lá...
    terça-feira, 18 de novembro de 2008 09:14
  •  Vitor Martins wrote:
    Quero o meu efeito do maskedtextbox..
    Ou seja, quando começa a inserir os dados na célula da tabela datetime, ele já aparece com a mascara dd-mm-aaaa, em que eu só tenho de escrever os números por que os '-' já estão lá...


    Isso é o que é discutido no segundo link que eu postei acima...
    terça-feira, 18 de novembro de 2008 11:31
  • Pois só que quando tento inserir uma coluna daquele tipo na datagridview dá-me erro..

    terça-feira, 18 de novembro de 2008 11:43
  • Resolvido..
    Obrigado mais uma vez Mestre
    terça-feira, 18 de novembro de 2008 12:07
  • Só tem um problema este código, sempre que apago o conteudo da célula ele dá-me erro, como posso contornar o problema?
    segunda-feira, 24 de novembro de 2008 10:52
  • Difícil dizer por que o erro acontece sem ver o código, especialmente sem nenhuma informação sobre o erro (qual é a mensagem etc.)

    Por alto, você deve tratar a condição em que nenhum dado exista — que é o que provoca a exceção — onde o erro acontece, seja dentro do MaskedTextBox sendo usado como célula do DGV, seja no DGV.
    segunda-feira, 24 de novembro de 2008 11:26
  • O erro que me dá é o seguinte:"  -  -não é um valor válido para DateTime

    Tentei o seguinte:
     Private Sub dgvDados_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles dgvDados.DataError
            If e.ColumnIndex = 3 Then
                e.Cancel = True
                dgvDados.Item(e.ColumnIndex, e.RowIndex).Value = DBNull.Value
            End If

        End Sub

    segunda-feira, 24 de novembro de 2008 11:29
  •  Vitor Martins wrote:
    O erro que me dá é o seguinte:"  -  -não é um valor válido para DateTime



    É um erro de conversão. O Valor string sendo entrado no MaskedTextBox não está sendo compreendido pelos métodos de conversão do Framework como um valor válido para data. Por exemplo, se a máquina estiver configurada para datas no formato português e a data entrada for no formato americano, como 11/24/20008, essa exceção ocorre, porque os métodos de conversão assumem que 24 se refere ao mês, e um mês 24 não existe.

    Se você não tem o hábito saudabilíssimo de usar Option Strict On nos seus projetos para forçar as conversões a serem explícitas (O VB tenta converter por de trás dos panos sem Option Strict On, o que é, bem, MALIGNO), esse tipo de erro é exacerbado e começa a ficar difícil de ser depurado.

    No caso, evidentemente, a string vazia ou só com a máscara da data, que é o que é retornado pelo MaskedTextBox sem dados, não é uma data válida (como algo como "  /  /    " pode ser convertido para uma data?). Você deve tratar essa condição, forçando a entrada de dados, ou verificando se a data é válida com o método DateTime.TryParse() (procure exemplos no fórum, há vários), por exemplo, e não executar atribuições de dados se a data não for válida etc.
    segunda-feira, 24 de novembro de 2008 11:44
  • Eu só queria que quando fosse aquele valor ele defini-se para dbnull, mas não estou conseguindo
    segunda-feira, 24 de novembro de 2008 11:46
  •  Vitor Martins wrote:

    Eu só queria que quando fosse aquele valor ele defini-se para dbnull, mas não estou conseguindo



    Esse é o ponto, se a coluna exige DateTime, DBNull.Value não pode ser convertido para data. DBNull.Value não é uma data válida.
    segunda-feira, 24 de novembro de 2008 11:48
  • Agora dá-me outro erro ao guardar..porque quando coloquei o string.empty, ele colocou-me no texto 01-01-1001

    segunda-feira, 24 de novembro de 2008 12:06
  • Consegui fazendo assim
     If e.ColumnIndex = 3 Then
                e.Cancel = False
                dgvDados.Item(e.ColumnIndex, e.RowIndex).Value = String.Empty
                dgvDados.Item(e.ColumnIndex, e.RowIndex).Value = DBNull.Value
            End If
    segunda-feira, 24 de novembro de 2008 12:11
  • O que parece acontecer é que em algum ponto está havendo uma conversão para essa data do String.Empt y— onde não faço idéia — um erro deveria ser gerado, o seu código está fazendo algo mais) e agora o BANCO não aceita datas com ano 1001(a data mínima no SQL Server, por exemplo, é 1/1/1753).

    Você deve tratar explícitamente todas as conversões, retornar para INCLUSÃO NO BANCO um valor que a tabela aceite, como DBNull.Value se o campo deve ser vazio (assumindo claro, que o campo em questão aceite nulos), atribuir à célula do DGV um valor que ela aceite etc. (deixando a célula vazia se a data for inválida, mas tratando qualquer erro potencial que possa ser gerado durante a edição, forçar a entrada da data se a data for de entrada obrigatória etc.).
    segunda-feira, 24 de novembro de 2008 12:30