Try Catch numa datagrid vb2008

Fil__

Power Member
Malta tenho o seguinte codigo num datagrid, no botao gravar
Código:
    Private Sub BtnGravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGravar.Click
        With Me.BindingContext(Me.DsFornecedores, "FORNECEDOR")
        End With
        Try
            Me.FORNECEDORBindingSource.EndEdit()
        Catch ex As Exception
            MsgBox("Não existem dados inseridos para se poder proceder à gravação")
        End Try
        If DsFornecedores.HasChanges Then
            Me.FORNECEDORTableAdapter.Update(DsFornecedores.GetChanges())
            DsFornecedores.AcceptChanges()
        Else
            DsFornecedores.RejectChanges()
        End If
    End Sub

Ele faz tudo bem mas existe um pormenor, essa tabela (FORNECEDOR) tem 2 colunas sendo que a primeira (ID_FORNECEDOR) é a chave, portanto nao pode ser nulo o valor. O que pretendo é que o utiliador ao gravar um registo e se esquecer de colocar o codigo na coluna ID_FORNECEDOR apareca uma msg de erro a dizer que tem de colocar o codigo em vez de uma msg padrao do windows que diz que o valor nao pode ser nulo. De resto o codigo funciona lindamente, caso o utilizador nao coloque nada nas 2 colunas diz "Não existem dados inseridos para se poder proceder à gravação". Percebem a minha ideia? Podem ajudar?
 
Acho é que nem sequer devias dar a hipótese do utilizador inserir um código. Isso são valores que devem ser gerados pela BD em si. Há excepções, mas no caso de fornecedores costuma ser como eu estou a dizer.

O que deverias fazer, era na estrutura da tua BD, definires o código de fornecedor como numeração automática.

Depois trocas a textbox onde inseres o código de fornecedor, por uma label. O valor que deverá aparecer na label, ao carregares o formulário, será o do último código inserido, mais 1, por ser o código a usar num novo registo.
Obtens isto através da função IDENT_CURRENT do SQL. Essa função devolve o último valor usado na identidade. A partir daí é somares mais 1 ao valor que obtens.

Ou seja, se na tua BD o último registo tiver o nº 1, o que o programa deverá fazer é inserir o nº 2 na label. Depois inseres normalmente. O valor da chave é o da label. Consegues perceber a minha ideia?
 
Mas eu no meu caso nao posso ter valor incremental. Tem que ser o proprio a meter por um motivo. Existe uma empresa fornecedora que é o A e existe uma sub-empresa que pertence a empresa fornecedora e que vai ser o A1. Outra empresa sera o B. Entendes? Por causa dessas situações e que o codigo tem que ser colocado pela propria pessoa pois ela e que sabe que definiçoes dar aos seus fornecedores
 
Olá!

Penso que o melhor seria usares o metodo 'grid_RowValidating' por forma a impedires que aconteça o que não queres, mesmo antes de sair da linha.

Vê um exemplo:

Código:
Private Sub grid_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles grid.RowValidating

        Dim row As DataGridViewRow = grid.Rows(e.RowIndex)

        
        If row.Cells("NumFornecedor").Value.ToString.Trim = "" Then
        MessageBox.Show("Tem de Indicar o Numero do Fornecedor!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Stop)
        e.Cancel = True
        End If


    End Sub
Assim já nada disso acontece.

Cumprimentos,
 
Ah, alem da questao inicial gostava de tambem ter uma excepçao de modo a que na coluna ID_FORNECEDOR nao existam 2 iguais. Podem ajudar-me? Please? Tou mesmo a nora, nao acho nada na net que seja explicito
 
Ah, alem da questao inicial gostava de tambem ter uma excepçao de modo a que na coluna ID_FORNECEDOR nao existam 2 iguais. Podem ajudar-me? Please? Tou mesmo a nora, nao acho nada na net que seja explicito

O DataGrid é um objecto que foi muito extendido, daí que é preciso saber o básico como ele funciona, serão terás vários problemas, como esse da validação..
Aconselho te a ler alguns tutoriais sobre o artigo..

Visita este link: http://www.macoratti.net/colab15.htm

Ve se consegues perceber, é uma situação parecida, que tive de criar..
Código:
    Private Sub dtAcesso_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dtAcesso.CellValidating
        'Se ao clicar no botão sair egnora..
        If Not (Me.ActiveControl.Name = "btnCalcel") Then
            'Faz a validação do campo..
            If Not String.IsNullOrEmpty(dtAcesso.Rows(e.RowIndex).Cells(0).Value.ToString) Then
                'Verifica se o valor é numerico
                If IsNumeric(dtAcesso.Rows(e.RowIndex).Cells(0).Value) Then
                    'Verifica se o valor é maior do que zero.
                    If Not (Val(dtAcesso.Rows(e.RowIndex).Cells(0).Value) > 0) Then
                        MessageBox.Show("Tem de introduzir um valor númerico maior que zero.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Stop)
                        e.Cancel = True
                    End if
                Else
                    MessageBox.Show("Tem de introduzir um valor númerico.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Stop)
                End If
            End If
        End If
    End Sub
    Private Sub dtAcesso_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dtAcesso.CellValueChanged
        If Not (dtAcesso.DataSource Is Nothing) Then
            'Verifica se é o primeiro campo..
            If (e.ColumnIndex = 0) Then
                'Faz a validação do campo..
                If Not String.IsNullOrEmpty(dtAcesso.Rows(e.RowIndex).Cells(0).Value.ToString) Then
                    'Verifica se o valor é numerico
                    If IsNumeric(dtAcesso.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) Then
                        'Verifica se o valor é maior do que zero.
                        If Not (Val(dtAcesso.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) > 0) Then
                            MessageBox.Show("Tem de introduzir um valor númerico maior que zero.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Stop)
                            e.Cancel = True
                        End if
                    Else
                        MessageBox.Show("Tem de introduzir um valor númerico.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Stop)
                    End If 
                End If
            End If
        End If
    End Sub
    Private Sub dtAcesso_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles dtAcesso.DataError
        Try
            If (e.ColumnIndex = 0) Then
                Dim view As DataGridView = CType(sender, DataGridView)
                view.Rows(e.RowIndex).ErrorText = "Erro"
                view.Rows(e.RowIndex).Cells(e.ColumnIndex).ErrorText = "Tem de introduzir um valor numérico maior que zero."
                e.ThrowException = False
            End If
        Catch ex as Exeption
            MessageBox.Show(ex.Message, "dtAcesso_DataError")
        End Try
    End Sub
Para actualizar a info do DataGrid para a base de dados:

Código:
Private Sub btnAplicar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAplicar.Click
    'Cria novo Command Buiilder
    Using objCommandBuilder As New MySqlCommandBuilder(_MySqlDataAdapter)
        'Actualiza o DataSet para a BD
        If _MySqlDataAdapter.Update(_DataSet, "users_tek") Then
            MsgBox("Registos actualizados com êxito.", MsgBoxStyle.Information)
        End If
    End Using
End Sub

Precisas de ter em conta os seguintes eventos do DataGrid:
dtAcesso_CellValidating 'Quando introduz o valor na cell..
dtAcesso_CellValueChanged 'Quando termina de introduzir o valor..
dtAcesso_DataError 'Em caso de erro, convém manipular a exception, porque senão surge uma mensagens técnica de erro.
Fica bem :)
 
Última edição:
Jaimems existem alguns problemas nomeadamente o gajo nao gostar do grid (indica erro). Podes ajudar-me um pouco mais?

Olá!

Penso que o melhor seria usares o metodo 'grid_RowValidating' por forma a impedires que aconteça o que não queres, mesmo antes de sair da linha.

Vê um exemplo:

Código:
Private Sub grid_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles grid.RowValidating

        Dim row As DataGridViewRow = grid.Rows(e.RowIndex)

        
        If row.Cells("NumFornecedor").Value.ToString.Trim = "" Then
        MessageBox.Show("Tem de Indicar o Numero do Fornecedor!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Stop)
        e.Cancel = True
        End If


    End Sub
Assim já nada disso acontece.

Cumprimentos,
 
Olá!

Deve haver algo de errado.

Quando clicas 2 vezes na grid, o método _RowValidating aparece?

E aparecem os argumentos da mesma forma?

Diz algo.
 
Agora so da erro no grid.Rows(e.RowIndex) - nao reconhece o grid
Da tambem no e.Cancel = True - nao reconhece o e.Cancel
Brigadao pela ajuda Jaimems
 
Back
Topo