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