vb.net findcontrol по части id

Мне нужно найти элемент управления на одной странице, но я не знаю полного идентификатора. Я знаю только часть идентификатора.

Чего я не хочу делать, так это:

control = Page.FindControl(part1 & part2)

Где part1 — известная часть идентификатора, а part2 — неизвестная часть.


person burk15    schedule 28.10.2014    source источник
comment
Так что в основном part2 - это пустая строка. Почему вы не знаете полного идентификатора?   -  person Tim Schmelter    schedule 28.10.2014


Ответы (1)


Что бы это ни стоило, вы можете использовать этот метод расширения, который ищет все дочерние элементы управления:

Module ControlExtensions
    <Runtime.CompilerServices.Extension()>
    Public Function FindControlPart(root As Control, IdStart As String) As Control
        Dim controls As New Stack(Of Control)(root.Controls.Cast(Of Control)())
        While controls.Count > 0
            Dim currentControl As Control = controls.Pop()
            If currentControl.ID.StartsWith(IdStart, StringComparison.InvariantCultureIgnoreCase) Then
                Return currentControl
            End If
            For Each child As Control In currentControl.Controls
                controls.Push(child)
            Next
        End While
        Return Nothing
    End Function
End Module

Использование:

Dim control As Control = Page.FindControlPart(part1)

Он возвращает первый элемент управления, который начинается с данной ID-части. Так что вполне возможно, что вы ошибаетесь. Это менее подвержено ошибкам, если вы используете правильный NamingContainer вместо Page как root.

person Tim Schmelter    schedule 28.10.2014
comment
Да, это может быть хорошим решением, но я не хочу проходить все элементы управления, потому что их много. Мне нужно получить контроль, не проходя через все элементы управления на странице - person burk15; 28.10.2014
comment
@ burk15: пожалуйста, прочитайте мое последнее предложение еще раз ;-) Если вы знаете родительский контроль, используйте его как root. Но обратите внимание, что у вас есть проблема, если вы ищете в GridView и у вас нет правильного GridViewRow. - person Tim Schmelter; 28.10.2014
comment
Веб-формы ASP.NET делают то же самое для поиска элементов управления (переходя через них). - person ps2goat; 28.10.2014
comment
@ps2goat: ASP.NET FindControl не выполняет рекурсивный поиск элементов управления (включая дочерние элементы управления), как это делает мой метод. Control.FindControl просто выполняет поиск текущего NamingContainer. - person Tim Schmelter; 28.10.2014
comment
@TimSchmelter, я не говорил, что ваш код неправильный, я имел в виду, что не нужно бояться зацикливания. Вы правы в том, что ASP.NET ищет только дочерние элементы первого уровня. - person ps2goat; 28.10.2014