为什么c#找不到这个属性?asp.net

本文关键字:asp net 属性 找不到 为什么 | 更新日期: 2023-09-27 18:06:29

我有4个复选框,每个复选框下面是一个div。每个复选框负责显示或隐藏它下面的复选框。例如:

    <asp:CheckBox ID="CheckBox1" myDiv="divRegisteration" myText=" הרשמה - " runat="server" AutoPostBack="true" Font-Size="18px" Font-Bold="true" Text=" הרשמה - הצג" OnCheckedChanged="CheckBox_CheckedChanged"/>
    <div id="divRegisteration" runat="server" visible="false">

复选框'CheckBox1'负责显示或隐藏div "divregistration ",这是在自定义属性"myDiv"中解决的。

的问题是,在后面的代码中,它没有找到属性"myDiv":

if (((CheckBox)(sender)).Checked==true)
{
  CheckBox chk = (CheckBox)(sender);
  object div = FindControl(chk.Attributes["myDiv"]); //// it does not find myDiv, and therefore doesn't find the control so the program crashes.
  HtmlGenericControl addressDiv = (HtmlGenericControl)(div);
  addressDiv.Visible = true;     
}

为什么c#找不到这个属性?asp.net

因为Attributes集合不是这样工作的:

获取任意属性的集合(仅用于呈现)与控件上的属性不对应

如果你想拥有这样的属性,你需要创建你自己的自定义控件,它拥有你想要的属性。或者,作为一种替代方法,创建一个承载单个CheckBox和相关div或诸如此类的UserControl——然后您可以在代码隐藏中通过ID引用一个相关的div。实例化该控件的多个实例,然后就可以开始了。

编辑:我的WebForms-fu有点生锈了,但这里什么也没有。

控制类:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace UserControlExample {
    [ParseChildren(false)]
    public class TogglePanel : UserControl {
        private CheckBox cbToggleContent = new CheckBox();
        private Panel pnlContentPlaceholder = new Panel();
        public TogglePanel() {
            Load += OnLoad;
        }
        public bool Checked { get; set; }
        private void OnLoad(object sender, EventArgs eventArgs) {
            Controls.Add(cbToggleContent);
            Controls.Add(pnlContentPlaceholder);
            if (!IsPostBack) {
                cbToggleContent.Checked = Checked;
                pnlContentPlaceholder.Visible = Checked;
            }
            cbToggleContent.AutoPostBack = true;
            cbToggleContent.CheckedChanged += (s, args) => {
                pnlContentPlaceholder.Visible = cbToggleContent.Checked;
            };
        }
        protected override void AddParsedSubObject(object obj) {
            pnlContentPlaceholder.Controls.Add((Control) obj);
        }
    }
}

及其用法:

<%@ Register TagPrefix="a" Namespace="UserControlExample" Assembly="UserControlExample" %>
<a:TogglePanel Checked="True" runat="server">
    This stuff here will be shown or hidden based on the checkbox
</a:TogglePanel>

FindControl仅搜索当前命名上下文,而不遍历层次结构。通过按你的方式调用FindControl,它使用的是this.FindControl。如果divCheckBox的兄弟,可以尝试chk.Parent.FindControl(...)

编辑:

啊,属性集合"仅用于呈现目的"。它似乎没有填充ASPX HTML声明中指定的属性。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.attributes.aspx

我的头-复选框没有一个InputAttributes集合?

不可否认,这是一个未经测试的尝试:

CheckBox chk = (CheckBox)(sender);
object div = FindControl(chk.InputAttributes["myDiv"]);

这样的东西可以工作吗?