COLUNAS DINAMICAS GRIDVIEW
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á!!
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á!!
Use OOP e todos esses problemas desaparecem
Isso ainda não me ajuda, pois todo o resto do do sistema não esta orientado :S
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)))
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)))
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?!
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?!
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())
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())
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>
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