1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Try Catch numa datagrid vb2008

Discussão em 'Programação' iniciada por Fil__, 13 de Setembro de 2008. (Respostas: 10; Visualizações: 1892)

  1. Fil__

    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?
     
  2. ravager

    ravager Power Member

    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?
     
  3. Fil__

    Fil__ Power Member

    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
     
  4. 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,
     
  5. Fil__

    Fil__ Power Member

    Jaimems o e.rowindex nao é reconhecido
     
  6. Fil__

    Fil__ Power Member

    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
     
  7. fLaSh_CF

    fLaSh_CF Banido

    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:
    Fica bem :)
     
    Última edição: 15 de Setembro de 2008
  8. Fil__

    Fil__ Power Member

    Jaimems existem alguns problemas nomeadamente o gajo nao gostar do grid (indica erro). Podes ajudar-me um pouco mais?

     
  9. 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.
     
  10. Fil__

    Fil__ Power Member

    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
     
  11. Está tudo igual?
     

Partilhar esta Página