Я нашел возможное объяснение этому. Наличие TextBox добавляет дочерний элемент управления к вашему элементу управления, который является IPostbackDataHandler. Чтобы загрузить данные поста, страница должна сначала найти элемент управления, который, конечно, делает это, вызывая FindControl. Когда FindControl делает свое дело, он в конечном итоге получает доступ к коллекции Controls вашего элемента управления. Поскольку ваш элемент управления является CompositeControl, он вызывает EnsureChildControls, который вызывает CreateChildControls.
Все это происходит до санкционирования. Извлеките TextBox, и коллекция Controls больше не будет доступна до проверки, и, следовательно, валидатор не будет создан до окончания проверки (скорее всего, во время предварительного представления)
Поскольку ваш валидатор не существует на этапе валидации, он не вызывается. Я рекомендую добавить вызов EnsureChildControls до того, как произойдет проверка.
protected override void OnLoad(EventArgs e)
{
EnsureChildControls();
base.OnLoad(e);
}