添加动态控件时,在当前上下文中确定ContentPlaceHolder的ClientID

时间:2011-03-09 06:31:51

标签: asp.net controls placeholder master contentplaceholder

我正在动态创建一个表格控件,其中包含表格每行的一系列标签和下拉列表,其中还包括标签和下拉列表中的一些javascript。

    Dim dd As New DropDownList
    Dim ds As System.Data.DataTable = GetTable("EmployeePosition")
    Dim prefix As String = "Position"
    dd.ID = prefix & i
    dd.DataSource = ds
    dd.DataValueField = "PositionID"
    dd.DataTextField = "PositionName"
    dd.Attributes.Add("onchange", "checkDuplication(this,'" & prefix & "');")
    dd.DataBind()

javascript函数'onchange'循环遍历以前缀开头的所有下拉控件,并检查任何下拉列表的值是否相同。

然后将此表添加到PlaceHolder控件中,该控件又包含在我的母版页上的ContentPlaceHolder控件中。

    Master_Content1_Position1

我重新安装的问题是放置在Master Pages和ContentPlaceHolders上时控件的自动命名,特别是涉及javascript时。

到目前为止,我提出的最佳解决方案是找到包含PlaceHolder的ContentPlaceHolder,检索ClientID并将该值传递给表创建者。

        Dim cph As ContentPlaceHolder = Me.Master.FindControl("Content1")
        Dim tbl As Table = New PositionTable(cph.ClientID).ToTable
        PlaceHolder1.Controls.Add(tbl)

有没有办法确定控件或PlaceHolder当前的ContentPlaceHolder是什么,并返回ClientID或UniqueID,以便我可以将此值传递给我的表创建者,以便为javascript函数添加前缀以指向正确的控件使用元素ID?最好使用PlaceHolder或Control作为基值?

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用Control类的Parent属性。如果您的控件是它的第一级子级,那将返回ContentPlaceHolder控件。如果没有,那么您可以使用Parent of Parent(依此类推)并检查它是否是ConterPlaceHolder:

private ContentPlaceHolder GetParentContentPlaceHolder()
{
    Control nextParent = this.Parent;
    while (nextParent != null)
    {
        ContentPlaceHolder parentContentPlaceHolder = nextParent as ContentPlaceHolder;
        if (parentContentPlaceHolder != null)
        {
            return parentContentPlaceHolder;
        }

        nextParent = nextParent.Parent;
    }

    return null;
}