Свойство Get of Visible элемента управления рекурсивно просматривает дерево, чтобы указать, будет ли отображаться элемент управления или нет.
Мне нужен способ узнать, каково «локальное» видимое значение элемента управления независимо от того, на что установлены его родительские элементы управления. то есть было ли для него установлено значение true или false.
Я видел этот вопрос, Как получить «реальное» значение свойства Visible? , которое использует Reflection для получения локального состояния, однако я не смог заставить это работать для WebControls , Это также довольно грязный метод получения значения.
Я предложил следующий метод расширения. Он работает, удаляя элемент управления из его родителя, проверяя свойство, а затем помещая элемент управления обратно туда, где он его нашел.
public static bool LocalVisible(this Control control)
{
//Get a reference to the parent
Control parent = control.Parent;
//Find where in the parent the control is.
int index = parent.Controls.IndexOf(control);
//Remove the control from the parent.
parent.Controls.Remove(control);
//Store the visible state of the control now it has no parent.
bool visible = control.Visible;
//Add the control back where it was in the parent.
parent.Controls.AddAt(index, control);
//Return the stored visible value.
return visible;
}
Это приемлемый способ сделать это? Работает нормально, проблем с производительностью не возникало. Это просто кажется очень грязным, и я не сомневаюсь, что могут быть случаи, когда он может потерпеть неудачу (например, при фактическом рендеринге).
Если у кого-то есть мысли по поводу этого решения или, что еще лучше, более удачного способа найти значение, тогда это было бы замечательно.