Tag Archives: Tipy a Triky

Refresh stránky po postbacku do počátečního stavu

Při ladění webové aplikace se často dostanete do situace, kdy vyzkoušítě nějaké postback funkce stránky, a pak se chcete vrátit v prohlížeči rychle zpět do původního výchozího stavu (IsPostBack = false), abyste vyzkoušeli něco jiného.

S prohlížečem může být s tímto docela boj, protože Back nás většinou hodí buď na předchozí adresu nebo vytáhne stránku z cache a GET neprovede, Refresh naopak znovu posílá POST data a zopakuje tak poslední postback. Dělá to prostě všechno možný, jen ne nový GET potřebné stránky.

Je na to jednoduchý trik, pokud chceme znovu načíst počáteční stav stránky, stačí změnit něco bezvýznamného v adrese stránky (adresním řádku prohlížeče). Oblíbeným indiferentním trikem je změna malého písmena na velké (pro prohlížeč je to jiná adresa, udělá požadovaný GET počátečního stavu, naopak IIS je case-insensitive, takže mu to nevadí).

http://www.northwind.com/my-page.aspX

…a je to.

Tisk dlouhých tabulek – záhlaví a zápatí na každé stránce

Poměrně neznámým fíglem lze v některých browserech zajistit, aby se při tisku dlouhých tabulek, které se nevejdou na jednu stránku, vytiskly určité jejich řádky na každé stránce (záhlaví a zápatí).

Stačí využít sekce tabulky thead a tfoot a nastavit jim ty správné styly.

 ...
<style type="text/css">
   thead {display: table-header-group;}
   tfoot {display: table-footer-group;}
</style>
...
<table>
   <thead>
      <tr>
         <td>Hlavička 1</td>
         <td>Hlavička 2</td>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>123</td>
         <td>456</td>
      </tr>
      ...
   </tbody>
   <tfoot>
      <tr>
         <td>Patička 1</td>
         <td>Patička 2</td>
      </tr>
   </tfoot>
</table>

Zobrazení controlu jen v určité položce Repeateru

Je poměrně snadný způsob, jak alespoň částečně obměňovat obsah položek repeateru. Chceme-li například zobrazit control jen v první položce (mezi první a druhou položkou), pak  takto:

<asp:Repeater ID="ZpravickyRepeater" Runat="server">
   <ItemTemplate>
      ...
      <xy:CokolivTrebaPlaceHolder Visible="<%# (Container.ItemIndex == 0) %>" Runat="server"/>
   </ItemTemplate>
</asp:Repeater>

SQL: Doplňování (padding) čísel nulami zleva na pevný počet míst (15 -> 00015)

Možná to jde lépe, ale co třeba takto:

= REPLACE(STR(15, 5, 0), ' ', '0')

Funkce STR(num, length, decimals) převede číslo na řetězec určené délky (doplněný zleva mezerami) a s daným počtem desetinných míst.

Nebo takto?

= RIGHT('00000' + cislo, 5)

Většinou si formátování řešíme až v prezentační vrstvě, ale někdy se to může hodit…

SQL: Určení věku osoby z data narození

Vypadá to jako triviální problém, nicméně triviální řešení zde nejsou správná.

Nejprve tedy správné řešení:

/*
   Vrátí věk ke vztažnému datu určený dle data narození.
*/
ALTER FUNCTION dbo.Age 
(
   @DatumNarozeni smalldatetime,
   @VztazneDatum smalldatetime
)
RETURNS tinyint
AS
BEGIN
   RETURN DATEDIFF(year, @DatumNarozeni, @VztazneDatum)
      - (CASE WHEN (100 * MONTH(@VztazneDatum) + DAY(@VztazneDatum)) < (100 * MONTH(@DatumNarozeni) + DAY(@DatumNarozeni))
              THEN 1 ELSE 0 END)
END

A pár ukázek špatných řešení:

DATEDIFF(year, @birthdate, @enddate)

SELECT DATEDIFF (year, @birthdate, @endDate)
  - CASE WHEN DATEPART(dy, @birthdate) <= DATEPART(dy, @endDate) THEN 1 ELSE 0 END

První pokus od sebe jen odečte letošní letopočet od letopočtu narození.
Druhý pokus zase nefunguje korektně s přestupnými roky, protože pak není počet dnů od 1.1. stejný.