array to dataset asp.net c#

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:
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 sender, EventArgs 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 sender, EventArgs 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:
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:
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
 
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

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.
 
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

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 sender, EventArgs 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 sender, EventArgs e) {
        dt = (DataTable)Session[mySessionDataTableName]; //obter datatable

        if (!RecordExists(txttexto.Text, txtrua.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 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;
    }
}
 
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:
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.Text, txtrua.Text)) {
  ....
}
PHP:
private Boolean RecordExists(DataTable dtable, string nome, string rua) {
  ....

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

}
 
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:
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(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;
        }

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 sender, EventArgs 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:
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:
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

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);
            }
        }
 
surgio outra duvida, como agra posso percorrer tdos os rows desta table de vorma a captar suas strs para poder depois guardar na bd

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.
 
Back
Topo