Eval - formátování textu   zodpovězená otázka

ASP.NET WebForms

Řeším následující problém: V databázi mám uvedeny číselné hodnoty pro různé úkony, tyto chci zobrazit pomocí Eval v Labelu, ale tak, aby mi to nepsalo ty číselné hodnoty, ale přímo úkony, které bych těm hodnotám přiřadil.

V DropDownListu jsem s tím neměl problém, prostě jsem udělal ListItemy a tam toto nastavil. V Labelu ovšem nic takového není, dá se to nějak nastavit přímo v Evalu ?

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

Vytvořte v databázi tabulku, která bude obsahovat číselník úkonů a bude mít 2 sloupce: UkonId - číselná hodnota a DisplayName - text pro uživatele. V SQL dotazu potom joiněte k hlavní tabulce číselník úkonů a zobrazte sloupec DisplayName. Dále nastavte sloupec s číslem úkonu jako foreign key do číselníku úkonů. Zajístíte tím integritu dat - zamezíte vložení nesmyslné hodnoty.

Číselník samozřejmě můžete využít i pro DropDownList a zbavíte se tak rozkopírování číselníku na více míst v aplikaci.

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

Tak je jasné, že v databázi to jde pořešit, ale opravdu není nějaká rozumná možnost, tohle udělat v aplikaci ?

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

Lze to udělat i v aplikaci, ale nenazýval bych to rozumnou možností :-) Rozhodně bych to řešil na úrovni databáze.

Jak to udělat v aplikaci:

1) Ve stránce vytvořte metodu, která převede zadané id úkonu na textovou reprezentaci:

public string DisplayUkon(int id)
{
  switch (id)
  {
    case 1:
      return "Úkon 1";
    case 2:
      return "Úkon 2";
    ...
    default:
      throw new Exception(string.Format("Nenámé ID úkonu {0}!", id));
  }
}

2) Touto funkcí v ASPX obalte Eval:

<asp:Label ID="Label1" runat="server" Text='<%# DisplayUkon((int)Eval("Ukon")) %>' />

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

Jasně, ale děkuji.

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

V té syntaxi Evalu bude asi nějaký problém, protože mi to vyhazuje výjimku: "System.InvalidCastException: Specified cast is not valid." na tom řádku

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

Sloupec, který obsahuje číslo úkonu se zřejmě nevrací jako int. To jsem si jenom tipnul. Jaký má datový typ v databázi? Zkuste vyhodit to přetypování na int a změnit vstupní parametr id funkce DisplayUkon na object. Dejte si tam na začátek breakpoint a podívejte se, co Vám přijde z db.

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

Aha, nějak mě to z té vyjímky netrklo.

Už to funguje, Dík.

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

Ještě bych poprosil o něco podobného pro GridView, kde se jednotlivé položky nastavují přes BoundFields.

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

Místo BoundField použijte TemplateField, který bude obsahovat label/literal. Potom je to stejné jako ve FormView.

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

Děkuji, ona šla většina toho dokonce jen naklikat :)

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