none
DataTable com DataGridView RRS feed

  • Pergunta

  • Bom dia, caros amigos!

     

    Tenho uma tabela no DataTable onde o campo é do Tipo Integer, e esse DataTable está relacionado a um DataGridView. Preciso saber de duas coisas:

     

    1º - Como faço para criar uma chave primária nesse DataTable para que o usuário não consiga digitar dois valores idênticos. Se se tem como tratar o erro para mostrar uma mensagem amigável ao usuário.

     

    2º - Tem como bloquear a coluna no DataGridView para que o usuário não digite Letras e sim somente números?

     

    Desde já agradeço a ajuda de todos.

     

    Abraços e um bom feriados a todos os nossos amigos desenvolvedores.

    quinta-feira, 15 de junho de 2006 14:22

Respostas

Todas as Respostas

  • Eduardo,

    Você pode definir a chave do DataTable para tanto. E também pode tratar as mensagens de erro do DataGridView através do evento DataError. Por exemplo, coloque um DataGridView em um form e no evento Load:

    ' Vou definir uma tabela para testes...
    Dim dt As New DataTable("Exemplo")
    dt.Columns.Add(
    "id", GetType(Integer))
    dt.Columns.Add(
    "nome", GetType(String))

    ' Você pode definir a chave de um DataTable assim:
    dt.PrimaryKey = New DataColumn() {dt.Columns("id")}

    ' Então é só vincular ao DataGridView...
    DataGridView1.DataSource = dt

    No evento DataError do DataGridView:

    If TypeOf e.Exception Is ConstraintException Then
       
    ' Aqui é um erro de contraint do datatable. Como o único
        ' constraint do DataTable do exemplo é a chave primária,
        ' podemos deduzir que o erro se refere a ela.
        MessageBox.Show("Por favor, informe uma chave única e válida para o registro", "Exemplo", _
                                      MessageBoxButtons.OK, MessageBoxIcon.Warning)
    ElseIf TypeOf e.Exception Is FormatException Then
        '
    O usuário informou letras no campo numérico
       
    MessageBox.Show("Informe um valor numérico, por favor", "Exemplo", _
                                   
    MessageBoxButtons.OK, MessageBoxIcon.Warning)
    Else
       
    ' Um outro erro qualquer
        MessageBox.Show(e.Exception.ToString())
    End If

    Execute o aplicativo, tente colocar uma chave duplicada.

    Você ainda poderia definir este campo chave como auto numerado, aí o usuário nem precisaria digitar o valor. Mude o seu evento Load para isso e execute o aplicativo.

    ' Vou definir uma tabela para testes...
    Dim dt As New DataTable("Exemplo")
    dt.Columns.Add(
    "id", GetType(Integer))
    dt.Columns.Add(
    "nome", GetType(String))

    ' Aqui eu defino o campo como autonumerado
    dt.Columns("id").AutoIncrement = True

    ' o valor inicial
    dt.Columns("id").AutoIncrementSeed = 1
    ' e o incremento
    dt.Columns("id").AutoIncrementStep = 1

    ' Você pode definir a chave de um DataTable assim:
    dt.PrimaryKey = New DataColumn() {dt.Columns("id")}

    ' Então é só vincular ao DataGridView...
    DataGridView1.DataSource = dt

    ' Aí o ideal é deixar a coluna como readonly
    DataGridView1.Columns(0).ReadOnly = True

    Quanto a formatar o dado, uma forma seria usar uma coluna MaskedTextBox. Ela não é nativa, mas você pode obtê-la nos samples do DataGridView lá no Windows Forms.Net. Basta copiar a classe para o seu projeto ou compilá-la num assembly a parte e usá-la:

    http://www.windowsforms.net/Default.aspx?tabindex=1&tabid=60

    Baixe os samples do DataGridView através dos links do endereço acima.

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    quinta-feira, 15 de junho de 2006 15:32
    Moderador
  • Boa tarde, Francisco.

    Como faço para remover a Primarykey?

    Isso porque, quando tento limpar o DataTatble (dt.Columns.Clear) ocorre erro pelo fato da coluna ser chave primária.

     

    Abraços e muito obrigado

    quinta-feira, 15 de junho de 2006 16:18
  • Eduardo,

    SeuDataTable.PrimaryKey = Nothing

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    quinta-feira, 15 de junho de 2006 16:26
    Moderador
  • Francisco,

     

    Deu td certo, muito obrigado.

    Abraços

    quinta-feira, 15 de junho de 2006 16:31