Tuesday, July 31, 2007 1:05 PM
fragment
Součet řádků v Repeateru
Po čase jsem stál opět před úkolem udělat součet řádků v repeteru(sum hodnotu).
Aby to nebylo tak jednoduché tak to samozřemě má umožnit i přepočet na klientské straně, tedy v prohlížeči.
Jako nejjednodušší mě přijde projít všechny TextBoxy, které může uživatel změnit, související s výpočtem a sum hodnotu přepočítat.
Tady ale narážím na problém co s ID jednotlivých TextBoxů, neboli jak ty txb projít a hodnotu zjistit. V minuslosti jsem to vyřešil tak že jsem si vzal vygenerované ID z výsledného html a čísla řádků jsem si přepsal přímo v JS:
ctl00_ContentPlaceHolder1_DetailForm_ctl01_tbCelkem změním na
ctl00_ContentPlaceHolder1_DetailForm_ctl02_tbCelkem
Řešení nic moc ale funkční. Při přechodu z FW 1.1 na 2.0 jsem měl např. problém s použitými oddělovači, které jsem měl definované natvrdo, místo abych si je zjistil pomocí vlastnosti ClientIDSeparator, nemluvě o tom že toto řešení nelze použít (bez dalších úprav) pro vlastní user control (ascx). Celý javascript, který jsem následně vkládl do stránky jsem si tvořil do StringBuilderu a neumožnuje tedy ani úpravu bez opětovné kompilace.
Tentokrát jsem se tedy vydal jinou cestou. Cesta se obešla bez StringBuilderu, js je tedy přímo v html stránce a ID si neskládám.
V codebehind mám definovanou vlastnost typu List<string> do které si při bindování repeateru ID jednotlivých TextBoxtů ukládám.
Vlastní JS pak využívá vloženého kódu var repId = <%= RepRowId %>; , který je nahrazen při renderování aspx jednotlivými ID
cs.
private List<string> _repRowsId = new List<string>();
public string RepRowId
{
get
{
JavaScriptSerializer jss = new JavaScriptSerializer();
string idItems = jss.Serialize(_repRowsId);
return idItems;
}
}
Jak již asi tušíte celé kouzlo spočívá ve využití serializace do JSONu, který se dá projít pomocí JS.
Výše uvedený kód mě vrátí asi takovýto objekt:
var repId = ["ctl00_ContentPlaceHolder1_DetailForm_ctl01_tbCelkem","ctl00_ContentPlaceHolder1_DetailForm_ctl02_tbCelkem"];
js.
for(i=0; i < repId.length; i++)
{
var tVal = new Number(jshelp.number.getnum($get(repId
).value));
newSum += tVal;
}