COLUNAS DINAMICAS GRIDVIEW

FELIPEDRONI 04/12/2013 09:14:28
#431731
Bom dia Galera!!!

Estou com o seguinte problema, preciso remover colunas de um GridView dinamicamente, ou seja,
Recebo uma consulta que alimenta um grid, nesta consulta tenho 3 colunas x1, x2, x3, as mesmas estão
declaradas no meu grid(ou seja ele não gera as colunas dinamicamente), com essa consulta dou um DataSource.
Agora recebo outra consulta que me traz apenas nomes de colunas, a informação que veio nesta consulta foi x1 e x3.

Não estou conseguindo excluir x1 e x2 do meu grid. Excluir do dataset não seria interessante pois tenho as colunas declaradas no grid. Vou posta o Código:


Dim ConnectionString As New SqlConnection
Dim DataSet As New DataSet

ConnectionString.ConnectionString = ConfigurationManager.AppSettings([Ô]StringConexao[Ô])
ConnectionString.Open()

Dim Command As New SqlCommand([Ô]PRINCESA_LINDA[Ô], ConnectionString)
Dim DataAdapter As New SqlDataAdapter(Command)

DataAdapter.Fill(DataSet, [Ô]PRINCESA_LINDA[Ô])

ConnectionString.Close()

Command = Nothing
Command = New SqlCommand([Ô]COLUNAS_SAIR[Ô], ConnectionString)

Dim DataSet2 As New DataSet
Dim DataAdapter2 = New SqlDataAdapter(Command)

DataAdapter2.Fill(DataSet2, [Ô]COLUNAS_SAIR[Ô])

Me.gvwLista.DataSource = DataSet

For Each Linhas As DataRow In DataSet2.Tables(0).Rows

[ô]AKI ESTA O PROBLEMA
Me.gvwLista.Columns.Remove(Linhas.Table(0).Coluns)

Next

Me.gvwLista.DataBind()

End Sub

Agradeço desde já!!

KERPLUNK 04/12/2013 10:29:59
#431737
Use OOP e todos esses problemas desaparecem
FELIPEDRONI 05/12/2013 13:01:57
#431806
Isso ainda não me ajuda, pois todo o resto do do sistema não esta orientado :S
OCELOT 05/12/2013 13:37:44
#431808
Resposta escolhida
Eu diria que usar OOP não tem nada a ver com a dúvida, já que a dúvida é basicamente de como esconder colunas de um GridView dinamicamente.

O problema aqui é o seguinte:

Me.gvwLista.Columns.Remove(Linhas.Table(0).Coluns)

Ai você esta mandando remover uma coluna que não faz parte do gridview, veja que o Columns do gvwLista e uma collection de colunas, e para remover ela você tem que passar um dos itens dela mesmo para o método Remove, porém você está passando uma coluna de um datatable que nada tem a ver com a história

Então se no DataSet2 você tem o nome das colunas que devem ser excluidas deveria ficar algo do tipo, considerando que no DataSet2 você tem apenas 1 campo no DataTable e ele é do tipo Texto

Me.gvwLista.Columns.Remove(Me.gvwLista.Columns(DirectCast(Linha(0), String)))
FELIPEDRONI 06/12/2013 11:37:23
#431863
Bom dia OCELOT!

Então fiz o teste, no momento de remover a coluna ele da um erro
falando que não pode converter uma string em inteiro.

Conversion from string [Ô]Id_Operacao[Ô] to type [ô]Integer[ô] is not valid.

Alguma idéia?!
OCELOT 06/12/2013 12:00:57
#431864
Hum, não percebi que era ASP.Net e dei a resposta como sendo do Windows Forms, no ASP.Net a lógica é a mesma, mas a forma de fazer um pouco diferente

Considerando que suas colunas sejam do tipo BoundField focê vai ter que encontrar a correta antes de remover, pois no ASP.Net não da para pegar a coluna pelo nome do campo diretamente já que as colunas não precisam ser ligadas a um campo, então o jeito é fazer um loop em todas as colunas do grid verificando se é um BoundField e então verificando se o nome do campo é o mesmo que veio no resultado da consulta, se sim remove ele, ou para simplificar pode-se usar Linq para fazer isso

gvwLista.Columns.Remove((From c As DataControlField In gvwLista.Columns Let bf As BoundField = TryCast(c, BoundField) Where bf IsNot Nothing AndAlso bf.DataField = DirectCast(Linha(0), String) Select c).Single())
FELIPEDRONI 06/12/2013 13:26:09
#431872
Opa Vlw OCELOT!!

Funcionou direitinho, mas você poderia explicar oque fez aqui:

From c As DataControlField In gvwLista.Columns Let bf As BoundField = TryCast(c, BoundField) Where bf IsNot Nothing AndAlso bf.DataField = DirectCast(Linha(0), String) Select c).Single()

Para melhor entendikento do código!

Para ajudar [Ô]Futuras gerações[Ô], e código inteiro ficou assim:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim ConnectionString As New SqlConnection
Dim DataSet As New DataSet

ConnectionString.ConnectionString = ConfigurationManager.AppSettings([Ô]StringConexao[Ô])
ConnectionString.Open()

Dim Command As New SqlCommand([Ô]POPULA_GRID[Ô], ConnectionString)
Dim DataAdapter As New SqlDataAdapter(Command)

DataAdapter.Fill(DataSet, [Ô]POPULA_GRID[Ô])

ConnectionString.Close()

Command = Nothing
Command = New SqlCommand([Ô]COLUNAS_SAIR[Ô], ConnectionString)

Dim DataSet2 As New DataSet
Dim DataAdapter2 = New SqlDataAdapter(Command)

DataAdapter2.Fill(DataSet2, [Ô]COLUNAS_SAIR[Ô])

Me.gvwLista.DataSource = DataSet

For Each NomeColuna As DataRow In DataSet2.Tables(0).Rows

gvwLista.Columns.Remove((From obj_DataControlField As DataControlField In gvwLista.Columns Let obj_BoundField As BoundField = TryCast(obj_DataControlField, BoundField) Where obj_BoundField IsNot Nothing AndAlso obj_BoundField.DataField = DirectCast(NomeColuna(0), String) Select obj_DataControlField).Single())

Next

Me.gvwLista.DataBind()

End Sub

ASP:

<body>
<form id=[Ô]form1[Ô] runat=[Ô]server[Ô]>

<asp:GridView ID=[Ô]gvwLista[Ô] runat=[Ô]server[Ô] AutoGenerateColumns=[Ô]false[Ô]>
<Columns>
<asp:BoundField HeaderText=[Ô]Id_Operacao[Ô] DataField=[Ô]Id_Operacao[Ô]></asp:BoundField>
<asp:BoundField HeaderText=[Ô]Id_Cliente[Ô] DataField=[Ô]Id_Cliente[Ô]></asp:BoundField>
<asp:BoundField HeaderText=[Ô]Id_Modulo[Ô] DataField=[Ô]Id_Modulo[Ô]></asp:BoundField>
<asp:BoundField HeaderText=[Ô]Nm_Operacao[Ô] DataField=[Ô]Nm_Operacao[Ô]></asp:BoundField>
</Columns>
</asp:GridView>

</form>
</body>

Tópico encerrado , respostas não são mais permitidas