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」は、カスタム属性「myDiv」で対処されるdiv「divRegisteration」の表示または非表示を担当します。

問題は、コード ビハインドで属性「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 によって 1 つの関連する 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 に答える