【问题标题】:Access text box value created dynamically when check box is checked选中复选框时访问动态创建的文本框值
【发布时间】:2012-09-12 08:59:16
【问题描述】:

我对 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
}

【问题讨论】:

  • 您是否在每次回发时创建控件。如果不是,控件在回发时丢失,您无法访问它们..

标签: c# asp.net


【解决方案1】:

动态控件在回发时丢失,因此在每次页面请求时,您必须再次动态添加它们。

尽管对于您的示例,始终在页面上使用标签/文本框可能更容易,但将其包含在 asp:panel 中,您可以在其上切换 Visible 属性,或通过 javascript 显示/隐藏它。

对于这些动态控件在回发期间的值,如果您使用相同的ID 重新创建它们,asp.net 将使用视图状态信息自动将它们重新初始化为正确的输入值。

有关处理动态控件的更多信息,这个网站似乎相当准确:http://www.4guysfromrolla.com/articles/081402-1.aspx

【讨论】:

    【解决方案2】:

    使用以下递归函数,您将能够检索动态表中的任何控件

    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;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多