Edit item template non si vede

sabato 26 giugno 2010 - 13.02

ciccioherz Profilo | Junior Member

ciao, questo il problema:
ho una grdiView con n itemtemplate.

poi l'ultima colonna è formata da un itemtemplate (un imageButton) e un editItemtemplate (un altro imageButton).

il primo ImageButton ha la proprietà commandname settata su Edit e l'evento si scatena regolarmente, però di fatto io continuo a vedere l'immagine dell' itemtemplate, non dell'editItemTemplate.

davvero non mi spiego il perche, da cosa puo dipendere?

Debuggando ho scoperto che il nuovo bottone (quindi l'editItemTempale) si vede solo se assegno alla proprietà dataSourceId un id del sql data source. Il problema è che io (per una serie di motivi) la griglia la bindo all'iterno del load in questo modo:

DataTable dt = new DataTable();

DataColumn dc = new DataColumn("xx", typeof(bool));

DataColumn dc2 = new DataColumn("yy", typeof(bool));

dt.Columns.Add(dc);

dt.Columns.Add(dc2);



dt.Rows.Add(true, true);

gridView.DataSource = dt;

gridView.DataBind();

la gridview si binda, ma non riesco a vedere il nuovo bottone...funziona solo con l'id di un sql data source..

TOPOAMORE Profilo | Expert

Ciao,

posta html dell ' itemtemplate che diamo un occhiata
__.__.__.__.__.__

ASP 2.0 - VB 2008

ciccioherz Profilo | Junior Member

questo è l'html generato al pirmo click (evento row editing scatenato, ma di fatto vedo ancora il bottono dell'item template:
<body>
<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTkzOTc0NjkzMA9kFgICAw9kFgICAw88KwANAQAPFgQeC18hRGF0YUJvdW5kZx4LXyFJdGVtQ291bnQCAWQWAmYPZBYGAgEPZBYEZg9kFgICAQ8PFgIeBFRleHQFBW15Um93ZGQCAQ9kFgICAQ8PFgIeD0NvbW1hbmRBcmd1bWVudAUBMGRkAgIPDxYCHgdWaXNpYmxlaGRkAgMPDxYCHwRoZGQYAQUJR3JpZFZpZXcxDzwrAAoCAWYIAgFkL1jIlVmCHSUi03hsnxy7nC+/Aas=" />
</div>

<div>

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgLYt/nmCgLPqPvPD1Xh0heAVZ+97l+cMnifUz6PGtFS" />
</div>
<div>

<!--

-->


<div>
<table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse:collapse;">
<tr>
<th scope="col">marca</th><th scope="col">&nbsp;</th>
</tr><tr>
<td>
<span id="GridView1_ctl02_Label1">myRow</span>

</td><td>
<input type="submit" name="GridView1$ctl02$Button1" value="modifica" id="GridView1_ctl02_Button1" />
</td>
</tr>
</table>
</div>
----------

e questo è l'html del sencondo click (adesso vendo il bottone dell edit itemtemplate)

<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTkzOTc0NjkzMA9kFgICAw9kFgICAw88KwANAQAPFgQeC18hRGF0YUJvdW5kZx4LXyFJdGVtQ291bnQCAWQWAmYPZBYGAgEPZBYEZg9kFgICAQ8PFgIeBFRleHQFBW15Um93ZGQCAQ9kFgICAQ8PFgIeD0NvbW1hbmRBcmd1bWVudAUBMGRkAgIPDxYCHgdWaXNpYmxlaGRkAgMPDxYCHwRoZGQYAQUJR3JpZFZpZXcxDzwrAAoCAWYIAgFkL1jIlVmCHSUi03hsnxy7nC+/Aas=" />
</div>

<div>

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgLYt/nmCgLWtpC6AnDm+MeF8pR3K4rCW625aXEaIfdP" />
</div>
<div>

<!--

-->


<div>
<table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse:collapse;">
<tr>
<th scope="col">marca</th><th scope="col">&nbsp;</th>
</tr><tr>
<td>
<span id="GridView1_ctl02_Label1">myRow</span>

</td><td>
<input type="submit" name="GridView1$ctl02$Button4" value="salva" id="GridView1_ctl02_Button4" />
</td>
</tr>
</table>
</div>

TOPOAMORE Profilo | Expert

Scusami mi sono espresso male

Serve la pagina che scrivi tu il codice asp da te scritto
__.__.__.__.__.__

ASP 2.0 - VB 2008

ciccioherz Profilo | Junior Member

si ok..cmq aggiungo (forse è irrilevante o forse no):
per far si che venga visualizzato il controllo dell'edititemtemplate all'interno del gestore evento rowcommand io scrivo una cosa tipo:
gridView.editIndex = index //dove index è l'indice del row effettivo dove è stato eseguito il click..è come se la pagina (e di fatto è così) avesse bisogno di un nuovo postback per costruire i controlli come io gli ho detto di fare..

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
onrowdatabound="GridView1_RowDataBound"
onrowcommand="GridView1_RowCommand"
onrowediting="GridView1_RowEditing" AllowPaging="true"
onrowupdated="GridView1_RowUpdated" onrowupdating="GridView1_RowUpdating">

<Columns>



<asp:TemplateField HeaderText="marca">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("Colonna1") %>'></asp:Label>

</ItemTemplate>
</asp:TemplateField>




<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="Button1" CausesValidation="false" runat="server" Text="modifica" CommandName="Edit" CommandArgument='<%# Container.DataItemIndex %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:Button ID="Button4" runat="server" Text="salva" CommandName="Update"/>
</EditItemTemplate>
</asp:TemplateField>


</Columns>

</asp:GridView>

TOPOAMORE Profilo | Expert

>si ok..cmq aggiungo (forse è irrilevante o forse no):
>per far si che venga visualizzato il controllo dell'edititemtemplate
>all'interno del gestore evento rowcommand io scrivo una cosa
>tipo:
>gridView.editIndex = index //dove index è l'indice del row effettivo
>dove è stato eseguito il click..è come se la pagina (e di fatto
>è così) avesse bisogno di un nuovo postback per costruire i controlli
>come io gli ho detto di fare..
>

e questo e normale

><asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
> onrowdatabound="GridView1_RowDataBound"
> onrowcommand="GridView1_RowCommand"
>onrowediting="GridView1_RowEditing" AllowPaging="true"
>onrowupdated="GridView1_RowUpdated" onrowupdating="GridView1_RowUpdating">
>
> <Columns>
>
>
>
> <asp:TemplateField HeaderText="marca">
> <ItemTemplate>
><asp:Label ID="Label1" runat="server" Text='<%# Eval("Colonna1")
>%>'></asp:Label>
>
> </ItemTemplate>
> </asp:TemplateField>
>
>
>
>
> <asp:TemplateField>
> <ItemTemplate>
><asp:Button ID="Button1" CausesValidation="false" runat="server"
>Text="modifica" CommandName="Edit" CommandArgument='<%# Container.DataItemIndex
>%>' />
> </ItemTemplate>
> <EditItemTemplate>
><asp:Button ID="Button4" runat="server" Text="salva" CommandName="Update"/>
> </EditItemTemplate>
> </asp:TemplateField>
>
>
> </Columns>
>
> </asp:GridView>


Vedendo il codice non riesco a capire cosa non funzioni....
__.__.__.__.__.__

ASP 2.0 - VB 2008

ciccioherz Profilo | Junior Member

eh..e lo dici a me..?! :)

so solo che se invece di passargli un oggetto deriventi da IEnumerable come il datatable gli passo l'id di un source tutto funziona a meraviglia.

purtroppo, per il modo in cui è strutturata la tabella questo non posso farlo con un semplice sqldatasource, per cui per ora ho aggirato il problema creando una classe wrapper che mi rappresenta il set di record e associo il bind con un object data source, ovviamente passando al gridView l'id di tale object (che sarebbe come passare l'id di un sqldatasource).

curiosità, potresitprovare tu stesso il codice come il mio?
crea un itemtemplate con una semplice lable, poi un itemTempalte e un editItemTemplate con un button all'interno, un per l'edit e l'altro per l'update.
Esegui il bind della gridView con un datatable con una sola colonna e poi clicca sul button edit..vedrai che anche a te non funzionerà..

paoval72 Profilo | Senior Member

Ciao. Puoi postare anche il codice del load e del rowcommand che usi?

PV

paoval72 Profilo | Senior Member

Ciao (di nuovo!).
A me funziona, nel modo seguente.
Prima di tutto, a livello di Html, se voglio modificare il campo, uso un oggetto adatto, ad esempio una text box:

<ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Eval("Colonna1") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txt1" runat="server" Text='<%# Eval("Colonna1") %>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField>

A livello di code behind, devo riassociare l'indice della riga con la mia source.
Per farlo, però, devo avere a disposizone la source che alimenta la gridview.
Quindi, nel Page_load, devo memorizzarmi la source, ad esempio in un viewstate:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataTable dt = new DataTable(); DataColumn dc = new DataColumn("xx", typeof(bool)); DataColumn dc2 = new DataColumn("yy", typeof(bool)); dt.Columns.Add(dc); dt.Columns.Add(dc2); dt.Rows.Add(true, true); GridView1.DataSource = dt; GridView1.DataBind(); ViewState["mieiDati"] = dt; }
Nel mio rowCommand ora cerco l'indice e poi lo riassocio ai dati:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

prova e fammi sapere.
Buona giornata,
Paolo

ciccioherz Profilo | Junior Member

ciao,
viewState["mieiDati"] cosa dovrei mettere al posto di miei dati?

paoval72 Profilo | Senior Member

Ciao.
>viewState["mieiDati"] cosa dovrei mettere al posto di miei dati?
"mieidati" è solo una stringa che dà il nome univoco al tuo viewstate. E' come chiamare una variabile "pippo": quindi, al posto di "mieiDati" puoi utilizzare qualsiasi stringa che per te è significativa. Ad esempio"Table_Caricamento", oppure "datiOriginali", oppure "Source-partenza". Insomma, quello che vuoi.
Aspetto buone nuove!
PV

ciccioherz Profilo | Junior Member

chiedo scusa modifco il messaggio

FUNZIONA!!!!

grazie mille
--

i problemi non finiscono mai..
adesso con il nuovo dataBind tutto funziona, però nel rowCommand tra le altre cose io abilito anche le mie checkBox (nel progetto reale ho diversi campi con checkBox) ma non si abilitano...a causa dell'istruzione da te suggerita..
sono sempre piu nei casini..

paoval72 Profilo | Senior Member

Puoi postare l'html della tua griglia (con tutti i controlli che usi, qujndi checks, labels, texbox o altro) e il tuo rowcommand?

ciccioherz Profilo | Junior Member

Si non appena ho tempo..ma penso sia normale perche nel rowcommand mi riprendo il viewstate precedente, e nel viewstate precedente le checkbox sono tutte disabled..
MODIFICO IL MESSAGGIO:

sono riuscito a modificare i controlli nonostante il viewstate, gestendo in questo caso l'evento row_editing.

io invece facevo tutto nel rowCommand.

spero di non avere piu domande in merito, per ora un enorme grazie a tutti
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5