Переопределенный Refresh () не вызывается для дочернего UserControl - PullRequest
0 голосов
/ 23 февраля 2011

Я сталкиваюсь со странной проблемой (WinXP / .NET 2.0). Я использую WinForm UserControl, который переопределяет Refresh ():

public override void Refresh()
    {
        DoSomeStuff();
        base.Refresh();
    }

Я добавляю этот UserControl как дочерний элемент в другой элемент управления и хочу обновить все дочерние элементы управления:

ParentControl : UserControl
{
  [...]

  public ParentControl (...)
  {
    [...]

    UserControl ChildControl = ModelEngine.MainControl; // UserControl as mentioned above
    this.Controls.Add(ChildControl);

    [...]

    ModelEngine.MainControl.Refresh(); //#1
    this.Refresh(); // #2
  }
}

Вызов метода Refresh () напрямую (# 1) работает нормально. Я ожидал, что смогу вызвать Refresh () для родительского класса (# 2), и это вызовет рекурсивный Refresh () для всех дочерних элементов управления (как описано в MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx).. Однако переопределенная функция Refresh () в дочерний контроль не выполняется. Кстати: установка ControlStyles.UserPaint в значение true не изменила поведение.

Конечно, я мог бы вызвать Refresh () напрямую (как в # 1) или написать свой рекурсивный Refresh (). Но мне интересно, является ли эта ошибка указанием на большую проблему где-то в моем коде ...

Так есть ли очевидная ошибка в моем коде или это обычное поведение .NET?

1 Ответ

1 голос
/ 23 февраля 2011

Как говорится на странице, на которую вы ссылались:

Примечания для наследников

При переопределении Refresh в производном класс, обязательно позвони в базу метод Refresh класса, поэтому контроль и его дочерние элементы управления признаны недействительными и перерисовать.

Вы должны явно вызвать базовый метод Refresh(). В противном случае не не сможет запустить базовый метод, и вся концепция переопределений будет потеряна.

...