Вместо того, чтобы зацикливать все элементы управления во всем дереве элементов управления, вы можете разделить его и перейти из группы на один элемент управления за раз:
public Control GetControlByClientId(string clientId)
{
Queue<string> clientIds = new Queue<string>(clientId.Split(ClientIDSeparator));
Control root = this.Page;
string subControlId = null;
while (clientIds.Count > 0)
{
if (subControlId == null)
{
subControlId = clientIds.Dequeue();
}
else
{
subControlId += ClientIDSeparator + clientIds.Dequeue();
}
Control subControl = root.FindControl(subControlId);
if (subControl != null)
{
root = subControl;
subControlId = null;
}
}
if (root.ClientID == clientId)
{
return root;
}
else
{
throw new ArgumentOutOfRangeException();
}
}
Примечание: эта функция использует ClientIDSeparator - это защищенное свойство, определенное в классе Control
, поэтому этот метод должен использоваться в чем-то, что наследует Control.