访问选中复选框时动态创建的文本框值
本文关键字:文本 创建 动态 复选框 访问 | 更新日期: 2025-04-30 11:55:23
我有点混淆了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
}
动态控件在回发时丢失,因此在每个页面请求中都必须重新动态添加它们。
尽管在您的示例中,始终在页面上有标签/文本框,但将其包含在asp:panel
中可能会更容易,您可以在其中切换Visible
属性,或者通过javascript显示/隐藏它。
至于回发期间这些动态控件的值,如果使用相同的ID
重新创建它们,asp.net将使用视图状态信息自动将它们重新初始化为正确的输入值。
有关处理动态控制的更多信息,此网站似乎相当准确:https://web.archive.org/web/20211020131055/https://www.4guysfromrolla.com/articles/081402-1.aspx
使用以下递归函数,您将能够检索动态表中的任何控件
公共静态控件DeepFindControl(控件c,字符串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返回的控件"
例如…
Control C1=DeepFindControl(DynamicTableName,ControlNAme)
TextBox_txtBox=(TextBox)C1;