none
Separar Nomes RRS feed

  • Pergunta

  • Preciso separar Responsavel com seus beneficiarios de um datagridview e colocar em um textbox, consegui o seguinte código, mas o problema eu gostaria de adicionar outros campos, como por exemplo Data de nascimento.

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Adicionar colunas
            With DataGridView1
    
                .Columns.Add("CPF", "CPF")
                .Columns(0).Width = 150
                .Columns.Add("NomeResponsavel", "NomeResponsavel")
                .Columns(1).Width = 190
                .Columns.Add("NomeCrianca", "NomeCrianca")
                .Columns(2).Width = 190
    
    
    
            End With
            ' Adicionando linhas
            DataGridView1.Rows.Add(10)
    
            'Adicionando dados ao grid
            DataGridView1.Rows(0).Cells(0).Value = "02398979784"
            DataGridView1.Rows(1).Cells(0).Value = "02398979784"
            DataGridView1.Rows(2).Cells(0).Value = "02476853640"
            DataGridView1.Rows(3).Cells(0).Value = "02772956962"
            DataGridView1.Rows(4).Cells(0).Value = "03244072704"
            DataGridView1.Rows(5).Cells(0).Value = "03244072704"
            DataGridView1.Rows(6).Cells(0).Value = "03244072704"
            DataGridView1.Rows(7).Cells(0).Value = "03614306801"
            DataGridView1.Rows(8).Cells(0).Value = "04259946609"
            DataGridView1.Rows(9).Cells(0).Value = "04259946609"
            DataGridView1.Rows(10).Cells(0).Value = "05402838860"
    
    
    
            DataGridView1.Rows(0).Cells(1).Value = "Marcos Vilela"
            DataGridView1.Rows(1).Cells(1).Value = "Marcos Vilela"
            DataGridView1.Rows(2).Cells(1).Value = "Pedro Nunes"
            DataGridView1.Rows(3).Cells(1).Value = "Fernanda Macedo"
            DataGridView1.Rows(4).Cells(1).Value = "RAFAEL LIMA CAVALIERI TEIXEIRA"
            DataGridView1.Rows(5).Cells(1).Value = "RAFAEL LIMA CAVALIERI TEIXEIRA"
            DataGridView1.Rows(6).Cells(1).Value = "RAFAEL LIMA CAVALIERI TEIXEIRA"
            DataGridView1.Rows(7).Cells(1).Value = "Enrico Fauze"
            DataGridView1.Rows(8).Cells(1).Value = "Monica Chicarino"
            DataGridView1.Rows(9).Cells(1).Value = "Monica Chicarino"
            DataGridView1.Rows(10).Cells(1).Value = "GUSTAVO ZANARDI "
    
    
            DataGridView1.Rows(0).Cells(2).Value = "Fernando Vilela"
            DataGridView1.Rows(1).Cells(2).Value = "Patricia Vilela"
            DataGridView1.Rows(2).Cells(2).Value = "Rafael Nunes"
            DataGridView1.Rows(3).Cells(2).Value = "Marcela Macedo"
            DataGridView1.Rows(4).Cells(2).Value = "Vitor Cavalieri Teixeira"
            DataGridView1.Rows(5).Cells(2).Value = "Franciana Cavalieri Teixeira"
            DataGridView1.Rows(6).Cells(2).Value = "Jair Cavalieri Teixeira"
            DataGridView1.Rows(7).Cells(2).Value = "Marcos Fauze"
            DataGridView1.Rows(8).Cells(2).Value = "Greta Chicarino"
            DataGridView1.Rows(9).Cells(2).Value = "Adam Chicarino "
            DataGridView1.Rows(10).Cells(2).Value = "Olavo Zanardi"
    
    
    
    
        End Sub
    
    
        Private Class Responsavel
            Friend CPF As String
            Friend Nome As String
            Friend Beneficiarios() As String
    
            Friend Shared Function Procurar(ByRef List As System.Collections.ObjectModel.Collection(Of Responsavel), ByRef CPF As String) As Responsavel
                For Each R As Responsavel In List
                    If R.CPF = CPF Then Return R
                Next R
                Return Nothing
            End Function
    
            Friend Sub Adicionar(ByRef Beneficiario As String)
                ReDim Preserve Me.Beneficiarios(0 To Me.Beneficiarios.Length)
                Me.Beneficiarios(Me.Beneficiarios.Length - 1) = Beneficiario
            End Sub
    
            Friend Sub New(ByRef CPF As String, ByRef Nome As String, ByRef Beneficiario As String)
                Me.CPF = CPF
                Me.Nome = Nome
                Me.Beneficiarios = New String() {Beneficiario}
            End Sub
        End Class
    
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim List As New System.Collections.ObjectModel.Collection(Of Responsavel)
            For Each Row As DataGridViewRow In DataGridView1.Rows
                Dim Procurado As Responsavel = Responsavel.Procurar(List, CStr(Row.Cells(0).Value))
                If Procurado Is Nothing Then
                    List.Add(New Responsavel(CStr(Row.Cells(0).Value), CStr(Row.Cells(1).Value), CStr(Row.Cells(2).Value)))
                Else
                    Procurado.Adicionar(CStr(Row.Cells(2).Value))
                End If
            Next Row
            Dim Text As String = ""
            For Each R As Responsavel In List
                Text += "RESPONSAVEL: " + R.Nome + vbNewLine + "CPF: " + R.CPF + vbNewLine
                For Each B As String In R.Beneficiarios
                    Text += "BENEFICIARIO: " + B + vbNewLine
                Next B
            Next R
            TextBox1.Text = Text
    
        End Sub
    
    
    End Class

    No código acima esta ficando assim

    E eu precisava que ficasse assim

    terça-feira, 28 de janeiro de 2014 20:14

Respostas

  • Andreia, me perdoe. Eu digitei errado, deveria ser assim:

    Friend Sub New(ByRef CPF As String, ByRef Nome As String, ByRef BNome As String, ByRef Data As String)
                Me.CPF = CPF
                Me.Nome = Nome
                Me.Beneficiarios = New Beneficiario() {New Beneficiario(BNome, Data)}
            End Sub

    Porque acabei por digitar Nome duas vezes em seguida. Na verdade é Nome (o Responsável) e BNome (o Beneficiário).

    Erro meu... agora quanto a sua outra pergunta:

    "Só nao entendi ainda porque não poderia fazer esse mesmo procedimento (colocar uma Structure Beneficiario) se não houvesse o campo DataDeNascimento, ou seja como estava antes. "

    Bem, antes só tinhamos 1 campo (o nome do beneficiário), certo? Então, para apenas 1 campo não precisaríamos de uma structure (que ira guarda 1 string?)... foi mais simples colocar um Array de Strings. Com mais campos, ai fazemos uma Structure com os vários campos e um Array dessa Structure na classe Responsavel. No método New da Structure e no método Adicionar da classe, colocamos esses campos, como argumentos.

    • Sugerido como Resposta SammuelMiranda terça-feira, 4 de fevereiro de 2014 12:23
    • Marcado como Resposta Giovani Cr quarta-feira, 5 de fevereiro de 2014 14:15
    terça-feira, 4 de fevereiro de 2014 12:23

Todas as Respostas

  • Olá Andreia, isso é até muito simples, basta você adicionar colunas no Bloco With da Sub Form1_Load, agora para colocar na classe e preencher no texto, pode ser feito de 2 maneiras.

    Basicamente depende de onde a coluna pertence. Siga me raciocínio; se compor os dados do Beneficiário, então teremos que colocar na lista de beneficiário que está dentro do responsável (que acho que isso que você quer com Data de Nascimento), mas se for sobre o responsável, basta colocar mais uma variável na classe, alterar o método New com mais um argumento, e preencher associando a coluna.

    Como acredito que a Data de Nascimento seja do beneficiário (motivo até da sua pergunta, pois cada Beneficiário é uma String), o que vamos fazer é criar uma Estrutura (agora pode ser estrutura, antes não dava certo, como eu disse no outro tópico) e transformar a lista de beneficiários de String para esta estrutura.

    Toda vez que formos adicionar um Beneficiário, ao invés de adicionar com uma string apenas, adicionamos também a data. Vou deixar a data com String mesmo para facilitar, pois o que aparece na Grid é o que vai ser publicado no TextBox, mas você pode fazer com Date se quiser, só vai ter que usar CDate() e CStr() cada vez que for passar da Grid para a Estrutura e da Estrutura para o TextBox.

        Private Structure Beneficiario
            Friend Nome As String
            Friend Data As String
    
            Friend Sub New(ByRef Nome As String, ByRef Data As String)
                Me.Nome = Nome
                Me.Data = Data
            End Sub
        End Structure
    
        Private Class Responsavel
            Friend CPF As String
            Friend Nome As String
            Friend Beneficiarios() As Beneficiario
    
            Friend Shared Function Procurar(ByRef List As System.Collections.ObjectModel.Collection(Of Responsavel), ByRef CPF As String) As Responsavel
                For Each R As Responsavel In List
                    If R.CPF = CPF Then Return R
                Next R
                Return Nothing
            End Function
    
            Friend Sub Adicionar(ByRef Nome As String, ByRef Data As String)
                ReDim Preserve Me.Beneficiarios(0 To Me.Beneficiarios.Length)
                Me.Beneficiarios(Me.Beneficiarios.Length - 1) = New Beneficiario(Nome, Data)
            End Sub
    
            Friend Sub New(ByRef CPF As String, ByRef Nome As String, ByRef Nome As String, ByRef Data As String)
                Me.CPF = CPF
                Me.Nome = Nome
                Me.Beneficiarios = New Beneficiario() {New Beneficiario(Nome, Data)}
            End Sub
        End Class

    E então só reescrever o Button1_Click para aceitar os novos parâmetros.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim List As New System.Collections.ObjectModel.Collection(Of Responsavel)
            For Each Row As DataGridViewRow In DataGridView1.Rows
                Dim Procurado As Responsavel = Responsavel.Procurar(List, CStr(Row.Cells(0).Value))
                If Procurado Is Nothing Then
                    List.Add(New Responsavel(CStr(Row.Cells(0).Value), CStr(Row.Cells(1).Value), CStr(Row.Cells(2).Value), CStr(Row.Cells(3).Value)))
                Else
                    Procurado.Adicionar(CStr(Row.Cells(2).Value), CStr(Row.Cells(3).Value))
                End If
            Next Row
            Dim Text As String = ""
            For Each R As Responsavel In List
                Text += "RESPONSAVEL: " + R.Nome + vbNewLine + "CPF: " + R.CPF + vbNewLine
                For Each B As Beneficiario In R.Beneficiarios
                    Text += "BENEFICIARIO: " + B.Nome + B.Data + vbNewLine
                Next B
            Next R
            TextBox1.Text = Text
    
        End Sub

    PS: Note que deixando "Data" como String, eu ainda posso usar "B.Nome + B.Data" sem erro de soma. Se usar Date, lembre-se do "CStr(B.Data)" e do "CDate(Row.Cells(3).Value)".

    Outra coisa importante, apenas para diminuir seu código. No Form1_Load, quando você popula a tabela, não é necessário adicionar as 10 linhas em branco e depois popula-las; você pode adicionar direto com valores.

    Faça "DataGridView1.Rows.Add(...)" direto com os valores das colunas.

    Espero ter ajudado.

    • Sugerido como Resposta SammuelMiranda quarta-feira, 29 de janeiro de 2014 01:05
    • Marcado como Resposta Giovani Cr quinta-feira, 30 de janeiro de 2014 14:15
    • Não Marcado como Resposta AndreiaMeiga segunda-feira, 3 de fevereiro de 2014 21:14
    • Não Sugerido como Resposta SammuelMiranda terça-feira, 4 de fevereiro de 2014 12:23
    quarta-feira, 29 de janeiro de 2014 01:05
  • Obrigada Sammuel,

    Tive um pouco de dificuldade na hora em saber de onde você tirou esse B de beneficiario

    Text += "BENEFICIARIO: " + B + vbNewLine

    Agora que você fez uma Structure Beneficiario, ficou mais fácil entender, assim posso adicionar varios campos utilizando B.nomeDoCampo

    Só nao entendi ainda porque não poderia fazer esse mesmo procedimento (colocar uma Structure Beneficiario) se não houvesse o campo DataDeNascimento, ou seja como estava antes. 

    Obrigada pelas dicas de campo data extremamente valiosas

    domingo, 2 de fevereiro de 2014 21:50
  • Mas ainda esta ocorrendo um problemas devido a esta linha, esta linha de código

     Friend Sub New(ByRef CPF As String, ByRef Nome As String, ByRef Nome As String, ByRef Data As String)

    Esta duplicando o ByRef Nome. Tentei tirar mas eu erro, então coloquei outro nome tipo NomeCrianca mas deu nisso

    segunda-feira, 3 de fevereiro de 2014 21:22
  • Andreia, me perdoe. Eu digitei errado, deveria ser assim:

    Friend Sub New(ByRef CPF As String, ByRef Nome As String, ByRef BNome As String, ByRef Data As String)
                Me.CPF = CPF
                Me.Nome = Nome
                Me.Beneficiarios = New Beneficiario() {New Beneficiario(BNome, Data)}
            End Sub

    Porque acabei por digitar Nome duas vezes em seguida. Na verdade é Nome (o Responsável) e BNome (o Beneficiário).

    Erro meu... agora quanto a sua outra pergunta:

    "Só nao entendi ainda porque não poderia fazer esse mesmo procedimento (colocar uma Structure Beneficiario) se não houvesse o campo DataDeNascimento, ou seja como estava antes. "

    Bem, antes só tinhamos 1 campo (o nome do beneficiário), certo? Então, para apenas 1 campo não precisaríamos de uma structure (que ira guarda 1 string?)... foi mais simples colocar um Array de Strings. Com mais campos, ai fazemos uma Structure com os vários campos e um Array dessa Structure na classe Responsavel. No método New da Structure e no método Adicionar da classe, colocamos esses campos, como argumentos.

    • Sugerido como Resposta SammuelMiranda terça-feira, 4 de fevereiro de 2014 12:23
    • Marcado como Resposta Giovani Cr quarta-feira, 5 de fevereiro de 2014 14:15
    terça-feira, 4 de fevereiro de 2014 12:23
  • perfeito 

    obrigada

    sexta-feira, 28 de fevereiro de 2014 00:43
  • De nada.
    quinta-feira, 6 de março de 2014 11:45