Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas que ainda Persistem


Carlos Rocha

Pergunta

1) Com o código abaixo, cada vez que cliko nbo menu para abrir o formulario de clientes, eu abro uma nova instancia do formulario, ou seja, abro ele varias vezes e fica ele aberto "n" vezes. Mas, o que eu quero é que quando abero outro formuilario e o de clientes já tiver sido aberto antes, o form de Clientes fique por cima e não abra uma nova instancia:

Dim Clientes As New Clientes()
        If IsNothing(Clientes) = False Then
            Clientes.MdiParent = Me
            Clientes.Show()
        End If

2) O Primeiro formulario que abro, ainda que a propriedade windows.state esteja setado como maximized, não abre maximizado de jeito nenhum. já do segundo form aberto em diante já abre maximizado. Como resolver isso?

3) como faço para verificar uma datagridview, se não tiver nem uma linha clikada (selecionada) forçar o usuario a selecionar pelo menos 1 linha?

Um Feliz Natal a todos e um Feliz Ano Novo com Jesus Cristo no coração!

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

1) Você pode usar a instância padrão do form ao invés de sempre criar uma, algo como:

Clientes.MdiParent = Me
Clientes.Show()

3) Você pode usar as propriedades CurrentRow ou SelectedRows da DataGridView. Só vale ressaltar que a segunda só funciona se a linha estiver completamente selecionada (ou seja, todos os campos) ou com o modo de seleção que seleciona a linha toda automaticamente.

Quanto ao problema número 2 eu nunca passei por isso porque não costumo trabalhar com forms maximizados, mas depois vou dar uma olhada e te falo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, pela primeira resposta, já tentei fazer assim tamebem mas o formulario, se chamado uma segunda vez, não sobrepoe ao´último que esta sendo exibido.

Pela segunda resposta. Continuo na dúvida e..

Pela terceira resposta, tentei da forma abaixo e esta dando o seguinte erro quando entra na 1º linha.

Dim registro As DataRowView = TryCast(DGWClientes.CurrentRow.DataBoundItem, DataRowView)

É bom dizer que se trata de um form de pesquisaque se abre como diálogo e que entrega seu valor ao form que o chamou

Referência de objeto não definida para uma instância de um objeto.
Tai a segunda tentativa:
Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click
        'verifica se foi selecionado um registro no datagridivew
        Dim registro As DataRowView = TryCast(DGWClientes.CurrentRow.DataBoundItem, DataRowView)
        ' Existe algum registro selecionado? 
        If registro IsNot Nothing Then
            MsgBox("Selecione um registro!")
            DGWClientes.Focus()
            Exit Sub
        End If
...
end sub
Segue o código todo do form:
Imports MySql.Data.MySqlClient
Public Class frmClientes
    Dim accDb As New DBConnection
    Dim ped As New Pedidos
    Public registrocliente As Integer
    Dim dr As DataRow
    Dim dt As DataTable
    Dim dss As DataSet = Nothing
    Dim ds As DataSet = Nothing
    Dim tabela As String = "Clientes"
    Private Sub mostracolunas()
        DGWClientes.Columns.Item(0).HeaderText = "ID"
        DGWClientes.Columns.Item(1).HeaderText = "CPF_CNPJ"
        DGWClientes.Columns.Item(2).HeaderText = "NOME"
        DGWClientes.Columns.Item(3).HeaderText = "ENDEREÇO"
        DGWClientes.Columns.Item(4).HeaderText = "E-MAIL"
        DGWClientes.Columns.Item(5).HeaderText = "ATIVO"
        DGWClientes.Columns.Item(6).HeaderText = "DATA"
        DGWClientes.Columns.Item(7).HeaderText = "TIPO"

        DGWClientes.Columns.Item(0).Visible = False
        DGWClientes.Columns.Item(5).Visible = False
        DGWClientes.Columns.Item(6).Visible = False
        DGWClientes.Columns.Item(7).Visible = False

        DGWClientes.Columns.Item(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        DGWClientes.Columns.Item(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
        DGWClientes.Columns.Item(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
        DGWClientes.Columns.Item(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
        DGWClientes.Columns.Item(6).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
    End Sub

    Private Sub frmClientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim sql As String = "Select * from " & tabela & " where ativo='S'"
        ds = accDb.ExecuteDS(sql, tabela)
        If ds.Tables(0).Rows.Count = 0 OrElse IsDBNull(ds.Tables(0).Rows.Item(0)) Then
            Dim dialogo As New Clientes
            dialogo.ShowDialog()
            Close()
        Else
            DGWClientes.DataSource = ds.Tables(0).DefaultView
            mostracolunas()
        End If
    End Sub
    Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged
        Try
            Dim sql As String = "Select * from " & tabela & " where ativo='S' and (nome like '" & P_Nome.Text & "%' or clienteID like '" & P_Nome.Text & "%' or cast(cpf_cnpj as char) like '" & P_Nome.Text & "%')"
            dss = accDb.ExecuteDS(sql, tabela)
            DGWClientes.DataSource = dss.Tables(0).DefaultView
        Catch ex As Exception
            MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try
    End Sub

    Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click
        'verifica se foi selecionado um registro no datagridivew
        Dim registro As DataRowView = TryCast(DGWClientes.CurrentRow.DataBoundItem, DataRowView)
        ' Existe algum registro selecionado? 
        If registro IsNot Nothing Then
            MsgBox("Selecione um registro!")
            DGWClientes.Focus()
            Exit Sub
        End If
        'If DGWClientes.CurrentRow. = 0 Then
        '    MsgBox("Selecione um registro!") ' aqui, mesmo que eu selecione, ele da o msgbox do mesmo jeito
        '    DGWClientes.Focus()
        '    Exit Sub
        'End If
        If P_Nome.Text = "" Then
            If ds.Tables(0).Rows.Count = 0 Or IsDBNull(ds.Tables(0).Rows.Count) Then
                MessageBox.Show("Não existe esse registro!")
                P_Nome.Focus()
                Exit Sub
            End If
        Else
            If dss.Tables(0).Rows.Count = 0 Or IsDBNull(dss.Tables(0).Rows.Count) Then
                MessageBox.Show("Não existe esse registro!")
                P_Nome.Focus()
                Exit Sub
            End If
        End If
        Dim linha As Integer = DGWClientes.CurrentRow.Index
        registrocliente = DGWClientes.Item("clienteID", linha).Value.ToString
        DialogResult = System.Windows.Forms.DialogResult.OK
        Close()
    End Sub

    Private Sub frmClientes_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
        'permitir que a mudança de um campo para outro do formulário seja possível com o pressionamento da tecla ENTER 
        'Altere a propriedade KeyPreview do formulário para True 
        If e.KeyChar = Convert.ToChar(13) Then
            e.Handled = True
            SendKeys.Send("{TAB}")
        End If
    End Sub

    Private Sub DGWClientes_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DGWClientes.CellFormatting
        Dim d As Double
        ' Aqui vem a coluna com os dados, no meu caso é a coluna 1
        If e.ColumnIndex = 1 Then
            ' Vejo se tem algo preenchido e eu estou convertendo
            ' para Double para aplicar uma máscara numérica
            If e.Value IsNot Nothing AndAlso _
               Double.TryParse(e.Value.ToString(), d) Then
                Console.WriteLine(e.Value.ToString().Length)
                ' Se for até 11 caracteres, considero CPF
                If e.Value.ToString().Length <= 11 Then
                    e.Value = d.ToString("###'.'###'.'###-##")
                    ' De 12 a 14, CNPJ
                ElseIf e.Value.ToString().Length > 11 AndAlso _
                       e.Value.ToString().Length <= 14 Then
                    e.Value = d.ToString("##'.'###'.'###/####-##")
                End If
            End If
        End If
        If e.ColumnIndex = 11 Then
            ' Vejo se tem algo preenchido e eu estou convertendo
            ' para Double para aplicar uma máscara numérica
            If e.Value IsNot Nothing AndAlso _
               Double.TryParse(e.Value.ToString(), d) Then
                Console.WriteLine(e.Value.ToString().Length)
                ' Se for até 11 caracteres, considero CPF
                e.Value = d.ToString("(##)' '####'-'####")
            End If
        End If
    End Sub
End Class

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

  • 0

Em relação a 1ª, tente também usar o método BringToFront() depois do método Show().

Em relação a 3ª, tentou fazer:

If DGWClientes.CurrentRow IsNot Nothing then
    Dim registro As DataRowView = TryCast(DGWClientes.CurrentRow.DataBoundItem, DataRowView)

    ... 
Else
    MsgBox("Selecione um registro!")
    DGWClientes.Focus()
    Exit Sub
End If

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ok.

Brigadão.

1º e 3º Resolvcidas.

Continua a 2ª mas surgiu um detalhe que notei só agora!

Se eu quizer marcar um monte de linhas na DataGridView eu marco facilmente arrastando o mouse. Tem jeito de só conseguir selecionar uma linha só não?

Contiunua a 2ª:

2) O Primeiro formulario que abro, ainda que a propriedade windows.state esteja setado como maximized, não abre maximizado de jeito nenhum. já do segundo form aberto em diante já abre maximizado. Como resolver isso?

Se aguem souber.

Bom, já que o Natal já passou, eu desejo um Próspero 2009 para todos do forum!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...