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 &lt;input&gt; 控件,并且其当前 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】:

TextBoxPanel 都继承自 WebControl,后者继承自 ControlControlVisible 属性具有以下定义:

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,它只是在访问时进行评估。在GridViewTextBox.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;
    

在我看来,DataGridVisisble 属性按预期工作。

【讨论】:

+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 中 ListBox控件中 怎么设置

asp.net中GridView怎样进行分页,编辑,删除操作

如何将多个 cssclass 名称设置为启用 ASP.NET 主题的控件?

如何把asp.net 中文本框控件的text属性设置为int型?

asp.net 用户登录控件如何使用Access数据库