Определить ClientID ContentPlaceHolder в текущем контексте при добавлении динамических элементов управления - PullRequest
1 голос
/ 09 марта 2011

Я создаю элемент управления таблицей на лету, который содержит серию меток и раскрывающихся списков для каждой строки таблицы, которая также включает в себя некоторый 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

Проблема, с которой я повторно обращаюсь, заключается в автоматическом присвоении именэлементов управления, когда они размещаются на главных страницах и в ContentPlaceHolders, особенно когда речь идет о javascript.

Лучшее решение, которое я до сих пор придумал, - это найти ContentPlaceHolder, который будет содержать PlaceHolder, извлечь ClientID и передать это значениена стол создателя.

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

Есть ли способ определить, в каком текущем ContentPlaceHolder находится элемент управления или PlaceHolder, и вернуть ClientID или UniqueID, чтобы я мог передать это значение моему создателю таблицы, чтобы префиксировать функции javascript для указанияна правильные элементы управления, используя идентификатор элемента?Предпочтительно использовать PlaceHolder или Control, который будет заполняться как базовое значение?

Спасибо.

1 Ответ

2 голосов
/ 09 марта 2011

Вы можете использовать свойство Parent класса Control.Это вернет элемент управления 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;
}
...