1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

array to dataset asp.net c#

Discussão em 'Web Development' iniciada por alfinete, 9 de Março de 2008. (Respostas: 15; Visualizações: 4954)

  1. alfinete

    alfinete Power Member

    Código:
    
      string[] teste = new string[2];
    
    
                teste[0] = txttexto.Text;
                teste[1] = txtrua.Text;  
    
    
                DataTable dt = new DataTable("teste");
    
                DataColumn nome = new DataColumn("nome");
                nome.DataType = System.Type.GetType("System.String");
                dt.Columns.Add(nome);
    
                DataColumn rua = new DataColumn("rua");
                rua.DataType = System.Type.GetType("System.String");
                dt.Columns.Add(rua);
    
                DataRow R ;
                R = dt.NewRow();
                R["Nome"] = teste[0];
                R["rua"] = teste[1];
                dt.Rows.Add(R);
          
    
                DataSet ds = new DataSet ();
                ds = new DataSet();
                ds.Tables.Add(dt);
    
    
               this.gvteste.DataSource = ds.Tables["teste"];
               gvteste.DataBind();
    
    
    tenho este code que funciona perfeitamente a inserir dados de um array num dataset
    e depois numa grid

    mas ai inserir o segundo reg ele poe sempre por cima do primeiro, ou seja por mais regs que insira ele põe sempre o ultimo inserido, e eu quero-os ver tdos

    não sei pq

    estou em asp.net c#
     
    Última edição: 9 de Março de 2008
  2. p3dro

    p3dro Power Member

    Esse código está sempre a reescrever a 1ª posição porque não guardas o estado, cada vez que fazes 1 postback estás sempre a redefinir os objectos.
    Uma possivel solução para guardares o estado entre postbacks é usares a Session. Não sei até que ponto é uma solução escalável, porque se tiveres muitos utilizadores em simultaneo poderá tornar-se complicado os recursos do servidor. Mas tens outras soluções, guardar numa tabela auxiliar; num xml, etc.

    Tenta ver se este exemplo, usando a Session, te ajuda em alguma coisa:

    PHP:
    public partial class Default : System.Web.UI.Page {
        
    DataTable dt;
        const 
    string mySessionDataTableName "MyPersistentDataTable";

        protected 
    void Page_Load(object senderEventArgs e) {
            if (!
    IsPostBack) {
                
    dt = new DataTable(mySessionDataTableName);
                
    Session[mySessionDataTableName] = dt//guardar datatable

                
    DataColumn nome = new DataColumn("nome");
                
    nome.DataType System.Type.GetType("System.String");
                
    dt.Columns.Add(nome);

                
    DataColumn rua = new DataColumn("rua");
                
    rua.DataType System.Type.GetType("System.String");
                
    dt.Columns.Add(rua);
            }
        }

        protected 
    void BtAddRecord_Click(object senderEventArgs e) {
            
    dt = (DataTable)Session[mySessionDataTableName]; //obter datatable

            
    DataRow row;
            
    row dt.NewRow();
            
    row["nome"] = txttexto.Text;
            
    row["rua"] = txtrua.Text;
            
    dt.Rows.Add(row);

            
    this.gvteste.DataSource dt;
            
    gvteste.DataBind();

            
    Session[mySessionDataTableName] = dt//guardar datatable
        
    }
    }
     
    Última edição: 11 de Março de 2008
  3. alfinete

    alfinete Power Member

    thanks ja bombex

    Código:
            #region objectos
    
            DataTable dt;
            const string sessaotabela = "teste";
            protected string tabela = "";
            #endregion
    
            protected void Page_Load(object sender, EventArgs e)
            {
    
                if (!IsPostBack)
                {
                    dt = new DataTable(sessaotabela);
                    Session[sessaotabela] = dt; //guardar datatable
    
                    DataColumn nome = new DataColumn("nome");
                    nome.DataType = System.Type.GetType("System.String");
                    dt.Columns.Add(nome);
    
                    DataColumn rua = new DataColumn("rua");
                    rua.DataType = System.Type.GetType("System.String");
                    dt.Columns.Add(rua);
                }
            }
    
            protected void btnteste_Click(object sender, EventArgs e)
            {
             load_grid();
    
            }
    
            private void load_grid()
            {
    
              pageTable(dt);
               
            }
    
            private string paginaDados(DataTable dt)
            {
    
                dt = (DataTable)Session[sessaotabela]; //obter datatable
                DataRow row;
                row = dt.NewRow();
                row["nome"] = txttexto.Text;
                row["rua"] = txtrua.Text;
                dt.Rows.Add(row);
                Session[sessaotabela] = dt;
                string str = "";
                string work = "";
                       
    
                foreach (DataRow dr in dt.Rows)
                {
                           
                    work = "<tr>";
                    work += "<td class=\"tdr1\">";
                    work += row["nome"] + "</td>";
                    work += "<td class=\"tdr2\">";
                    work += row["rua"] + "</td>";
                    work += "</tr>";
                    str += work;
                    
                   
                }
               
                return str;
                
            }
    
    
            private void pageTable(DataTable dt)
            {
                string str = "";
    
                str = "<table id=\"tblPaging\" border=\"1\" cellspacing=\"0\" rules=\"all\" class=\"tabela_estilo\" summary=\"Várias habilatações já introduzidas.\">";
                str += "<tr class=\"gvHeader\"><th scope=\"col\">Nome</th><th scope=\"col\">Rua</th>";
                str += "</tr>";
                str += paginaDados(dt);
                str += "</table>";
               
                tabela = str;
            }
    
    
    tentei adaptar o codigo anterior a uma grid feita a pata , mas tenho um prob

    ele vaoi inserindo os registos

    mas do tipo:

    1º reg insiso alf e pero - insere ficando em primeiro o memo
    2º reg insiro ped e perp - ficamdo os dois registos com esta str

    ou seja aumenta o numero de registos tdos com o conteudo da ultima insersão

    classes css da formatação da tabela

    Código:
    
    #tblPaging .tdr1
    {
        width: 50px;
        height: 22px;
        padding-left: 3px;
        text-align:left;
    }
    
    /* tamanho da  segunda coluna da grid*/ 
    #tblPaging .tdr2
    {
        width: 146px;
        height: 22px;
        padding-left: 3px;
        
        text-align:left;
    }
    
    #tblPaging
    {
        margin-top: 5px;
        margin-left: 20px;
        margin-bottom: 5px;
        font-size:xx-small ;
    }
    
    .tabela_estilo
    {
        border-collapse:collapse;
        width:850px;
    }
    
    .gvHeader
     {
        font-family: Arial;
        font-size: 12px;
        font-weight: bold;
        
        background-color: #C09E65;
        height: 20px;
        color: #ffffff;
    }
    
    
    
    /*formatação da paginação dos registos na grid*/
    .item_grid_paging
    {
        
        width: 850px;
        height: 310px;
        float: left
    }
    
    
    
    chamada da tabela em asp

    Código:
    
      <div class="item_grid_paging">
                <%= tabela %>
            </div>
    
    
    gostava de um help

    ja descobri o prob

    em vez de row["nome"] e row["rua"] fasso

    dr["nome"] e dr["rua"]
     
    Última edição pelo moderador: 16 de Março de 2008
  4. alfinete

    alfinete Power Member

    quanto ao code que o p3dro enviou funciona bem, so tem um prob se inserir um registo ele insere bem, mas se fizer f5 ele insere outro igual


    como resolvet o prob

    agradecia
     
  5. SkylineGTR

    SkylineGTR Power Member

    Ao usares o F5 fazes um refresh à página, o que vai carregar novamente essa página, não sendo portanto um postback. Sendo assim, o que tens no evento Page_Load vai ser sempre executado ao carregares no F5. Daí, não convém inserires algo na BD a partir do evento Page_Load. E se inserires, reencaminha logo o utilizador para outra página.
     
  6. alfinete

    alfinete Power Member

    o prob é que isto so vai gravar os dados da tabela quando tiverem tdos inseridos
     
  7. p3dro

    p3dro Power Member

    Pois, o problema no F5 é que vai re-submeter o formulário com os mesmo valores.

    Por ex. se estiveres a fazer 1 registo numa página e tiveres sempre a fazer refresh estás sempre a criar registos, o programador terá de contornar isso verificando se aquele registo já foi inserido, usando por ex. alguns campos de procura, tais como: e-mail, username, etc;
    Como o SkylineGTR disse e bem, redireccionando para outra página para evitar que o refresh submeta novamente as variáveis do formulário.

    No teu caso penso que terás de fazer isso também. Se por ex. a gridview não poder ter registos repetidos o que poderás fazer é verificar antes de inserires o registo, se a DataTable já tem esse registo.

    Vê se isto te ajuda em alguma coisa

    PHP:
    public partial class _Default System.Web.UI.Page {
        
    DataTable dt;
        const 
    string mySessionDataTableName "MyPersistentDataTable";

        protected 
    void Page_Load(object senderEventArgs e) {
            if (!
    IsPostBack) {
                
    dt = new DataTable(mySessionDataTableName);
                
    Session[mySessionDataTableName] = dt//guardar datatable

                
    DataColumn nome = new DataColumn("nome");
                
    nome.DataType System.Type.GetType("System.String");
                
    dt.Columns.Add(nome);

                
    DataColumn rua = new DataColumn("rua");
                
    rua.DataType System.Type.GetType("System.String");
                
    dt.Columns.Add(rua);
            }
        }
        protected 
    void Button1_Click(object senderEventArgs e) {
            
    dt = (DataTable)Session[mySessionDataTableName]; //obter datatable

            
    if (!RecordExists(txttexto.Texttxtrua.Text)) {
                
    DataRow row;
                
    row dt.NewRow();
                
    row["nome"] = txttexto.Text;
                
    row["rua"] = txtrua.Text;
                
    dt.Rows.Add(row);
            }

            
    this.gvteste.DataSource dt;
            
    gvteste.DataBind();
            
    Session[mySessionDataTableName] = dt//guardar datatable

        
    }

        private 
    Boolean RecordExists(string nomestring rua) {
            
    bool result false;
            foreach (
    DataRow row in dt.Rows) {
                if (
    row["nome"].Equals(nome) && row["rua"].Equals(rua)) {
                    
    result true;
                    break;
                }
            }
            return 
    result;
        }
    }
     
  8. alfinete

    alfinete Power Member

    eu puz assim


    Código:
    
        private string paginaDados(DataTable dt)
            {
    
                dt = (DataTable)Session[sessaotabela]; //obter datatable
                string str = "";
                string work = "";
                if (!RecordExists(txttexto.Text, txtrua.Text))
                {
                
                    row = dt.NewRow();
                    row["nome"] = txttexto.Text;
                    row["rua"] = txtrua.Text;
    
                    dt.Rows.Add(row);
    
    
                    foreach (DataRow dr in dt.Rows)
                    {
    
                        work = "<tr>";
                        work += "<td class=\"tdr1\">";
                        work += dr["nome"] + "</td>";
                        work += "<td class=\"tdr2\">";
                        work += dr["rua"] + "</td>";
                        work += "</tr>";
    
                        str += work;
    
                    }
    
    
                }
                    Session[sessaotabela] = dt;
                 
                    return str;
               
            }
    
    
    
    e ele rebenta na tua função

    Código:
    
     private Boolean RecordExists(string nome, string rua)
            {
                bool result = false;
                foreach (DataRow row in dt.Rows)
                {
                    if (row["nome"].Equals(nome) && row["rua"].Equals(rua))
                    {
                        result = true;
                        break;
                    }
                }
                return result;
            } 
    
    
    no foreach

    Código:
     foreach (DataRow row in dt.Rows)
     
    Última edição: 13 de Março de 2008
  9. p3dro

    p3dro Power Member

    E qual é o descritivo do erro?

    Teoricamente diria que deve erro porque o DataTable não deve ser válido, no exemplo que dei eu usei o "dt" como um atributo da class, no teu também é?

    Neste teu código, estás a passar o "dt" para a função
    Código:
        private string paginaDados(DataTable dt)
            {
    
                dt = (DataTable)Session[sessaotabela]; //obter datatable
    
    Porém dentro da função estás a atribuir ao "dt" outro valor, sendo assim é escusado estares a passar o "dt", ou é escusado fazeres a assignação.


    Testei o código que coloquei aqui e funcionou correctamente, agora é uma questão de tentares adaptar ao teu.

    Tenta por ex. passar o DataTable para o RecordExists:

    PHP:
    if (!RecordExists(dt,txttexto.Texttxtrua.Text)) {
      ....
    }
    PHP:
    private Boolean RecordExists(DataTable dtablestring nomestring rua) {
      ....

      foreach (
    DataRow row in dtable.Rows) {
        ...
      }

    }
     
  10. alfinete

    alfinete Power Member

    na grid do asp funcionou sim na que eu fiz a pata não

    ja vou ver a tua dica

    ja bombex mas com um peq problema

    esta aqui o code

    Código:
     #region objectos
    
            DataTable dt;
            const string sessaotabela = "teste";
            protected string tabela = "";
            DataRow row;
          
            #endregion
    
            protected void Page_Load(object sender, EventArgs e)
            {
    
                if (!IsPostBack)
                {
                    dt = new DataTable(sessaotabela);
                    Session[sessaotabela] = dt; //guardar datatable
    
                    DataColumn nome = new DataColumn("nome");
                    nome.DataType = System.Type.GetType("System.String");
                    dt.Columns.Add(nome);
    
                    DataColumn rua = new DataColumn("rua");
                    rua.DataType = System.Type.GetType("System.String");
                    dt.Columns.Add(rua);
                }
            }
    
            protected void btnteste_Click(object sender, EventArgs e)
            {
                pageTable(dt); 
             //lblteste.Text = Session["teste"].ToString() + Session["teste2"].ToString(); 
            }
    
            private void load_grid()
            {
    
             
               
            }
    
            private string paginaDados(DataTable dt)
            {
    
                dt = (DataTable)Session[sessaotabela]; //obter datatable
    
    
                string str = "";
                string work = "";
                if (!RecordExists(dt,txttexto.Text, txtrua.Text))
                {
                  
                    row = dt.NewRow();
                    row["nome"] = txttexto.Text;
                    row["rua"] = txtrua.Text;
    
                    dt.Rows.Add(row);
                
    
                    foreach (DataRow dr in dt.Rows)
                    {
                     
    
                        work = "<tr>";
                        work += "<td class=\"tdr1\">";
                        work += dr["nome"] + "</td>";
                        work += "<td class=\"tdr2\">";
                        work += dr["rua"] + "</td>";
                        work += "</tr>";
    
                        str += work;
    
                    }
    
                }
                Session[sessaotabela] = dt; 
                return str;
                  
                
            }
    
    
            private void pageTable(DataTable dt)
            {
                string str = "";
    
                str = "<table id=\"tblPaging\" border=\"1\" cellspacing=\"0\" rules=\"all\" class=\"tabela_estilo\" summary=\"Várias habilatações já introduzidas.\">";
                str += "<tr class=\"gvHeader\"><th scope=\"col\">Nome</th><th scope=\"col\">Rua</th>";
                str += "</tr>";
                str += paginaDados(dt);
                str += "</table>";
               
                tabela = str;
              
            }
    
    
            private Boolean RecordExists(DataTable dt, string nome, string rua)
            {
                bool result = false;
                foreach (DataRow row in dt.Rows)
                {
                    if (row["nome"].Equals(nome) && row["rua"].Equals(rua))
                    {
                        result = true;
                        break;
                    }
                }
                return result;
            }
    
    
    
    o problema é o seguinte, quando fasso f5 a tabela fica vazia so em visibilidade, depois quando insiro outro reg ela volta ao normal e deveria estar sempre normal


    gostava de um help
     
    Última edição pelo moderador: 16 de Março de 2008
  11. p3dro

    p3dro Power Member

    O problema é que só estás a construir a tabela dentro da condição que verifica a existência ou não do registo: "if (!RecordExists(dt, txttexto.Text, txtrua.Text))"

    Ou seja, se fizeres refresh ou adicionares um que já exista, aquela condição não vai ser satisfeita e por consequência não vai construir a tua tabela, terás de passar as instruções de construção da tabela para fora dessa condição. Podia ficar por ex. assim:

    PHP:
            if (!RecordExists(dttxttexto.Texttxtrua.Text)) {
                
    row dt.NewRow();
                
    row["nome"] = txttexto.Text;
                
    row["rua"] = txtrua.Text;

                
    dt.Rows.Add(row);
            }

            foreach (
    DataRow dr in dt.Rows) {
                
    work "<tr>";
                
    work += "<td class=\"tdr1\">";
                
    work += dr["nome"] + "</td>";
                
    work += "<td class=\"tdr2\">";
                
    work += dr["rua"] + "</td>";
                
    work += "</tr>";

                
    str += work;
            }
    Outro pormenor está no envio dos parametros das funções, fazes bem em receber a DataTable como argumento, assim até tornas o código mais modular e podes sempre adaptá-lo para outras situações, porém se já estás a passar a DataTable, depois escusas de ir buscá-la novamente à Session, é desnecessário, porque podes logo enviá-la quando fazes o "btnteste_click", no teu caso até estás a passar um objecto vazio (aquele "dt" que estás a passar naquela altura ainda não tem nada porque foi feito um postback e não o foste buscar à sessão), podes logo fazer isto:
    PHP:
        protected void btnteste_Click(object senderEventArgs e) {
            
    pageTable((DataTable)Session[sessaotabela]);
        }
    Depois na função "paginaDados" como já estás a passar a DataTable como parametro, podes eliminar esta linha, porque como disse em cima é desnecessário:
    dt = (DataTable)Session[sessaotabela]; //obter datatable
     
    Última edição: 14 de Março de 2008
  12. alfinete

    alfinete Power Member

    thanks ja bombeka

    referente a este problema ja tenho isto a funcionar com uma classe , isto porque tenho de manter as coisas em sessão ao passar de formulario, o problema é que quando vou para o form da frente , e volto para o anterior onde inseri os dados na grid, não os vejo

    como posso fazer isso, agradecia imenso
     
    Última edição pelo moderador: 16 de Março de 2008
  13. p3dro

    p3dro Power Member

    O problema é que quando vais para outra página e depois voltas a essa já não vai ser um postback, dai a condição do Page_Load ser satisfeita e cria uma nova DataTable, apagando a que já se encontra na Session. Podes verificar se por ex. já existe a DataTable na Session, se já existir escusas de estar a criar uma nova e constróis logo a tabela no Page_Load.

    Tenta alterar o Page_Load para isto:

    PHP:
            if (!IsPostBack) {
                if (
    Session[sessaotabela] != null) {
                    
    pageTable((DataTable)Session[sessaotabela]);
                }
                else {
                    
    dt = new DataTable(sessaotabela);
                    
    Session[sessaotabela] = dt//guardar datatable

                    
    DataColumn nome = new DataColumn("nome");
                    
    nome.DataType System.Type.GetType("System.String");
                    
    dt.Columns.Add(nome);

                    
    DataColumn rua = new DataColumn("rua");
                    
    rua.DataType System.Type.GetType("System.String");
                    
    dt.Columns.Add(rua);
                }
            }
     
  14. alfinete

    alfinete Power Member

    problem resolved thanks
     
  15. alfinete

    alfinete Power Member

    surgio outra duvida, como agra posso percorrer tdos os rows desta table de vorma a captar suas strs para poder depois guardar na bd
     
  16. SkylineGTR

    SkylineGTR Power Member

    Usas por exemplo o foreach:

    Código:
    foreach (DataRow row in dt.Rows)
    {
      ...
    }

    Ou, usas um ciclo For e um iterador e vais percorrendo a colecção de row da tua DataTable.
     

Partilhar esta Página