为什么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;
}
因为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
。如果div
是CheckBox
的兄弟,可以尝试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"]);
这样的东西可以工作吗?