У меня есть логическое значение, которое не устанавливается должным образом.Чем это вызвано? - PullRequest
0 голосов
/ 03 марта 2011

У меня есть следующий код в пользовательском элементе управления 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. Урок, который я усвоил здесь, заключается в том, чтобы не создавать зависимость видимости управления друг от друга таким образом, когда есть альтернативный (и такой же простой) метод.

Ответы [ 3 ]

2 голосов
/ 03 марта 2011

Средство получения Visible вернет false, если какие-либо предки элемента управления не видны.

0 голосов
/ 03 марта 2011

Проверьте, что у него есть какой-либо родительский элемент управления, который скрыт, добавление некоторого кода сделает вещи более понятными.Это может быть проблемой наследования родительского свойства ... Но я не уверен .. до тех пор, пока код не существует

0 голосов
/ 03 марта 2011

панель, которую вы используете, также определяет свойство Visible? это может быть затенение свойства Visible от базового класса, что означает, что панель имеет 2 свойства. один на родителя и один на ребенка, имеющие разные значения. т.е.
myPanel.Visible = False
myPanel.Base.Visible = True

...