Usuário com melhor resposta
Exibição em gridview de dados separados por ponto e virgula no banco

Pergunta
-
Olá amigos!
Estou com um problema que talvez, seja de simples resolução.
tenho duas colunas de uma tabela que estão com dados separados por ';'. Já consigo puxar os dados de uma dessas colunas para um gridview por exemplo, quebrando pelo proprio ';' usando a função split().
A tabela tem 3 colunas: e preciso exibi-la da seguinte forma
Sistema | Url | Portas
Sis1 x y
Sis2 x1 y1
Sis3 x2 y2
Sendo que as colunas que estão separadas por ';' são a 'URL' e 'Portas'. eu estou criando um datatable e usando o for each e ele está ficando mais ou menos assim
sis1
x
x1
x2
(os valores x estão na coluna url mesmo mas com uma linha abaixo de sis1 ou seja, não está paralelo, é que a formatação do post não me permite manter os espaços)
pois a cada loop, acabo criando uma linha para o datatable então as informações não ficarão visualmente paralelas na tabela (e a coluna portas não está aparecendo. Podem me ajudar? como posso fazer para que isto apareça como uma tabela normal?
- Editado Ricardo Nader sexta-feira, 24 de fevereiro de 2012 11:57
Respostas
-
Segue. O aspx continua a mesma coisa.
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO; using System.Collections.Generic; using System.Data; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //Carregamento do DataSet DataRow row; DataTable tbl = new DataTable(); DataColumn column_NM_SIS = new DataColumn("NM_SIS"); tbl.Columns.Add(column_NM_SIS); DataColumn column_URLS_SIS = new DataColumn("URLS"); tbl.Columns.Add(column_URLS_SIS); DataColumn column_PORTA = new DataColumn("PORTAS"); tbl.Columns.Add(column_PORTA); row = tbl.NewRow(); row["NM_SIS"] = "Sis1"; row["URLS"] = "a1;b2;b3"; row["PORTAS"] = "p1;p2;p3"; tbl.Rows.Add(row); row = tbl.NewRow(); row["NM_SIS"] = "Sis2"; row["URLS"] = "x;x1;x2"; row["PORTAS"] = "pfasd;p456;p890"; tbl.Rows.Add(row); row = tbl.NewRow(); row["NM_SIS"] = "Sis3"; row["URLS"] = "s1;s2;s3"; row["PORTAS"] = "1p;2p;p3p"; tbl.Rows.Add(row); //Novo DataTable DataTable tblNovo = new DataTable(); DataColumn _column_NM_SIS = new DataColumn("NM_SIS"); tblNovo.Columns.Add(_column_NM_SIS); DataColumn _column_URLS= new DataColumn("URLS"); tblNovo.Columns.Add(_column_URLS); DataColumn _column_Porta = new DataColumn("Porta"); tblNovo.Columns.Add(_column_Porta); DataRow novaLinha; List<string> lstPortas = new List<string>(); List<string> lstUrls = new List<string>(); foreach(DataRow r in tbl.Rows) { string[] url = r["URLS"].ToString().Split(';'); string[] portas = r["PORTAS"].ToString().Split(';'); //levando em consideração que a quantidade de urls é igual a de portas for (int x = 0; x < url.Length;x++ ) { novaLinha = tblNovo.NewRow(); novaLinha["NM_SIS"] = r["NM_SIS"].ToString(); novaLinha["URLS"] = url[x].ToString(); novaLinha["Porta"] = portas[x].ToString(); tblNovo.Rows.Add(novaLinha); } } GridView1.DataSource = tblNovo; GridView1.DataBind(); } } }
Paulo César Viana
.NET Developer
MCC - Microsoft Community Contributor
MCP - Microsoft Certified Professional
MCTS - Microsoft Certified Technology Especialist
--
Marque as respostas e contribua para uma melhora no fórum.- Marcado como Resposta Ricardo Nader sexta-feira, 24 de fevereiro de 2012 15:52
-
Paulo, muito obrigado pela ajuda! só fiz algumas correções, por que na verdade tanto as portas poderiam ser maiores que as urls como vice-versa. Para posteriores consultas no forum, segue o resultado final.
public DataTable preencheGrid() { DataTable dt = new DataTable(); string objComm = "SELECT NM_SIS AS SISTEMA, URLS_SIS AS URL, PORTAS AS PORTAS FROM " + Request.QueryString["tbdinamica"] + "_SIS"; //"ID_SIS=" + Convert.ToInt32(Request.QueryString["id"]); string dB = "DBVULNERABILIDADES"; string Sistema = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["SISTEMA"].ToString(); string pedacosUrl = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["URL"].ToString(); string pedacosPorta = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["PORTAS"].ToString(); DataSet ds = Persistência.DAO.retornaDataSet(objComm, dB); string[] array1 = pedacosUrl.Split(new char[] { ';' }); string[] array2 = pedacosPorta.Split(new char[] { ';' }); DataColumn dc1 = new DataColumn("sistema"); DataColumn dc2 = new DataColumn("url"); DataColumn dc3 = new DataColumn("portas"); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); DataRow linha; foreach (DataRow r in ds.Tables[0].Rows) { string[] url = r["URL"].ToString().Split(';'); string[] portas = r["PORTAS"].ToString().Split(';'); int compURL = url.Length; int compPortas = portas.Length; if (compURL > compPortas) { for (int x = 0; x < compURL; x++) { linha = dt.NewRow(); linha["sistema"] = r["SISTEMA"].ToString(); linha["url"] = url[x].ToString(); if (x < compPortas) { linha["portas"] = portas[x].ToString(); } else { break; } dt.Rows.Add(linha); } } else if ((compPortas > compURL) || (compPortas == compURL)) { for (int x = 0; x < compPortas; x++) { linha = dt.NewRow(); linha["sistema"] = r["SISTEMA"].ToString(); if (x < compURL) { linha["url"] = url[x].ToString(); } else { break; } linha["portas"] = portas[x].ToString(); dt.Rows.Add(linha); } } else { Response.Write("Sem portas e Sem urls"); } }
- Marcado como Resposta Ricardo Nader sexta-feira, 24 de fevereiro de 2012 15:52
Todas as Respostas
-
Ricardo,
De onde vem os "Sis1", "Sis2" etc? Eu não estou vendo "dificuldades"... usar Generics fica ainda melhor ( vai fazer a mesma coisa).
Respondi ai que monto a estrutura aqui pra te ajudar.
Paulo César Viana
.NET Developer
MCC - Microsoft Community Contributor
MCP - Microsoft Certified Professional
MCTS - Microsoft Certified Technology Especialist
--
Marque as respostas e contribua para uma melhora no fórum. -
Olá Paulo
O método completo é esse:
DataTable dt = new DataTable(); string objComm = "SELECT NM_SIS AS SISTEMA, URLS_SIS AS URL, PORTAS AS PORTAS FROM " + Request.QueryString["tbdinamica"] + "_SIS"; //"ID_SIS=" + Convert.ToInt32(Request.QueryString["id"]); string dB = "DBVULNERABILIDADES"; string Sistema = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["SISTEMA"].ToString(); string pedacosUrl = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["URL"].ToString(); string pedacosPorta = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["PORTAS"].ToString(); string[] array1 = pedacosUrl.Split(new char[] { ';' }); string[] array2 = pedacosPorta.Split(new char[] { ';' }); DataColumn dc1 = new DataColumn("sistema"); DataColumn dc2 = new DataColumn("url"); DataColumn dc3 = new DataColumn("portas"); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); DataRow linha; dt.Rows.Add(Sistema); foreach (string n in pedacosUrl.Split(';')) { linha = dt.NewRow(); linha["Url"] = n.ToString(); foreach (string x in pedacosPorta.Split(';')) { linha["portas"] = x.ToString(); dt.Rows.Add(linha); } }
O Sis1 e Sis2 são exemplos, mas vem da mesma tabela do banco, ou seja, as três colunas estão na mesma tabela.
Acredito que não seja só um problema lógico, pois eu precisaria criar uma linha para um sistema, e fazer com que os outros campos das colunas url e porta ficassem paralelos, mas eles apresentam a tendência de ficar como se fosse uma "escada", já que para as novas inserções de url e sis, crio uma nova linha no início que atrapalha esse "emparelhamento". Não sei se estou sendo claro! rsrs
-
Ricardo,
Segue um jeito de resolver. A partir de um dataTable foi gerado outro. Fiz bem parecido com seu código para facilitar.
Resultado:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO; using System.Collections.Generic; using System.Data; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //Carregamento do DataSet DataRow row; DataTable tbl = new DataTable(); DataColumn column_NM_SIS = new DataColumn("NM_SIS"); tbl.Columns.Add(column_NM_SIS); DataColumn column_URLS_SIS = new DataColumn("URLS_SIS"); tbl.Columns.Add(column_URLS_SIS); row = tbl.NewRow(); row["NM_SIS"] = "Sis1"; row["URLS_SIS"] = "x;y"; tbl.Rows.Add(row); row = tbl.NewRow(); row["NM_SIS"] = "Sis4"; row["URLS_SIS"] = "x1;y1"; tbl.Rows.Add(row); row = tbl.NewRow(); row["NM_SIS"] = "Sis3"; row["URLS_SIS"] = "x2;y2"; tbl.Rows.Add(row); //Novo DataTable DataTable tblNovo = new DataTable(); DataColumn _column_NM_SIS = new DataColumn("NM_SIS"); tblNovo.Columns.Add(_column_NM_SIS); DataColumn _column_URLS= new DataColumn("URLS"); tblNovo.Columns.Add(_column_URLS); DataColumn _column_SIS = new DataColumn("SIS"); tblNovo.Columns.Add(_column_SIS); DataRow novaLinha; foreach(DataRow r in tbl.Rows) { string[] url_sis = r["URLS_SIS"].ToString().Split(';'); novaLinha = tblNovo.NewRow(); novaLinha["NM_SIS"] = r["NM_SIS"].ToString(); novaLinha["URLS"] = url_sis[0].ToString(); novaLinha["SIS"] = url_sis[1].ToString(); tblNovo.Rows.Add(novaLinha); } GridView1.DataSource = tblNovo; GridView1.DataBind(); } } }
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> <br /> </div> </form> </body> </html>
Paulo César Viana
.NET Developer
MCC - Microsoft Community Contributor
MCP - Microsoft Certified Professional
MCTS - Microsoft Certified Technology Especialist
--
Marque as respostas e contribua para uma melhora no fórum. -
Ricardo deixa eu entender, a coluna Sis1 vem com os valores x1;y1.
Exemplo
Sistema | Url | Portas
Sis1 x;y z
Sis2 x1;y1 z
Sis3 x2;y2 z
É MAIS OU MENOS ISSO, AI VC PRECISA SEPARAR O X DO Y DA COLUNA URL.
Caso a resposta tenha ajudado favor marcar como respondida.
-
Olá Renan, vou explicar melhor:
Paulo, o código que você me mandou está quase ok, mas no banco a tabela está assim:
Sistema | Url | Portas|
Sis1 y;y1;y2 x;x1;x2
Sis2 a;a1 b;b1
e preciso exibir :
Sistema | Url | Portas
Sis1 y x
Sis1 y1 x1
Sis1 y2 x2
Sis2 a b
Sis2 a1 b1
Tentei passar o que você fez para o meu contexto e ficou assim
public DataTable preencheGrid() { DataTable dt = new DataTable(); string objComm = "SELECT NM_SIS AS SISTEMA, URLS_SIS AS URL, PORTAS AS PORTAS FROM " + Request.QueryString["tbdinamica"] + "_SIS"; //"ID_SIS=" + Convert.ToInt32(Request.QueryString["id"]); string dB = "DBVULNERABILIDADES"; string Sistema = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["SISTEMA"].ToString(); string pedacosUrl = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["URL"].ToString(); string pedacosPorta = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["PORTAS"].ToString(); string[] array1 = pedacosUrl.Split(new char[] { ';' }); string[] array2 = pedacosPorta.Split(new char[] { ';' }); DataColumn dc1 = new DataColumn("sistema"); DataColumn dc2 = new DataColumn("url"); DataColumn dc3 = new DataColumn("portas"); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); DataRow linha; foreach (DataRow r in dt.Rows) { string[] pURL = pedacosUrl.ToString().Split(';'); string[] pPortas = pedacosPorta.ToString().Split(';'); linha = dt.NewRow(); linha["sistema"] = Sistema; linha["url"] = pURL; linha["portas"] = pPortas; }
mas desta forma ele não trás nada.
- Editado Ricardo Nader sexta-feira, 24 de fevereiro de 2012 13:44
-
Isto aí é tranquilo de resolver...
Paulo César Viana
.NET Developer
MCC - Microsoft Community Contributor
MCP - Microsoft Certified Professional
MCTS - Microsoft Certified Technology Especialist
--
Marque as respostas e contribua para uma melhora no fórum. -
Segue. O aspx continua a mesma coisa.
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO; using System.Collections.Generic; using System.Data; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //Carregamento do DataSet DataRow row; DataTable tbl = new DataTable(); DataColumn column_NM_SIS = new DataColumn("NM_SIS"); tbl.Columns.Add(column_NM_SIS); DataColumn column_URLS_SIS = new DataColumn("URLS"); tbl.Columns.Add(column_URLS_SIS); DataColumn column_PORTA = new DataColumn("PORTAS"); tbl.Columns.Add(column_PORTA); row = tbl.NewRow(); row["NM_SIS"] = "Sis1"; row["URLS"] = "a1;b2;b3"; row["PORTAS"] = "p1;p2;p3"; tbl.Rows.Add(row); row = tbl.NewRow(); row["NM_SIS"] = "Sis2"; row["URLS"] = "x;x1;x2"; row["PORTAS"] = "pfasd;p456;p890"; tbl.Rows.Add(row); row = tbl.NewRow(); row["NM_SIS"] = "Sis3"; row["URLS"] = "s1;s2;s3"; row["PORTAS"] = "1p;2p;p3p"; tbl.Rows.Add(row); //Novo DataTable DataTable tblNovo = new DataTable(); DataColumn _column_NM_SIS = new DataColumn("NM_SIS"); tblNovo.Columns.Add(_column_NM_SIS); DataColumn _column_URLS= new DataColumn("URLS"); tblNovo.Columns.Add(_column_URLS); DataColumn _column_Porta = new DataColumn("Porta"); tblNovo.Columns.Add(_column_Porta); DataRow novaLinha; List<string> lstPortas = new List<string>(); List<string> lstUrls = new List<string>(); foreach(DataRow r in tbl.Rows) { string[] url = r["URLS"].ToString().Split(';'); string[] portas = r["PORTAS"].ToString().Split(';'); //levando em consideração que a quantidade de urls é igual a de portas for (int x = 0; x < url.Length;x++ ) { novaLinha = tblNovo.NewRow(); novaLinha["NM_SIS"] = r["NM_SIS"].ToString(); novaLinha["URLS"] = url[x].ToString(); novaLinha["Porta"] = portas[x].ToString(); tblNovo.Rows.Add(novaLinha); } } GridView1.DataSource = tblNovo; GridView1.DataBind(); } } }
Paulo César Viana
.NET Developer
MCC - Microsoft Community Contributor
MCP - Microsoft Certified Professional
MCTS - Microsoft Certified Technology Especialist
--
Marque as respostas e contribua para uma melhora no fórum.- Marcado como Resposta Ricardo Nader sexta-feira, 24 de fevereiro de 2012 15:52
-
Paulo, muito obrigado pela ajuda! só fiz algumas correções, por que na verdade tanto as portas poderiam ser maiores que as urls como vice-versa. Para posteriores consultas no forum, segue o resultado final.
public DataTable preencheGrid() { DataTable dt = new DataTable(); string objComm = "SELECT NM_SIS AS SISTEMA, URLS_SIS AS URL, PORTAS AS PORTAS FROM " + Request.QueryString["tbdinamica"] + "_SIS"; //"ID_SIS=" + Convert.ToInt32(Request.QueryString["id"]); string dB = "DBVULNERABILIDADES"; string Sistema = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["SISTEMA"].ToString(); string pedacosUrl = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["URL"].ToString(); string pedacosPorta = Persistência.DAO.retornaDataSet(objComm, dB).Tables[0].Rows[0]["PORTAS"].ToString(); DataSet ds = Persistência.DAO.retornaDataSet(objComm, dB); string[] array1 = pedacosUrl.Split(new char[] { ';' }); string[] array2 = pedacosPorta.Split(new char[] { ';' }); DataColumn dc1 = new DataColumn("sistema"); DataColumn dc2 = new DataColumn("url"); DataColumn dc3 = new DataColumn("portas"); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); DataRow linha; foreach (DataRow r in ds.Tables[0].Rows) { string[] url = r["URL"].ToString().Split(';'); string[] portas = r["PORTAS"].ToString().Split(';'); int compURL = url.Length; int compPortas = portas.Length; if (compURL > compPortas) { for (int x = 0; x < compURL; x++) { linha = dt.NewRow(); linha["sistema"] = r["SISTEMA"].ToString(); linha["url"] = url[x].ToString(); if (x < compPortas) { linha["portas"] = portas[x].ToString(); } else { break; } dt.Rows.Add(linha); } } else if ((compPortas > compURL) || (compPortas == compURL)) { for (int x = 0; x < compPortas; x++) { linha = dt.NewRow(); linha["sistema"] = r["SISTEMA"].ToString(); if (x < compURL) { linha["url"] = url[x].ToString(); } else { break; } linha["portas"] = portas[x].ToString(); dt.Rows.Add(linha); } } else { Response.Write("Sem portas e Sem urls"); } }
- Marcado como Resposta Ricardo Nader sexta-feira, 24 de fevereiro de 2012 15:52
-
É isso ai. Cuidado com o Response.Write sendo utilizado desta forma. O legal é você colocar um Label e mostrar mensagens nele.
Paulo César Viana
.NET Developer
MCC - Microsoft Community Contributor
MCP - Microsoft Certified Professional
MCTS - Microsoft Certified Technology Especialist
--
Marque as respostas e contribua para uma melhora no fórum.- Editado Paulo César Viana sexta-feira, 24 de fevereiro de 2012 16:10
-