У меня есть следующий код в пользовательском элементе управления Asp.Net:
Me.pnlAddComment.Visible = MyBase.Associate.IsAgent()
Me.lblRating.Visible = Me.pnlAddComment.Visible
Me.Rating1.Visible = Me.pnlAddComment.Visible
Теперь, когда я запускаю этот код, значение MyBase.Associate.IsAgent()
равно true. Тем не менее, ни в коем случае Me.pnlAddComment.Visible
не оценивается как истина. Когда я вывожу результаты как операторы Response.Write, он показывает IsAgent = True, pnlAddComment.Visible = False. Когда я запускаю его в режиме отладки, поместите разрыв строки на вторую строку выше, чтобы разрешить возникновение набора: я поместил курсор мыши на IsAgent, и он отобразил «True»; Я поместил курсор мыши над pnlAddComment.Visible, и он отобразил «False».
Сотрудник предположил, что вполне возможно, что это Panel.Visible
код черного ящика в получателе, который позволяет выполнить назначение, но возвращает ложь, потому что некоторый родительский объект установлен (в тот момент в выполнении кода) на Ложь. Я просмотрел родительские объекты, и ни в коем случае ни один из них не отображается как видимый.
Если бы это был ссылочный тип, я мог бы быть уверен, что какой-то другой процесс изменяет ссылку между этим назначением и его фактическим использованием (в Render), но это происходит прямо в этой строке кода.
Что может привести к тому, что это логическое назначение будет вести себя так, не вызывая исключения?
Решение:
Ответ оказался родительским объектом в иерархии элементов управления, расположенным вне самого пользовательского элемента управления. Поскольку ничего не было явно установлено в false, и я согласился с @Shadow Wizard, @Damien_The_Unbeliever и @ CodeMonkey1, что это должен был быть какой-то внешний элемент управления, влияющий на панель в тот момент, я решил поместить рекурсивный цикл while, чтобы проверить родительский элемент каждого пользовательский элемент управления в иерархии на тот момент:
Dim o as Object = Me.pnlAddComment.Parent
While o IsNot Nothing
Me.lblMessage.Text &= "<br />" & o.ID & ": " & o.Visible.ToString()
o = o.Parent
End While
Затем я просто запустил это на сервере, и вывод вернулся с полной видимостью каждого элемента управления в цепочке. В итоге произошло то, что этот элемент управления содержался в элементе управления View в MultiView. Ожидается, что этот элемент управления представлением будет видимым, поскольку предполагается, что он является ActiveView для этого конкретного вызова, но в момент жизненного цикла, когда выполняется мой код, представление не было идентифицировано как активное представление. Поскольку он официально не активен, представление неявно ложно, и все дочерние элементы управления возвращают значение false при запросе Visible.
Остальные задания ведут себя, как и ожидалось, с этого момента. Элемент управления lblRating имеет значение false (навсегда), поскольку в этот момент правильная настройка видимости для pnlAddComment имеет значение false. Урок, который я усвоил здесь, заключается в том, чтобы не создавать зависимость видимости управления друг от друга таким образом, когда есть альтернативный (и такой же простой) метод.