Usuário com melhor resposta
DataTable com DataGridView

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.
Respostas
-
Eduardo,
SeuDataTable.PrimaryKey = Nothing
Abraços,
Francisco
OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx
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 = dtNo 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 IfExecute 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 = TrueQuanto 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 -
-
Eduardo,
SeuDataTable.PrimaryKey = Nothing
Abraços,
Francisco
OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx -