none
Exibição em gridview de dados separados por ponto e virgula no banco RRS feed

  • 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
    sexta-feira, 24 de fevereiro de 2012 11:53

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
    sexta-feira, 24 de fevereiro de 2012 14:23
  • 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
    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.

    sexta-feira, 24 de fevereiro de 2012 12:29
  • 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

    sexta-feira, 24 de fevereiro de 2012 12:53
  • 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 />
                &nbsp;</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.

    sexta-feira, 24 de fevereiro de 2012 13:10
  • 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.

    sexta-feira, 24 de fevereiro de 2012 13:13
  • 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
    sexta-feira, 24 de fevereiro de 2012 13:38
  • 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.

    sexta-feira, 24 de fevereiro de 2012 13:52
  • 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
    sexta-feira, 24 de fevereiro de 2012 14:23
  • 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
    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.


    sexta-feira, 24 de fevereiro de 2012 16:09
  • Blz Paulo, vlw pela dica.
    sexta-feira, 24 de fevereiro de 2012 17:22