none
Manipulando um DataTable em RealTime RRS feed

  • Pergunta

  • boa tarde,

    Tenho uma stored procedure que retorna os seguintes dados

    boolPiscina | boolChurrasqueira | boolEdicula
        1                        0                         1

    no asp.net C#

    estou criando um report que utiliza um DataTable, porém não quero mostrar 1, 0, 1 quero mostrar

    "Detalhes: Piscina, Edicula, etc"

    ou seja se for true, mostro a palavra.

    Pensei em alterar o DataTable criando uma nova Coluna chamada Resumo, porém como faço a verificação do tipo

    // o objeto dt, representa meu DataTable

    if((bool)dt["boolPiscina"] = true) { txt.Append("Piscina"); //StringBuilder } //criei uma nova coluna, e agora adiciono o registro newRow["Resumo"] = txt.ToString();


    porém no código acima ele estaria mudando para todas os registros do dataTable?

    até consigo fazer direto no ms sql, na storedprocedure porém não quero embutir a lógica lá.


    • Editado ASPX_BR sexta-feira, 7 de fevereiro de 2014 14:04 melhorando o título
    quinta-feira, 6 de fevereiro de 2014 14:30

Todas as Respostas

  • Ola Leonardo,

        Tanto os DataTables como os DataRows são declarado como uma classe "partial", isso é, você pode em outro arquivo .cs continuar a implementação dela, criando propriedades e métodos, de forma que a ferramenta de geração automática não interferia nos métodos customizados...

        A maneira mais fácil é dando um clique duplo no datatable, nisso já vai abrir um arquivo .cs pronto para você implementar as suas propriedades... basta declara o seu TableRow e criar as propriedades que você desejar...

        Por exemplo:

    namespace WindowsFormsApplication1 {        
        public partial class DataSet1 {
            partial class SeuDataTableDataTable {
            }
    
            partial class SeuDataTableRow {
                public string stringPiscina {
                    get { return boolPiscina ? "Piscina" : string.Empty; }
                    set { boolPiscina = value.Equals("Piscina"); } 
                }
            }
        }    
    }
    


    Microsoft Community Contributor

    quinta-feira, 6 de fevereiro de 2014 18:15
    Moderador
  • Entendi + ou -...desculpe...

    por exemplo:

    você escreveu:

     get { return boolPiscina ? 

    boolPiscina é um campo do meu database, nessa classe que você criou eu terei que definir como:
    public bool boolPiscina { get; set; }

    ??? ou ele entenderá que é um campo do meu DataTable, se sim como ele entenderá? onde esta o vínculo ?Segue idéia do código:

    private void CriaDataTable() { DataTable dt = new DataTable("ListagemImoveis"); dt.Load(QDR.ExecuteSTP("stp_Admin14_listagem_impressao", cmd.Parameters));

    DataColumn workCol = dt.Columns.Add("ResumoCol", typeof(String), SeuDataTableRow.stringPiscina);

    }

    partial class SeuDataTableDataTable { } //modifiquei para static!! partial class SeuDataTableRow { public static bool boolPiscina { get; set; } public static string stringPiscina { get { return boolPiscina ? "Piscina" : string.Empty; } set { boolPiscina = value.Equals("Piscina"); } } }

    Agradeço a atenção despendida no fórum,abraços
    • Editado ASPX_BR sexta-feira, 7 de fevereiro de 2014 14:30
    sexta-feira, 7 de fevereiro de 2014 14:14
  • Então, para entender melhor, voce primeiro tem que conhecer o conceito de classes parciais...

    (http://msdn.microsoft.com/pt-br/library/wa80x488.aspx)

    Resumindo... se voce tem uma classe gerada automaticamente pelo Visual Studio, ele cria essa classe com o atributo partial. Que significa que voce pode continuar implementado essa classe em um outro arquivo .cs, dessa forma se o aplicativo alterar o codigo fonte, nao altera o que voce implementar...


    Então a classe "SeuDataTableRow" no caso é o nome do DataTableRow do seu DataTable (ah para funcionar a classe partial tem que estar no mesmo namespace). é como seu eu tivesse continuando a classe, só que em arquivos separados... entao voce ja tem o campo boolPiscina.. so prescisa implementar a propriedade stringPiscina

    Mas isso funciona com Datasets Tipados, se voce vai usar um Dataset Generico ai complica....

    Sobre dataset tipado, da uma olhada...

    http://www.macoratti.net/09/06/c_adn_6.htm


    Microsoft Community Contributor

    sexta-feira, 7 de fevereiro de 2014 14:36
    Moderador
  • Como ficaria com dataset tipado (a nomenclatura é so exemplo):

    namespace WindowsFormsApplication1 {        
        public partial class DataSet1 {
            partial class ListagemImoveisDataTable {            
            }
    
            partial class ListagemImoveisRow {
                public string stringPiscina {
                    get { return boolPiscina ? "Piscina" : string.Empty; }
                    set { boolPiscina = value.Equals("Piscina"); } 
                }
    
                public string stringEdicula {
                    get { return boolEdicula ? "Edicula" : string.Empty; }
                    set { boolEdicula = value.Equals("Edicula"); }
                }
            }
        }    
    }
    
    
    private void CriaDataTable() {
        DataSet1.ListagemImoveisDataTable dt = new DataSet1.ListagemImoveisDataTable();
        dt.Load(QDR.ExecuteSTP("stp_Admin14_listagem_impressao", cmd.Parameters));
    
        var piscina = (dt.Rows[0] as DataSet1.ListagemImoveisRow).stringPiscina;
    }
    


    Microsoft Community Contributor


    sexta-feira, 7 de fevereiro de 2014 14:45
    Moderador
  • Agora começo entender melhor..ainda vou ler sobre a classe partial, agradeço pelo link.

    Porém não estou criando um DataSet (XSD) e sim um DataTable via code behind. então como vou continuar a classe se ela não existe?.

    Ok, posso criar o DataSet porém não era minha idéia..mas acho que será mais fácil...com a sua solução.

    sexta-feira, 7 de fevereiro de 2014 16:54
  • Outra forma seria trabalhar com heranca, criando um objeto filho de DataSet, mas ai da menos trabalho usar dataset tipado...

    Mas voce pode criar uma classe que carregar as propriedade do dataset, que é mais simples... isso tem um nome... não lembro agora.. era algo tipo Factory, essas coisas... enfim...

    Um exemplo:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    
    namespace WindowsFormsApplication1 {
        public class Imoveis {
            public static IEnumerable<Imoveis> List(IDataReader reader) {
                var table = new DataTable("ListaImoveis");
                table.Load(reader);
    
                return table.Rows.OfType<DataRow>().Select(row => new Imoveis(row));
            }
    
            private readonly DataRow source;
    
            public string Piscina {
                get {
                    if (source == null) return null;
                    return Object.ReferenceEquals(source["boolPiscina"], true) ? "Piscina" : String.Empty; 
                }
            }
    
            public string Edicula {
                get {
                    if (source == null) return null;
                    return Object.ReferenceEquals(source["boolEdicula"], true) ? "Piscina" : String.Empty; 
                }
            }
    
            public Imoveis(DataRow row) {
                this.source = row;
            }
        }
    }
    


    Microsoft Community Contributor

    sexta-feira, 7 de fevereiro de 2014 17:25
    Moderador