1

我有 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“divRegisteration”,它在自定义属性“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;     
}
4

3 回答 3

3

因为 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>
于 2013-03-28T23:13:49.363 回答
1

FindControl只搜索当前命名上下文,不遍历层次结构。通过以您的方式称呼FindControl他们,它正在使用this.FindControl. 尝试类似的东西,chk.Parent.FindControl(...)如果它divCheckBox

编辑:

啊,好吧,Attributes 集合是“仅用于渲染目的”。它似乎没有填充 ASPX HTML 声明中指定的属性。

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

于 2013-03-28T23:12:37.250 回答
0

在我的脑海中 - 复选框没有InputAttributes 集合吗?

诚然,未经测试的刺伤:

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

类似的东西有用吗?

于 2013-03-28T23:05:56.353 回答