View Full Version : array to dataset asp.net c#


alfinete
09-03-2008, 21:44
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#

p3dro
11-03-2008, 04:10
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:

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

alfinete
11-03-2008, 19:21
thanks ja bombex


#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



#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



<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"]

alfinete
13-03-2008, 09:41
quanto ao code que o p3dro (http://www.techzonept.com/member.php?u=6374) 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

SkylineGTR
13-03-2008, 12:47
quanto ao code que o p3dro (http://www.techzonept.com/member.php?u=6374) 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.

alfinete
13-03-2008, 14:03
o prob é que isto so vai gravar os dados da tabela quando tiverem tdos inseridos

p3dro
13-03-2008, 14:13
quanto ao code que o p3dro (http://www.techzonept.com/member.php?u=6374) 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

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

alfinete
13-03-2008, 20:15
eu puz assim




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



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

foreach (DataRow row in dt.Rows)

p3dro
13-03-2008, 20:39
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
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:

if (!RecordExists(dt,txttexto.Text, txtrua.Text)) {
....
}

private Boolean RecordExists(DataTable dtable, string nome, string rua) {
....

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

}

alfinete
13-03-2008, 20:52
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


#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

p3dro
14-03-2008, 03:53
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:

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

alfinete
14-03-2008, 09:00
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

p3dro
14-03-2008, 14:05
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:

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);
}
}

alfinete
14-03-2008, 16:57
problem resolved thanks

alfinete
17-03-2008, 11:25
surgio outra duvida, como agra posso percorrer tdos os rows desta table de vorma a captar suas strs para poder depois guardar na bd

SkylineGTR
17-03-2008, 12:08
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:

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.