asp.net 手动设置控件的风格(设置为自动套用格式里的一个)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 手动设置控件的风格(设置为自动套用格式里的一个)相关的知识,希望对你有一定的参考价值。
有些表格控件右击会有自动套用格式,我能否用代码的方式指定,
参考技术A 可以,在前台页面<asp: 控件 你点击空格会有相关的格式属性出现。asp.net:子控件的Visible属性啥时候自动设置?
【中文标题】asp.net:子控件的Visible属性啥时候自动设置?【英文标题】:asp.net: When is the Visible property of child controls automatically set?asp.net:子控件的Visible属性什么时候自动设置? 【发布时间】:2011-10-04 15:57:53 【问题描述】:示例 1:
<asp:Panel Visible="false" runat="server">
<asp:TextBox ID="textbox" runat="server" />
</asp:Panel>
这里,textbox.Visible
在代码中返回 false
(即使 TextBox.Visible
没有明确设置;它似乎从其不可见的父级“继承”了该属性)。
示例 2:
<asp:DataGrid ID="grid" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn Visible="False">
<ItemTemplate>
<asp:TextBox ID="textbox" runat="server" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
...
</asp:DataGrid>
这里,((TextBox)grid.Items[0].FindControl("textbox")).Visible
返回true
(假设 DataGrid 至少有一行)。
问题:这种不一致的行为是设计使然吗?在这两种情况下,TextBox 都不会呈现,因为某些父元素是不可见的。
(当然,在第二种情况下,文本框位于模板内,但我不是在模板定义中查询抽象文本框,而是在行号 0 中查询特定的具体文本框。)
背景: TextBox 是一个智能控件:It only saves its Text property in the ViewState if it's invisible. 这是有道理的:如果 TextBox 可见,则将其呈现为 HTML <input>
控件,并且其当前 Text
值提交于回发 - 无需通过 ViewState 再次提交。当然,如果 TextBox 不可见,则不会呈现它,因此,对 Text
属性的任何更改都会丢失。
现在,示例 2 给我们带来了一些麻烦。 textbox
认为它正在被渲染(根据 IL spy,它在 TextBox.SaveTextViewState
中检查自己的 Visible
属性),因此它不使用 ViewState 并且在代码中对 textbox.Text
所做的所有更改都将丢失。我现在想知道这是否是错误。
相关问题: How to get the set/real value of the Visible property in Asp.Net.
编辑:我已经为此创建了 Microsoft Connect 错误报告:
Webforms: Control.Visible does not recognize that the control is within an invisible DataGrid column【问题讨论】:
【参考方案1】: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
上实现的,因此如果父级的Visible
属性为false(在运行时并且如果指定了父级),它将始终返回false
。所以要回答标题中提出的问题,Visible
属性在任何时候都不会自动设置为false
,它只是在访问时进行评估。在GridView
TextBox.Visible
返回true
的情况下,按理说TextBox
的父控件不是TemplateColumn
,或者至少父控件没有Visible
属性设置为假。
编辑
因此,使用问题中的示例网格,如果您将控件链向上移动,您会看到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
属性按预期工作。
【讨论】:
+1,感谢您的解释。在接受它作为答案之前,我会稍等片刻,因为我仍然很好奇为什么这在示例 2 中无法正常工作。毕竟,您显示的代码递归调用_parent.Visible
,所以如果有 任何隐藏控制父树,而不仅仅是直接父。
@Heinzi 今天晚些时候我将尝试仔细研究示例 2。也许 GridView 有它自己的 Visible 实现之类的。
@Heinzi 我更新了我的答案,以说明为什么 TextBox 在第二个示例中显示为可见。不过,我感到困惑的一件事是,如果 TemplateColumn 不可见,TextBox 的值将如何变化?您是说当网格是数据绑定时您将 TextBox 设置为一个值,然后您无法在 PostBack 上将其读回?
谢谢,这很有趣!不过,我认为 TableCell 不应该有 Visible=True,因为它绝对没有被渲染(所以我猜“错误”就在那里)。关于 TextBox 的事情:是的,我正在更改代码中 Text
属性的值。由于 Textbox 认为它是可见的,它不会将值持久化到 ViewState 中,因此,该值在下一次回发时会丢失。
@Heinzi 我同意,你绝对可以提出TableCell
应该有Visible=false
的论点。此问题的解决方法是使用不同的控件来存储值,例如asp:Label
(或CommandArgument
属性,如果手边有一个按钮)。 Label
的值应该在回发时保持不变。以上是关于asp.net 手动设置控件的风格(设置为自动套用格式里的一个)的主要内容,如果未能解决你的问题,请参考以下文章
如何让 asp.net 登录控件自动验证以前经过身份验证的用户?
asp.net中GridView怎样进行分页,编辑,删除操作
如何将多个 cssclass 名称设置为启用 ASP.NET 主题的控件?