Я не уверен, и это должно было бы быть проверено, но эта статья заставляет меня поверить, что то, что я собираюсь сказать, правда.
В принципе, если вы идете по Документация MSDN :
Происходит при изменении визуального аспекта нарисованного владельцем ListBox.
Таким образом, это означает, что каждый раз при добавлении элементаэто событие называется.Кроме того, я думаю, что даже когда вы выполняете определенные действия рисования в этом методе, он будет вызываться сам (вы можете избежать этого, используя SuspendLayout и ResumeLayout в списке при обновлении),но я не уверен.
Вот кикер, насколько я знаю.Каждый раз, когда это событие срабатывает, это в значительной степени для каждого элемента в списке.(Это может быть полезно, так как вы можете отменить цвет ранее выбранного элемента, поэтому не переходите непосредственно к тому, что я собираюсь предложить, не продумав его до конца).Итак, DrawItemEventArgs имеет индекс нарисованного элемента.Используя это, вы можете сосредоточиться на конкретном элементе, который вам нужно нарисовать.Это может помочь вам повторно обработать что-то, что уже было обработано (имейте в виду примечания из вышеприведенной статьи ... скопированной ниже, о допустимом индексе, равном -1).
Для визуализации этого процесса:
Add 1 item ->DrawItem
Add 2nd item->DrawItem
->DrawItem
Add 3rd item->DrawItem
->DrawItem
->DrawItem
Add nth item->DrawItem * n
Таким образом, это фактически приводит к некоторой ситуации типа Фибоначчи (3 элемента привели к 6 вызовам ... 5 приведет к вашему 15 номеру), и вы можете увидетькак начальная загрузка может быть громоздкой, и как добавление нового элемента делает для n вызовов метода.
Из статьи выше:
ListBox вызывает DrawItemметод для каждого элемента в его коллекции Items.
Аргумент DrawItemEventArgs для обработчика события DrawItem предоставляет свойство Index, значением которого является индекс элемента, который нужно нарисовать.Осторожно!Система вызывает событие DrawItem со значением индекса -1, когда коллекция Items пуста.Когда это происходит, вы должны вызвать методы DrawItemEventArgs.DrawBackground () и DrawFocusRectangle () и затем выйти.Цель вызова события - позволить элементу управления нарисовать прямоугольник фокуса, чтобы пользователи могли сказать, что он имеет фокус, даже когда нет элементов.Код перехватывает это условие, вызывает два метода и немедленно завершает работу обработчика