CARREGAR DATAGRIDVIEW OOP

ADHEL 01/08/2013 15:27:10
#426896
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:


   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

KERPLUNK 01/08/2013 16:02:40
#426897
Resposta escolhida
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:

[Browsable(false)]
public string MinhaPropriedade {
get { return ... }
set { ... }
}

Isso simplesmente [Ô]esconde[Ô] essa propriedade no grid.
KERPLUNK 01/08/2013 16:29:49
#426899
Ops, malz. Coloquei o exemplo em C#. Em VB.NET ficaria:

<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.
ADHEL 01/08/2013 16:56:12
#426904
 <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.
KERPLUNK 01/08/2013 17:03:55
#426906
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.
ADHEL 02/08/2013 10:49:19
#426934
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 ?
KERPLUNK 02/08/2013 11:33:02
#426937
Mais menos assim:

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.
ADHEL 02/08/2013 15:14:31
#426947
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.

KERPLUNK 02/08/2013 15:22:54
#426949
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?
ADHEL 05/08/2013 10:35:43
#427028
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 ?
KERPLUNK 05/08/2013 11:31:06
#427031
Vamos fazer o seguinte, publique aqui a estrutura do seu banco, assim eu vejo do que você está falando...
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas