0

ASP.NET ライフサイクル イベントと少し混乱しています。チェックボックスをオンにすると、ラベルとテキストボックスが動的に作成されます。これは、チェックボックスの oncheckchanged イベントで行われます。完全なポストバックなしで、チェックボックスで Ajax が有効になっています。

新しく作成されたテキスト ボックスに値を入力しています。保存ボタンをクリックすると、ボタン クリック イベントで作成されたコントロールが見つかりません。では、ページのビューステートは、チェックボックス イベントで作成された動的コントロールをどのように記憶し、ボタン保存イベントでその値にアクセスするのでしょうか? マークアップ:

                  <tr> <td> <asp:CheckBox ID="chkType" runat="server" Text="Medical Procedure" OnCheckedChanged="ChkMedicalProc_Clicked"></td></tr>

                <tr><td colspan="2">
                    <asp:PlaceHolder ID="dyna" EnableViewState="true" runat="server"></asp:PlaceHolder>
                </td></tr>

checkedchanged イベントの背後にあるコード:

TableRow tr = new TableRow();
            TableCell tc1 = new TableCell();
            TableCell tc2 = new TableCell();
            Label lbl = new Label();
            lbl.Text = string.Empty;
            lbl.Text = (_queryParam[i].Param_Name + " (" + _queryParam[i].Param_Type + ") (" + _queryParam[i].Param_Length + ")").ToString();
            lbl.Style.Add("font-size", "11px");
            lbl.Style.Add("font-family", "Arial");
            _txtBox = new TextBox();
            _txtBox.ID = ctrlId;
            _txtBox.CssClass = "textEntry";
            _txtBox.Text = string.Empty;
            _txtBox.Text = _queryParam[i].Param_Value;
            tc1.Style.Add("width", "21.8%");
            tc1.Controls.Add(lbl);
            tc2.Controls.Add(_txtBox);
            tr.Cells.Add(tc1);
            tr.Cells.Add(tc2);

            _tbl.Rows.Add(tr);

            this.Master.FindControl("pagecontent1").FindControl("dyna").Controls.Add(_tbl);

ボタンのクリック イベントを保存します。

  for (int i = 0; i < box.Count; i++)
                                {
                                    TextBox boxValue= this.Page.Master.FindControl("pagecontent1").FindControl("dyna").FindControl("txtBoxParams-" + i) as TextBox;
                                   //I get object reference error on boxValue
}
4

2 に答える 2

0

次の再帰関数を使用すると、動的テーブル内の任意のコントロールを取得できます

public static Control DeepFindControl(Control c, string id) {

        if (c.ID == id)
        {
            return c;
        }
        if (c.HasControls())
        {
            Control temp;
            foreach (var subcontrol in c.Controls)
            {
                temp = DeepFindControl((Control)subcontrol, id);
                if (temp != null)
                {
                    return temp;
                }
            }
        }
        return null;
    }


見つかった後にコントロールの値を受け取るには、コントロールの名前を知っている必要があり、同じタイプの別の新しく作成されたコントロールで値を受け取ります...「DeepFindControlから返されたコントロールをキャストします」
例...

コントロール C1 = DeepFindControl(DynamicTableName, ControlNAme);
テキストボックス _txtBox = (テキストボックス)C1;

于 2012-09-12T00:49:57.213 に答える
0

動的コントロールはポストバック時に失われるため、ページ リクエストごとに再度動的に追加する必要があります。

あなたの例では、ページに常にラベル/テキストボックスを配置する方が簡単かもしれませんがasp:panel、プロパティを切り替えるVisibleか、javascriptを介して表示/非表示にします。

ポストバック中のこれらの動的コントロールの値については、同じ を使用してそれらを再作成するとID、asp.net はビューステート情報を使用して適切な入力値にそれらを自動的に再初期化します。

ダイナミック コントロールの取り扱いに関する詳細については、次の Web サイトがかなり正確なようです: http://www.4guysfromrolla.com/articles/081402-1.aspx

于 2012-09-12T00:32:54.670 に答える