Вопрос о видимости вложенного элемента управления - PullRequest
2 голосов
/ 14 апреля 2011

Заметил это, работая над ошибкой сегодня утром. У меня есть что-то вроде этого на моей странице:

<div id="dvDropShipMsgWrap" runat="server" visible="false" class="systemMsgCon">
    <div id="dvDropShipMsg" class="systemMsg plus">
        <asp:Label ID="lblAttributeDropShipMsg" runat="server" ForeColor="#333333" Visible="false"
            Style="font-weight: normal;"></asp:Label>
    </div>
</div>

И это было в коде:

if(myCondition)
    lblAttributeDropShipMsg.Visible = p.DropShipable;
else
    <snip>

dvDropShipMsgWrap.Visible = p.DropShipable;

Отслеживая код, я обнаружил, что свойство lblAttributeDropShipMsg.Visible всегда будет ложным, даже если для него установлено значение true Меняем это на:

dvDropShipMsgWrap.Visible = p.DropShipable;
lblAttributeDropShipMsg.Visible = p.DropShipable;

исправил проблему.

Кажется странным, что я не могу установить видимость вложенного элемента управления до установки его родителя. Кто-нибудь может дать какое-то просветление?

1 Ответ

7 голосов
/ 15 апреля 2011

Я провел несколько тестов, используя точно такую ​​же декларативную разметку, как в вашем примере.Мой код ниже показан ниже.Комментарии справа показывают значения свойств .Visible двух элементов после выполнения кода слева от каждого комментария.Я использовал локальные переменные parent и child, чтобы прояснить ситуацию.

 1   var parent = dvDropShipMsgWrap;             //  parent  child
 2   var child = lblAttributeDropShipMsg;        //  false   false  (initial values)
 3   child.Visible = true;                       //  false   false 
 4   parent.Visible = true;                      //  true    true
 5   parent.Visible = false;                     //  false   false
 6   child.Visible = false;                      //  false   false
 7   parent.Visible = true;                      //  true    false 

Я думаю, что результатом в строке 3, вероятно, является поведение, которое вы наблюдали.Но здесь происходит гораздо больше, чем может показаться на первый взгляд.

Если вы посмотрите на код CIL, который получает / устанавливает свойство .Visible элемента управления, вы обнаружите, что установка значения элемента управления действительно влияет на значениевнутреннего битового флага, независимо от видимости родителя.Однако, получая значение свойства .Visible элемента управления, код пересекает путь, начинающийся с данного элемента управления, вплоть до его родителя, затем до родительского элемента родителя и т. Д., Вплоть до корня иерархии элементов управления.Если внутренний битовый флаг какого-либо элемента управления на этом пути указывает «не видно», обход останавливается, и возвращается значение false.Единственный способ вернуть true - это пройти весь путь до корня, не найдя никакого невидимого элемента управления.

Итак, для подведения итогов, установка свойства .Visible элемента управления «запоминается» внутри, но значение свойства будет возвращено как false, если какой-либо из его предков не виден.Когда все предки элемента управления становятся видимыми, значение свойства .Visible элемента управления будет «запомненным» значением с момента его последней установки.

...