【问题标题】:How to use DataBinding to set the ID of asp:CheckBox controls如何使用DataBinding设置asp:CheckBox控件的ID
【发布时间】:2009-07-28 10:01:43
【问题描述】:

我有一些 ASP,我希望看起来像这样:

<asp:DataGrid ID="dgEnum" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:TemplateColumn>
            <ItemTemplate>
                <asp:CheckBox ID="<%# some big DataBinder expression %>" runat="server" />
            </ItemTemplate>
        </asp:TemplateColumn>
    </Columns>
</asp:DataGrid>

但这给了我一个:

解析器错误消息: 控件的 ID 属性只能使用标记中的 ID 属性和简单值来设置。示例:&lt;asp:Button runat="server" id="Button1" /&gt;

有人知道如何破解吗?

【问题讨论】:

    标签: asp.net data-binding


    【解决方案1】:

    有人知道如何破解它吗?

    你不能,你也不能。您可以将所需的数据存储在 ID 之外的某个位置。至少可以使用兄弟HiddenField

    <script runat="server">
        void Checkbox_CheckedChanged(object sender, EventArgs e) {
           var c = (Checkbox)sender;
           if (!c.Checked) {
               return;
           }
           var hfv = (HiddenField)c.Parent.FindControl("hfvMyData");
           var myData = hfv.Value;
           /* Do something with myData */
        }
    </script>
    
    <asp:DataGrid ID="dgEnum" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:TemplateColumn>
                <ItemTemplate>
                   <asp:CheckBox runat="server" OnCheckedChanged="Checkbox_CheckedChanged" />
                   <asp:HiddenField id="hfvMyData" runat="server" Value='<%# Eval("MyData") %>' />
                </ItemTemplate>
            </asp:TemplateColumn>
        </Columns>
    </asp:DataGrid>    
    

    其他选项可以是 DataKeys、服务器端(可能是缓存或会话数据)索引列表或 ViewState 索引列表。

    如果你真的想把 WebForms 混为一谈,你可以把你的数据放到 CssClass 中……但这太疯狂了。 ;)

    【讨论】:

    • 这可能是正确的做法。不幸的是,我宁愿怀疑我的用例会搞砸它,因为c.Parent.FindControl 在我重建表单之前无法工作,并且我需要在重建表单之前使用复选框数据。 -- OTOH 我也许可以使用一些客户端 JS 来玩隐藏字段...
    • @BCS “我需要在重建 [表单] 之前使用复选框数据” - 我不太明白。您在构建它的最少时间没有复选框数据,为什么现在需要它?您只需要像以前一样在 Postback 之后创建复选框。然后,ASP.NET 将负责对任何已检查的内容调用 Checked_Changed。 然后您可以根据需要删除(或重建)表单的元素。
    【解决方案2】:

    不确定您打算在这里做什么,但您可以直接进入 html 控件,即&lt;input type="checkbox" id="&lt;%# some expresssion %&gt;" /&gt;

    或者你不这样做并在服务器端查询它。 IE。找到您想要的行,然后使用FindControls() 获取该行的复选框。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2017-01-10
    相关资源
    最近更新 更多