Ztráta úprav z události RowDataBound   zodpovězená otázka

C#, ASP.NET WebForms, Komponenty

Mám problém se "zapomínáním" úprav buněk GridView, které provádím v události RowDataBound.

V události RowDataBound u některých řádek skryju tlačítko pro editaci položky:

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
	if (e.Row.RowType == DataControlRowType.DataRow)
	{
		if (e.Row.Cells[8].Text == "ne")
		{
			e.Row.Cells[9].Text = "";
		}
	}
}

Na první pohled vše funguje, ale při postbacku se tyto úpravy zapomenou a tlačítka se zobrazí i tam, kde jsem je vymazal. Způsobí to pouze postback, který nepřenačte data a GridView se tak naplní z ViewState - například když kliknu na seřazení jiného GridView na stránce.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemáte někde vypnutý ViewState?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud se po strance pohybujete v postbacku, tak se podivejte, jeslti bindujete data do vsech gridview jenom pokud nejste v postbacku. A samozrejme zaple viewstate.

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack) // <-- tady
        { 
            // bind data
        }
    }

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Viewstate mám zapnutý. Některá GridView binduju i v PostBacku. Co je na tom špatného? Potřebuju to například pokud uživatel vyplní kritéria pro filtrování s stiskne tlačítko pro hledání - obsluha tohoto tlačítka se samořejmě vyvolá postbackem a já v ní zavolám DataBind na GridView, kterého se filtry týkají.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Co máte přesně v osmém a devátém sloupci? Jsou to sloupce typu BoundField?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ne. Jsou to sloupce HyperLinkField nebo TemplateField.

Připravil jsem jednoduchý příklad, který demonstruje popisovaný problém: http://skeleton.cz/TestRowDataBound

Po stisknutí tlačítka "PostBack" se poslední 2 sloupce zobrazí špatně - Místo odkazu se zobrazí jen text a tlačítko ztratí hodnotu CommandArgument, která se vypisuje po jeho stisknutí.

Příklad se můžete stáhnout zde: http://skeleton.cz/TestRowDataBound/Test...

Díky za jakékoliv nápady.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V případě, že je to TemplateField nebo HyperLinkField, asi bych to mazal raději tak, že si v nich najdu příslušnou komponentu HyperLink nebo LinkButton či co to tam máte a na ní zavolal Visible. Přiřadit do vlastnosti Text té buňky není ideální (protože tím zrušíte tu komponentu, co uvnitř je) a asi se to ve ViewState nepamatuje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky! Už to funguje.

Původně jsem zkoušel:

e.Row.Cells[2].Controls.Clear();

Ale to se chovalo stejně špatně. Nastavení Visible si GridView pamatuje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jde o to, že ViewState si pamatuje jen změny hodnot vlastností. Nepamatuje si už, kde která komponenta byla - je na stránce, aby komponenty vygenerovala úplně stejně, jak byly při posledním požadavku.

Pokud tu komponentu z buňky takhle vymažeme, do ViewState se nic neuloží (jen se smaže ViewState té komponenty, ale to ASP.NET nějak přežije). Při příštím požadavku ale stránka nemůže vědět, že tam minule ta komponenta nebyla, a protože v tom sloucpi má definovaný HyperLinkField či co, ten tam vygeneruje nový HyperLink.

Pokud buňce nastavíme vlastnost Text, do VS by se uložit měla, ale z VS se načte a nastaví ještě před tím, než se do té buňky vygeneruje ona komponenta.

Pokud nastavíme Visible té komponentě uvnitř buňky, do VS se to uloží a po postbacku se to zase úspěšně načte.

Ponaučení: Nemanipulovat se stromem komponent ve stránce, pokud to jde. Pokud si komponenty generujeme někde sami, musíme je při PostBacku vygenerovat stejně, aby se v nich hodnoty obnovily.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback