CARREGAR DATAGRIDVIEW OOP
Pessoal
Segue a saga OOP.
Depois de conseguir gravar com OOP.
Agora a meta é carregar um DataGridView.
Lendo aqui ,vi muito sobre List(of).Confesso que gostei do que li(Principalmente no tópico de C# - Orientação a
Objetos - Conceito)
Tentei implantar à minha necessidade.
Consegui carregar o DataGridView.Só que no carregamento apresenta todos os campos da tabela, embora eu tivesse selecionado apenas alguns.
Gostaria que somente apresentasse os campos selecionados.
Segue o código utilizado.
Na classe Funcionario:
No Form
Segue a saga OOP.
Depois de conseguir gravar com OOP.
Agora a meta é carregar um DataGridView.
Lendo aqui ,vi muito sobre List(of).Confesso que gostei do que li(Principalmente no tópico de C# - Orientação a
Objetos - Conceito)
Tentei implantar à minha necessidade.
Consegui carregar o DataGridView.Só que no carregamento apresenta todos os campos da tabela, embora eu tivesse selecionado apenas alguns.
Gostaria que somente apresentasse os campos selecionados.
Segue o código utilizado.
Na classe Funcionario:
Public Function carregarLista() As List(Of Funcionario)
Dim lista As New List(Of Funcionario)
Try
c.conOpen()
Dim sql As String = [Ô]select nome,cidade,cargo,salario from funcionarios[Ô]
c.cmd = New MySqlCommand(sql, c.cnn)
Dim leitor As MySqlDataReader = c.cmd.ExecuteReader()
If leitor.HasRows Then
While leitor.Read()
Dim func As New Funcionario()
With func
.Nome = leitor([Ô]Nome[Ô]).ToString()
.Cidade = leitor([Ô]cidade[Ô]).ToString()
.Cargo = leitor([Ô]cargo[Ô]).ToString()
.Salario = Convert.ToDouble(leitor([Ô]salario[Ô]))
End With
lista.Add(func)
End While
End If
Return lista
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
c.conClose()
End Try
End Function
No Form
Public Class Form2
Dim func As New Funcionario
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CarregaDataGrid()
End Sub
Private Sub CarregaDataGrid()
dgv.DataSource = func.carregarLista().OrderBy(Function(x) x.Nome).ToList()
End Sub
End Class
Tem várias maneiras de se fazer o que você quer, a que acho mais [Ô]elegante[Ô] é o uso de Attributos. Como por exemplo o Attributo Browsable:
Isso simplesmente [Ô]esconde[Ô] essa propriedade no grid.
[Browsable(false)]
public string MinhaPropriedade {
get { return ... }
set { ... }
}
Isso simplesmente [Ô]esconde[Ô] essa propriedade no grid.
Ops, malz. Coloquei o exemplo em C#. Em VB.NET ficaria:
Reparem que decorei a propriedade também com o atributo [Ô]DisplayName[Ô], que é o nome que vai ser exibido no cabeçalho do grid.
<Browsable(False)> _
<DisplayName([Ô]Nome para exibir no grid[Ô])> _
Public Property MinhaPropriedade() As String
Get
Return m_MinhaPropriedade
End Get
Set
m_MinhaPropriedade = Value
End Set
End Property
Private m_MinhaPropriedade As String
Reparem que decorei a propriedade também com o atributo [Ô]DisplayName[Ô], que é o nome que vai ser exibido no cabeçalho do grid.
<Browsable(False)> _
<DisplayName([Ô]Nome para exibir no grid[Ô])> _
Public Property MinhaPropriedade() As String
Get
Return m_MinhaPropriedade
End Get
Set
m_MinhaPropriedade = Value
End Set
End Property
Private m_MinhaPropriedade As String
Estou tentando entender primeiramente isso.
Isso serve apenas para esconder ,seria como um dgv.column([Ô][Ô]).visible = false ?
Agora imagina se eu precisar carregar um datagridview com as vendas do dia.
Já aà temos duas tabelas.A tabela de Clientes mais a tabela de Vendas.
Digamos que eu precisasse apresentar apenas esses campos DATA,PEDIDO,CLIENTE,TIPO_PAGAMENTO,TOTAL.
Por baixo teria que esconder uns dez campos.
E quando temos que relacionar mais de duas tabelas, imagine quantos campos teremos que ocultar.
é isso mesmo em OOP ?
Se tiver outro jeito de carregar o datagridview eu aceito, talvez desse jeito que eu fiz não seja o melhor.
até mais.
Sim, é isso mesmo. Se a classe vai ter muitos campos e a maioria deles não vai aparecer para o usuário, considere remodelar a sua classe, pois é muito possÃvel que tenha algo errado na sua modelagem.
Citação::
Sim, é isso mesmo. Se a classe vai ter muitos campos e a maioria deles não vai aparecer para o usuário, considere remodelar a sua classe, pois é muito possÃvel que tenha algo errado na sua modelagem.
Ok, vou remodelar seguindo sua recomendação.
Outra dúvida é em relação como são apresentadas as colunas no DataGridView.Na sql.
sql = [Ô]select nome,cidade,cargo,salario from funcionarios[Ô]
No form.
Private Sub CarregaDataGrid()
dgv.DataSource = func.carregarLista().OrderBy(Function(x) x.Nome).ToList()
End Sub
E na tela aparece assim
Cargo| Salario | Nome | Cidade
Por ordem de criação no banco de dados.
ID,Nome,Cidade,Cpf,Cargo e Salario.
Como eu poderia ordenar pelo modo que eu preciso ?
Mais menos assim:
Esquece isso acima, não vai dar certo... estou errado, para fazer dessa maneira teria que trabalhar com tipo anônimo e fazer cast.
Uma alternativa para fazer isso seria esta aqui
Mas eu preferiria realmente criar um tipo anônimo, mas isso é um pouco mais avançado e seria melhor entender esse básico antes.
dgv.DataSource = func.carregarLista().OrderBy(Function(x) x.Nome).ToList().Select(x => x.Nome, x.Cidade, x.Cargo, x.Salario).ToList()
Esquece isso acima, não vai dar certo... estou errado, para fazer dessa maneira teria que trabalhar com tipo anônimo e fazer cast.
Uma alternativa para fazer isso seria esta aqui
Mas eu preferiria realmente criar um tipo anônimo, mas isso é um pouco mais avançado e seria melhor entender esse básico antes.
A primeira opção como você mesmo colocou, não deu certo.
Estava procurando [Ô]Por ordenar colunas do DataGridView carregadas por list[Ô].
Até ler que você descartou a idéia.
A segunda opção é para criar um atributo personalizado, não consegui colocar em prática.
E momentaneamente é melhor deixar em stand by essa opção.
O que percebi é que a ordem que é apresentada no DataGridView é a ordem que eu crio as propriedades da classe e depois as propriedades que herdei.
E como herdei Nome e Cidade da classe Pessoa fica assim:
Cargo| Salario | Nome | Cidade
Tudo incide em herança.Maldita herança(brincadeira)
Seguindo as boas práticas(Imagino que você não aguenta mais essas palavras nos meus tópicos)
1) Eu herdo essas propriedades da classe Pessoa e fim de papo, OOP é assim mesmo e eu tenho que me enquadrar sumariamente reaproveitando as propriedades da super classe nas classes especializadas .
OU
2) Não herdo e crio essas propriedades na classe Funcionario, propriedades que poderiam/seriam também herdadas na classe Cliente futuramente.
Outra questão : Até que ponto o não reuso das propriedades é inadequado ?
Bom, as cartas são essas, e estão na mesa.
Estava procurando [Ô]Por ordenar colunas do DataGridView carregadas por list[Ô].
Até ler que você descartou a idéia.
A segunda opção é para criar um atributo personalizado, não consegui colocar em prática.
E momentaneamente é melhor deixar em stand by essa opção.
O que percebi é que a ordem que é apresentada no DataGridView é a ordem que eu crio as propriedades da classe e depois as propriedades que herdei.
E como herdei Nome e Cidade da classe Pessoa fica assim:
Cargo| Salario | Nome | Cidade
Tudo incide em herança.Maldita herança(brincadeira)
Seguindo as boas práticas(Imagino que você não aguenta mais essas palavras nos meus tópicos)
1) Eu herdo essas propriedades da classe Pessoa e fim de papo, OOP é assim mesmo e eu tenho que me enquadrar sumariamente reaproveitando as propriedades da super classe nas classes especializadas .
OU
2) Não herdo e crio essas propriedades na classe Funcionario, propriedades que poderiam/seriam também herdadas na classe Cliente futuramente.
Outra questão : Até que ponto o não reuso das propriedades é inadequado ?
Bom, as cartas são essas, e estão na mesa.
1 - Com OOP, praticamente nada é [Ô]fim de papo[Ô], sempre tem um jeito.
2 - Aà é que está, ao invés de herdar, usar interfaces.
Quanto ao que não conseguiu implementar da sugestão, o que deu errado? Algum erro?
2 - Aà é que está, ao invés de herdar, usar interfaces.
Quanto ao que não conseguiu implementar da sugestão, o que deu errado? Algum erro?
Citação:1 - Com OOP, praticamente nada é [Ô]fim de papo[Ô], sempre tem um jeito.
Ok.
Citação:2 - Aà é que está, ao invés de herdar, usar interfaces.
Comecei a ler sobre esse assunto.
Citação:Quanto ao que não conseguiu implementar da sugestão, o que deu errado? Algum erro?
Total falta de conhecimento, não soube nem iniciar e ainda prefiro manter em stand by.
Em um tópico do Luis Herrera chamado DUVIDA OOP CAMADAS, ele comenta sobre criação de várias classes.
Em determinado trecho diz.
Citação:[Ô]Será que isso é um [Ô]Erro[Ô] pois escrever a mesma classe 30 vezes só para ter uma com o nome de cada tabela não me parece bem OOP. [Ô]
Exatamente o meu pensamento até aqui, por isso herdava algumas propriedades da classe Pessoa.
E você respondeu.
Citação:Ao contrário, é EXATAMENTE isso que se trata a OOP. No caso atual, você está usando o seu pequeno Framework(suas classes DAL, conexão...) para o SEU aplicativo...
Como dito estou iniciando a leitura sobre Interface, ainda não consigo enxergar os desdobramentos ,então resolvi criar somente classes especializadas.
Com isso resolvo a questão da ordem que são apresentadas as colunas no DataGridView e também todas as variáveis da classe ficam como Private.
Enfim, meu raciocÃnio está certo? Posso prosseguir ?
Vamos fazer o seguinte, publique aqui a estrutura do seu banco, assim eu vejo do que você está falando...
Tópico encerrado , respostas não são mais permitidas