SelectedIndex添加控件

时间:2011-12-03 01:30:26

标签: asp.net vb.net drop-down-menu

根据下拉菜单中“其他”的选择,我想在<p>标记中添加标签和文本框。我在runat=server代码中添加了<p>

    Protected Sub deptDdl_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles deptDdl.SelectedIndexChanged
        'If the user chooses other for the department type add
        'a label and textbox to allow them to fill in a department not listed

        If deptDdl.SelectedValue.ToString = "Other" Then
            Dim deptLbl As Label = New Label
            deptLbl.Text = "Enter the Department Name"
            Dim deptTb As TextBox = New TextBox
            deptTb.MaxLength = 20

            Page.FindControl("m_ContentPlaceHolder1_deptPtag").Controls.AddAt(2, deptLbl)
            Page.FindControl("m_ContentPlaceHolder1_deptPtag").Controls.AddAt(3, deptTb)
        End If
    End Sub

我一直得到一个未处理的异常,声明对象引用没有设置为对象的实例。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果您的<p> - 标记为runat=server,您应该可以直接在codebehind -file中引用它。给它一个ID deptPtag,然后这应该在designer.vb文件中自动生成:

Protected WithEvents deptPtag As Global.System.Web.UI.HtmlControls.HtmlGenericControl

但是你还必须确保在每次回发时重新创建动态控件(最新的Page_Load,事件对于重新加载ViewState来说太晚了)。否则,您将无法阅读deptTb.Text或处理TextChanged - 事件。 每个回发的ID必须相同才能正确加载ViewState

我对this question的回答解释了您的NullReferenceException。 这是MasterPage内容页面中FindControl的特殊行为。