GridView in TextBox v TemplateField-u

Imam zanimiv problem, za katerega nisem našel prave rešitve preko googla. Namreč na svojem GridView-u se postavim na Edit mode in prikažem TextBox-e. Ko stisnem gumb Update, da bi vse (trenutno nastavljeno na 10 vrstic) vsebine iz TextBox-ov prenesel in potem preko parametrov vnesel v sql, mi prenese stare vrednosti teksta v TextBox-u. Moram povedati, da sam kontroliram GridView (nisem nastavil DataSourceID ) s svojo napisano funkcijo DataBind, ki gre nekako takole:


Problem nastane, ker je v textOpis tipa TextBox-u še vedno stara vsebina teksta in ne na novo napisana, ko se stisne Update gumb. Ideja je, da se pri uporabniškem pritisku na gumb Update prenese nova vsebina iz textboxov, da lahko preko foreach-a napolnim parametre za Update. Ali moram implementirati TextChanged metodo!? Kako to izvedem? Ali je potrebna kaka JS helper skriptica?

BTW
Aja, SqlDataSource pa namerno nisem uporabil, ker pri TextBoxih velkih preko 5kB, pride do Rumenega Ekrana napake. Namreč, kakor sem razumel na večih forumih ima komponenta SqlDataSource hrošč, ki preprečuje, da bi bila večja vsebina teksta, ki se bi prenesla v sql stavek. S SqlDataAdapterjem, pa ni težav s vnosom par kB teksta v sql stavek. ;)

void BindData()
{
    
SqlConnection myConnection = new SqlConnection(connectionString);
     SqlDataAdapter ad = new SqlDataAdapter("SELECT [NekiField] from NekaTabela", myConnection);
     DataSet ds = new DataSet();
     ad.Fill(ds);
     gridViewPrevod.DataSource = ds;
     gridViewPrevod.DataBind();
}

Izsek iz default.aspx, pri GridView definiciji TemplateField-a: (uporabljam Azamov trik (GridViewGuy) za "emulacijo" kdaj je v Edit in Show mode-u)
<asp:TemplateField HeaderText="Opis">
<ItemTemplate>
<asp:Label ID="lblOpis" Visible='<%# !(bool) IsInEditMode %>' runat="server" Text='<%# Eval("Opis") %>' Font-Size="11px" />
<asp:TextBox ID="txtOpis" runat="server" Enabled="true" TextMode="MultiLine" Visible='<%# IsInEditMode %>' Text='<%# Eval("Opis") %>' Font-Size="11px" Width="300px" Height="200px" />
</ItemTemplate>
</asp:TemplateField>

Na koncu pod GridView-a je še gumb btnUpdate, ki sproži lastno napisano metodo Update():
foreach (GridViewRow row in gridViewPrevod.Rows)
{
    // vsebina za parameter Opis
    strTemp = (row.FindControl("txtOpis") as TextBox).Text;
   OpisParam.Value = strTemp;
....
}

PS: trenutno sem obkljukal pri GridView komponenti EnableViewState="true", prej sem imel na false in začuda splet. aplikacija deluje, tako kot sem predvidil.

Avtor: Samir, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

Samir
Samir - ponedeljek, 19. februar 2007

Hvala za odgovor, Bojan! Sedaj sem popravil kodo, po tvojih predlogih, nastavil Cache direktivo v aspx-u. Samo imam en problem (da ne odpiram novega threada). Recimo, da iz baze podatkov preberem podatek iz sql&nbsp;stolpca DatumSpre (datum spremembe) in bi rad, preden pokažem (bindam) podatke na GridView, da mi metoda, ki pogleda trenutni čas in čas vsakega podatka v DatumSpre (brez skrbi, podatkov je okoli nekaj tisoč) s trenutnim, in s tistim, ki mu je &quot;najbližji&quot; ozr. najmanj zaostalim časom, ga prikažem. Ampak, to bom že sam sprogramiral.Kar me pa močno zanima v tem GridView je to, da namreč, kako se pogleda za določen podatek, skozi vse vrstice in ne samo trenutne, ki se bodo pokazale s NekiGridView.Rows. Da bom lahko primerja s nekim podatkom. In kako obarvam ozr. nastavim na Selected row, ko vem za podatek?&nbsp;Torej, na kratko in jedernato, muči me:- kako pogledati, skozi čisto vse vrstice, za določen podatek&nbsp;v stolpcu (da ga bom lahko primerjal s drugim podatkom)&nbsp;in ne na trenutne vrstice, ki se bodo prikazale (foreach (GridViewRows gvr in NekiGridView.Rows)&nbsp; odpade)- kako potem, ko vem, kateri stolpec, mu določiti/prebrati (PageIndex)&nbsp;na kateri strani je in potem ga obarvati, bodisi spremeniti row color ali nastaviti na Selected. Kako se row nastavi na Selected !?

bojanv
bojanv - ponedeljek, 12. februar 2007

to kar počne&scaron;, ne bo &scaron;lo. Zakaj? Ker ne ve&scaron;, ker ko spremeni&scaron; edit mode in ne obnovi&scaron; podatke, se ti ne bodo shranile v bazo. Vse, kar mora&scaron; storiti, je, da v updating preko argumentov (GridViewUpdateEventArgs --&gt; e.NewValues), pobere&scaron; ven parametre, jih zapi&scaron;e&scaron; v bazo. Ker ne dela&scaron; preko datasourceid-ja, mora&scaron; ročno tudi vezati podatke (na koncu sproži&scaron; metodo BindData, da se ti podatki osvežijo). Recimo, tale post ti bo mogoče pomagal.Da ti pa prej ni delalo (ker si imel EnableViewState na false), je pa logično, ker v tem primeru se ti ohranja samo ControlState. Ostale stvari se ne shranjujejo. Recimo, paging zna bit problematičen. Če ima&scaron; ViewSate na true, se v page zapi&scaron;ejo podatki, da ostanejo pri postback-u ali resfresh-u vrednosti, ki si jih nastavil na pravem mestu. Lahko sicer dela&scaron; tudi brez ViewState-a, ampak bo&scaron; potem moral stvari ročno nastavljat ob vsakem page-u. Preberi si tale članek pa ti bo vse jasno.Ker dela&scaron; z ogromnimi količino podatkov, priporočam Cache, da ne bo&scaron; imel nepotrebnih trip-ov v bazo.