Agiunta di righe e campi a tabella

sabato 07 gennaio 2012 - 21.13

zenx Profilo | Newbie

Buongiorno a tutti e grazie in anticipo per l'eventuale aiuto.
Dunque..dato un codice del genere

HtmlTableRow tRow = new HtmlTableRow();
TextBox t = new TextBox();
t.ID = "campo1";

HtmlTableCell tCell = new HtmlTableCell();
tCell.Controls.Add(t);
tRow.Cells.Add(tCell);
table1.Rows.Add(tRow);

che aggiunge semplicemente una riga ad una tabella htmlControls di table1...
vorrei che cliccando nuovamente sul bottone che scatena il codice , mi venisse creata una nuova riga con una nuova textbox di nome "campo2"...
Premetto che la tabella sta dentro un UpdatePanel
Sembrerà una banalità ma non riesco a farlo , cioe al primo click tutto ok , ma dal secondo in poi niente. Il motivo credo di saperlo ma non so come risolverlo
grazie

Jeremy Profilo | Guru

Ciao Gabriele.
>Il motivo credo di saperlo ma non so come risolverlo
Lo diresti anche a noi .... perchè visto così dovrebbe funzionare.

Forse se mostrassi un pò di codice in più(compreso quello della pagina) ci si capisce un pò di più.

Facci sapere...
Ciao

Gluck74 Profilo | Guru

int numRighe = table1.Rows.Count(); TextBox t = new TextBox(); t.ID = string.Concat("Campo", (++numRighe).ToString()); HtmlTableRow tRow = new HtmlTableRow(); HtmlTableCell tCell = new HtmlTableCell(); tCell.Controls.Add(t); tRow.Cells.Add(tCell); table1.Rows.Add(tRow);

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zenx Profilo | Newbie

Grazie della risposta intanto, e sorry per il ritardo nella mia di risposta...
Mah in realta il codice è completamente da implementare e queste erano le prime "quattro" righe di codice che ho steso...
poi visto il problema mi sono arenato e ho chiesto a voi...
Cerco di spiegarti brevemente cosa devo fare:
Sto sviluppando un progetto per la compilazione del 730 , in realtà il progetto è quasi ultimato del tutto , solo che mi hanno chiesto di creare una nuova funzione che:

al click di un bottone , aggiunga una riga alla tabella "fabbricati" (che è una tabella HTML con runat="server")
Quindi cliccando il pulsante deve essere aggiunta una riga alla tabella HTML "fabbricati" ...la riga ovviamente deve comprendere anche i campi , che devono essere di tipo WebControls
La tabella "fabbricati" è dentro un updatepanel.
All'inizio avevo optato per un JS che aggiungeva le righe , e la cosa funzionava , ma non sapevo come aggiungere i nuovi campi alle celle della riga appena creata.

Cosi ho pensato di fare tutto lato server...mi sono detto tanto è dentro un updatepanel quindi quando clicco la pagina non fa neanche il postback e all'apparenza sembra tutto lato client.(elegante)
Come ti dicevo quindi , la cosa funziona , la riga viene aggiunga, i campi anche , ma quando riclicco per aggiungere una seconda riga , non succede niente.
Io ho pensato (correggimi...) forse è perche richiamo lo stesso codice , e quindi ripete la stessa operazione...boh non so ...SEI TU IL GURU!
GRAZIE
ciao
G.

Gluck74 Profilo | Guru

he he, non sono ancora GURU, per ora sono fermo ad Expert.... hi hi hi.

Dunque, c'e un concetto sbagliato in quello che hai detto:
> non fa nemmeno il postback
Sbagliato!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Il postback della pagina avviene SEMPRE anche quando c'è un UpdatePanel. La differenza è solo nel refresh lato client.
L'update panel permette di aggiornare solo la parte al suo interno, ecco perché SEMBRA non fare il postback, ma in verità il codice lato server viene eseguito TUTTO!!!!.

detto questo, vorrei capire come sono agganciati i dati ai controlli. Hai una formview? hai un datasource di qualsiasi tipo? sono tutti controlli che non fanno binding?

La soluzione che hai fatto tu poteva anche andare bene, dipende.... dammi qualche info in più

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

Jeremy Profilo | Guru

Ciao Gabriele.
Quello che sta cercando di spiegarti Glauco è che, avvenendo il PostBack, ad ogni pressione del button, ti ritrovi con una tabella completamente nuova ed appena istanziata.
E' per questo che ti ritrovi sempre con una sola riga .... perchè è sempre la prima riga della nuova tabella.

Facci sapere...
Ciao

N.B.
>boh non so ...SEI TU IL GURU!
Se ti riferivi a me .... vorrei precisare che il titolo guru mi è stato assegnato al raggiungimento dei 1000 post.
Pertanto, io avrei anche potuto scrivere 1000 stupidate ..... e sempre guru sarei diventato.
Ci sono magari altri, appena arrivati sul Forum, che si ritrovano con il titolo NewBie(che nel pensiero collettivo potrebbe portare a pensare a qualcuno non esperto) e potrebbero saperne più dei "guru".
Recentemente, mi sembra di aver capito che, i fondatori del sito, hanno modificato l'assegnazione di tali titoli(che servono solo a prendere più o meno in considerazione una risposta o l'altra) seguendo una logica più articolata ma, a mio avviso, più meritocratica.
Quello che voglio dirti ..... non farti "ingannare" dal titolino "quasi inutile"(in certi casi) vicino al NickName .... valuta secondo la consistenza delle risposte, la quantità di informazioni e dettagli che contengono e, sopratutto, apprezza sempre e comunque il tempo che ti viene dedicato .... a prescindere dal fatto che ti abbiano risolto o meno il problema.
Ovviamente non mi riferisco direttamente a te, ne a nessun altro in particolare .... ma mi hai dato un bel aggancio per dire qualcosa che da tempo mi andava di specificare.
Ciao

zenx Profilo | Newbie

Ciao , si mi sono espresso male , intendevo che solo la parte del contenuta dentro UpdatePanel fa il postback , il resto della pagina rimane come è.
Per L'implementazione del codice sono andato molto in "manuale" ...nel senso che per esempio per popolare i campi nel momento in cui tiro su i dati , uso un datareader , e associo i controlli webform al datareader con un ciclo...quindi non uso binding ne altri controlli piu complessi...

Il problema è come dice il JEremy e cioè ogni volta che clicco , ricarico tutto , quindi ho una nuova istanza della tabella e quindi solo con una sola riga...
Quindi capito il problema ...avete qualche soluzione da suggerire..
Grazie ancora
Saluti
G.

zenx Profilo | Newbie

Signori , ho risolto cosi:

protected void Button1_Click(object sender, EventArgs e)
{

Int32 nRighe = 0;
if (ViewState["Nrighe"] == String.Empty)
{// incomincia la conta
ViewState["Nrighe"] = 1;
}
else
{
nRighe = Convert.ToInt32(ViewState["Nrighe"]);
nRighe = nRighe + 1;
ViewState["Nrighe"] = nRighe;
}

Int32 CellCoord = 8;

for (int i = 0; i < nRighe; i++)
{
HtmlTableRow tRow = new HtmlTableRow();
HtmlTableCell tCell = new HtmlTableCell();
HtmlTableCell tCellCoord = new HtmlTableCell();

// Aggiunge la prima cella che contiene la coordinata della riga
CellCoord = CellCoord + 1;
tCellCoord.InnerText = (Convert.ToString(CellCoord));
tRow.Cells.Add(tCellCoord);

TextBox t1 = new TextBox();

t1.ID = "a" + CellCoord + "_ReddDominic_Extra";
tCell.Controls.Add(t1);
tRow.Cells.Add(tCell);
RedditiTBL.Rows.Add(tRow);
}

grazie comunque del vostro supporto che mi è stato molto utile
Ci sentiamo
A presto
Ciao
G.
(A volte le cose sono piu semplici di quanto sembrano)

Gluck74 Profilo | Guru

ho paura che in questo modo non ti vengano salvati i dati scritti nelle textbox nel momento in cui aggiungi una riga.

io userei un altro approccio, ad esempio creare una List<string> come base dati (proprietà della pagina/controllo memorizzato nel viewstate) ed utilizzare un repeater per costruire la tabella.
ogni volta che fai il click sul pulsante, aggungi una stringa vuota alla lista, ed il repeater in automatico di aggiunge una riga alla tabella.

non è bello ma è semplice

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zenx Profilo | Newbie

Grazie del suggerimento...proverò Ti vorrei chiedere un altra cosa se posso...
Ho sempre avuto qualche problema a ciclare nella collection controls di alcuni controlli
Ti faccio un esempio ...
Dato questo codice:

<div id="RedditiTerreniPNL" title="Apri/chiudi" style="position:relative; top:-5px;">
<asp:UpdatePanel ID="quadroA_UPD" runat="server">
<ContentTemplate>
<table class="tabella" cellpadding="3" cellspacing="0" runat="server" id="RedditiTBL">
...
...
...

Come faccio a ciclare dentro tutta la collezione Controls contenuta in RedditiTBL?

Le ho provate tutte:
foreach (Control c in quadroA_UPD.Controls[0].Controls[0].Controls)
foreach (Control c in RedditiTBL.Controls[0].Controls)
foreach (Control c in RedditiTBL.Controls)

Dove sbaglio ?
grazie


Gluck74 Profilo | Guru

questa soluzione, come ti ho già detto, è un po' abbozzata.
tanto più che devi lavorare sui controlli, meglio se utilizzi qualcosa di più avanzato e non una semplice tabella con runat=server.

qual è la tua esigenza? perché devi ciclare sui controlli della tabella?

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zenx Profilo | Newbie

Ho dovuto fare cosi perchè dovendo riprodurre un modello 730 ho dovuto creare una tabella per infilagli dentro tutta la miriade di campi...
Attorno alla tabella ho messo un updatepanel , in modo che 'lutente si possa salvare solo un "pezzo" del 730 e nn sia costretto a salvare tutti i quadri.

Quindi ora che sono alla fine del progetto non posso rismontare ancora tutto ...la pagina deve rimanere cosi per forza.
Se riesci ad aiutarmi con il codice scritto cosi mi fai una cortesia
Ciao
G.

zenx Profilo | Newbie

Devo ciclare sui controlli (di quella porzione specifica della pagina) per prendere i nomi (ID) dei controlli...ma solo di quella porzione di pagina (in pratica di quel quadro)
Ciao

Gluck74 Profilo | Guru

una tabella ha come controlli figli delle HtmlTableRow
una row ha come controlli figli delle HtmlTableCell
una cell ha come controlli figli i controlli che contiene (compresi i Literal per gli a capo nel sorgente HTML)

HtmlTable tbl = this.TBLRedditi; foreach (HtmlTableRow row in tbl.Rows) //equivalente a tbl.Controls { foreach (HtmlTableCell cell in row.Cells) //equivalente a row.Controls { foreach (Control c in cell.Controls.OfType<TextBox>()) { string idControllo = c.ID; } } }


P.S.: quest'anno la compilazione del 730 però me la fai gratis!!!!!! ;-D
____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zenx Profilo | Newbie

Ciao , abbi pazienza, grazie , cerco di spiegarti meglio.
Partendo dal fatto che non posso modificare la struttura della pagina ,la cosa strana è che prima che "trasformassi" la tabella in HTMLcontrols grazie all'attributo runat="server" tutto funzionava
Ora ho fatto un esperimento ...ho tolto il runatserver dalla tabella ...l'ho racchiusa dentro un PANEL , e semplicemente con :
foreach (Control c in nomepannello.Controls) tutto funziona benissimo

Dal momento in cui ritrasformo la tabella in HTMLcontrols runat="server" , il ciclo non vede piu i controlli ...
Ho provato anche:
foreach (Control c in nomepannello.Controls[0].Controls)
ma niente da fare...

Il problema è che io ho bisogno di rendere la tabella runat="server" perchè all'occorrenza devo aggiungere delle righe e quindi ho bisogno in qualche modo di richiamarla via codice...
Grz infinite
Ciao

Gluck74 Profilo | Guru

bisogna che mi fai vedere il codice, altrimenti come faccio a vedere un probabile errore?

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zenx Profilo | Newbie

Grazie mille...intanto , poi ti faccio sapere
Grazie

zenx Profilo | Newbie

SEI IL NUMERO UNO!!
Con quei cicli nidificati tutto funziona alla perfezione!
ti ringrazio veramente tanto....
Magari mi permetterò di disturbarti ancora qualche volte
Grazie infinite
Ciao

zenx Profilo | Newbie

Ciao Gluck 74 , avrei bisogno ancora di qualche suggerimento...scusa il disturbo e grazie in anticipo..
Il discorso dell'aggiunta riga al modello 730 l'ho fatto e ho risolto anche il problema che non riuscivo a vedere i controlli nel ciclo (grazie a te)..
Ora pero si pone un altro problema...
se io aggiungo una riga a runtime , la compilo e poi clicco su salva , la "persistenza" della riga se ne va a "quel paese" in quanto è aggiunta a runtime...
Come faccio a mantere la persistenza sia della riga che dei dati contenuti nei campi, una volta che faccio click su salva ....dato che cosi facendo la porzione di pagina esegue il postback e ricarica il metodo load, senza piu farmi vedere la riga che avevo aggiunto in precedenza?
Tu mi avevi suggerito di usare List<string> ma non ben capito cosa intendessi..

Spero di essere stato chiaro.
Grazie infinite
Ciao
G.

Gluck74 Profilo | Guru

il concetto è che la pagina deve semplicemente "VISUALLIZZARE" i dati che sono presenti sul server.
Prendiamo ad esempio il tuo 730 che nella porzione specificate deve far vedere l'elenco dei fabbricati.

L'elenco dei fabbricati deve essere un "oggetto" salvato sul server, nella pagina, nel viewstate, nella cache, da qualche parte.
la pagina dovrà poi far vedere una riga per ogni dato dentro l'oggetto, più una per aggiungere un nuovo oggetto quando clikki.

Quello che ti suggerivo dunque era di usare come oggetto dati, una lista di stringhe, e come oggetto dati un asp:Repeater
Ti do solo uno spunto:
private List<string> elencoFabbricati; protected void DataBind() { if (elencoFabbricati == null) elencoFabbricati = new List<string>(); foreach (RepeaterItem fabb in rptFabbricati.Items) { string fabbricato = (fabb.FindControl("txtFabbricato") as TextBox).Text; elencoFabbricati.Add(fabbricato); } } protected void addfabbr(... ...) { elencoFabbricati.Add(NEWtxtFabbricato.Text); rptFabbricati.DataSource = elencoFabbricati; rptFabbricati.dataBind(); }
<asp:Repeater runat="Server" ID="rptFabbricati"> <ItemTemplate> <asp:TextBox runat="server" ID="txtFabbricato" /> </ItemTemplate> <FooterTemplate> <asp:TextBox runat="server" ID="NEWtxtFabbricato" /><asp:Button ... ... onclick="addfabbr"> </FooterTemplate> </asp:Repeater

l'ho scritto in fretta e furia, spero di non aver fatto errori

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zenx Profilo | Newbie

Ciao Gluck 74 sono riuscito a risolvere i miei problemi , ....ma .....quando ne risolvi uno ne viene fuori un altro!

Comunuque non ti voglio assillare , gia mi sei stato molto di aiuto cosi ....pero ti volevo chiedere una cosa...

Come mai se ....avendo un bottone (webcontrols) cosi;

<asp:Button runat="server" OnClientClick="SaveExtraData()" OnClick="SalvaQuadroA_click" />

dove :
prima viene eseguita una procedura JS la to client SaveExtraData()
e poi si dovrebbe eseguire lato server SalvaQuadroA_click

succede che : la procedura lato client viene eseguita.
la procedura Load (lato server viene eseguita)
ma la procedura SalvaQuadroA_click NO!!!!

perche ?
è normale?
grazie

Gluck74 Profilo | Guru

direi molto strano,
mi fai vedere la firma della procedura sul server?
controlla anche il valore di Request.Form["__EVENTTARGET"]



____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zenx Profilo | Newbie

Ho risolto! comunquecerco di spiegarti dove era l'errore magari ti fa comodo ...
In pratica nella procedura lato Client SaveExtraData('RedditiTBL') eseguivo un submit...
document.form.submit...
Credevo fosse necessaria per recuperare lato server i valori dei campi aggiunti lato client...
ma questa submit causava la non esecuzione della procedura lato server QuadroA_save_Click
Alla fine mi sono accorto che era inutile la submit , ...i dati li riesco a recuperare perche dopo che eseguito lato client il compilatore esegue lato server Onload e li con una request form recupero tutti i valori dei campi...
Si è un po complicato spiegarlo ma sono riuscito a fare quello che volevo ,

grazie comunque
Ciao

Gluck74 Profilo | Guru

ho capito,
be certo, se fai il submit da una tua funzione javascript, annulli di fatto il "postback" gestito da asp.net.

Infatti ti ho chiesto di controllare il valore di Request.Form[__EVENTTARGET] proprio per questo.
Se ci fai caso nel codice html generato dalle pagina aspx, ci sono una serie di campi nascosti che vengono gestiti da ASP.NET, tra questi EVENTTARGET tiene il nome del controllo che ha effettuato il send del form. è con questo nome che lato server viene agganciato l'evento click che a te non partiva.

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5