HAVIT Knowledge Base

Vývoj webových aplikací, .NET, SQL, návrh
Welcome to HAVIT Knowledge Base Sign in | Join | Help
-
Home Články Forums Obrázky Soubory

ASP.NET

Vývoj webových aplikací ASP.NET

Nekonzistence vlastnosti Visible třídy System.Web.UI.Control

Vlastnost Visible třídy Control používáme k zobrazení a skrytí controlu ve stránce. Dokumentace říká něco mírně komplikovanějšího: Gets or sets a value that indicates whether a server control is rendered as UI on the page. Tato zdánlivá komplikovanost má zásadní význam. Getter property totiž vrací false, pokud je skrytý control nebo některý z jeho rodičů ve stromu controlů.
Z mého pohledu jde o dosti nezvyklé a vůči ostatním vlastnostem nekonzistentní chování. Neočekával bych, že po nastavení vlastnosti na true budu číst false. Doporučuji tedy s vlastností Visible pracovat náležitě opatrně.

Příklad

Mějme dva panely (PrvniPanel a DruhyPanel), přičemž chceme, aby byl vidět právě jeden z nich. Oba panely jsou obaleny vnějším panelem.

<asp:Panel ID="VnejsiPanel" Visible="false" runat="server">
    <asp:Panel ID="PrvniPanel" runat="server">
        ...
    </asp:Panel>
    <asp:Panel ID="DruhyPanel" runat="server">
        ...
    </asp:Panel>
</asp:Panel>


1
2
3
PrvniPanel.Visible = true; // nějaký výraz, který tentokrát vrací true
DruhyPanel.Visible = !PrvniPanel.Visible
VnejsiPanel.Visible = true;


  • Na řádku 1 nastavíme první panel k zobrazení.
  • Na řádku 2 přečteme property PrvniPanel.Visible. Ačkoliv jsme ji na řádku 1 nastavili na true, vrací false, neboť rodič VnejsiPanel ve stromu controlů je skrytý. I druhému panelu tedy nastavíme Visible na true.
  • Na řádku 3 nastavíme vnější panel k zobrazení.
  • Postupně jsme všem panelům nastavili Visible na true a bude tedy vidět vše, ačkoliv to tak na první pohled nevypadá.

Published 3. června 2008 9:12 by Jiří Kanda

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

David Hojdar said:

Doporučuji podívat se vlastnost Visible na WinFormovém kontrolu. Tam je totiž situace ještě zajímavější. Věřím, že většina programátorů vlastně neví co ta vlastnost vlastně říká, a to, že ji používají k jejich plné spokojenosti je jen shoda okolností. Schválně se podívejte do nápovědy. Jeden příklad za všechny.

v události Load WinForm formuláře (v něm jedno tlačítko) mám následující kód:

button1.Visible = true;

// jaká si myslíte, že je nyní hodnota button1.Visible ?

// Enjoy

června 3, 2008 16:17
 

Marián Košťál said:

Ano, je to trochu komplikovane, pre spravne pouzitie treba poznat implementaciu vlastnosti Visible. Uvedeny priklad je vhodne upravit tak, ze poradie riadkov bude 3, 1, 2 potom to bude tak, ako by sme predpokladali.

června 4, 2008 10:20
 

Jiří Kanda said:

To je samozřejmě možné, ale ne vždy tak jednoduché. Co když je vnější panel někde ve stránce, zatím co vnitřní panely jsou v nějakém UserControlu, který o svém okolí nemá ponětí? Porušením guidance pro tvorbu user controlů u této vlastnosti (čteme něco jiného než jsme zapsali) způsobuje neočekávané komplikace. Spíš než měnit pořadí řádek bych tedy doporučil nepoužívat způsob nastavování hodnoty vlastnosti uvedený na druhém řádku.

června 4, 2008 10:37

What do you think?

(required) 
(optional)
(required) 
Enter the code you see below

Submit