TextBox
и Panel
оба наследуются от WebControl
, который наследуется от Control
.Control
имеет следующее определение для свойства Visible
:
public virtual bool Visible
{
get
{
return !this.flags[16] &&
(this._parent == null || this.DesignMode || this._parent.Visible);
}
set
{
if (this.flags[2])
{
bool flag = !this.flags[16];
if (flag != value)
{
this.flags.Set(32);
}
}
if (!value)
{
this.flags.Set(16);
return;
}
this.flags.Clear(16);
}
}
Поскольку Visible
не реализован непосредственно в TextBox
, он всегда вернет false
, если свойство Visible
parent является ложным (во время выполнения и если указан родитель).Таким образом, чтобы ответить на вопрос, заданный в заголовке, свойство Visible
не устанавливается автоматически на false
в любой момент времени, оно просто оценивается при обращении к нему.В случае GridView
, где TextBox.Visible
возвращает true
, очевидно, что родительский элемент управления TextBox
не является TemplateColumn
или, по крайней мере, родитель не имеет своего свойства Visible
установлено в false.
EDIT Итак, используя примерную сетку в вопросе, если вы поднимите цепочку элементов управления вверх, вы увидите, что все родительские элементы управления для TextBox
равны Visible
.Я использовал приведенный ниже код, и вот что получилось:
TextBox (ClientID = grid_textbox_0, Visible = True)
TableCell (ClientID = grid_ctl00_0, Visible = True)
DataGridItem (ClientID = grid, Visible = True)
ChildTable (ClientID = grid_ctl00, Visible = True)
DataGrid (ClientID = grid, Visible = True)
HtmlForm (ClientID = form1, Visible = True)
Код:
protected void btnSubmit_Click(object sender, EventArgs e)
{
var control = grid.Items[0].FindControl("textbox");
while(control != this && control != null)
{
Response.Write(string.Format("{0} (ClientID = {1}, Visible = {2})",
control.GetType().Name, control.ClientID, control.Visible));
Response.Write("<br />");
control = control.Parent;
}
}
Мне кажется, что свойства DataGrid
и Visisble
работают как положено.