Как связать Bounds динамически созданных контролов (Windows Forms)

Суть: Появилось у меня желание слегка кастомизировать ListView, путём прикручивания к его Subitems[ind] элемента ProgressBar, и в целом само по себе прикручивание я кое-как реализовал (см. скриншот)ListView с ProgressBar-ами

Код добавления элемента списка с ProgressBar-ом:

private void btAdd_click(object sender, EventArgs e) {
    var item = new ListViewItem("Test");
    var progressSubitem = new ListViewItem.ListViewSubItem();
    var pb = new ProgressBar();

    progressSubitem.Tag = pb; // За это не ругайте
    lvFilesList.Controls.Add(pb);
    item.SubItems.Add(progressSubitem);
    lvFilesList.Items.Add(item);
    
    pb.Bounds = progressSubitem.Bounds;
}

Прикольно? Прикольно. Но тут появился вопрос: Если я захочу изменить ширину колонки ListView-а, то мои ProgressBar-ы должны как-то об этом узнать, и соответствующим образом на мои действия отреагировать. Было решено попробовать пойти в лоб, и циклами перебрать каждый ListViewItem моего ListView, и каждый ListViewSubItem моих ListViewItem-ов в событии ColumnWidthChanging ListView-а (звучит вся эта конструкция ужасно):

Код обновления размеров всех ProgressBar-ов

private void lvFilesList_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e) {
            ProgressBar instantBar;
            foreach (ListViewItem item in lvFilesList.Items) {
                foreach (ListViewItem.ListViewSubItem subitem in item.SubItems) {
                    instantBar = (subitem.Tag as ProgressBar);
                    if (instantBar != null) {
                        instantBar.Bounds = subitem.Bounds;
                    }
                }
            }
        }

И это в принципе работает при небольшом количестве записей в списке, и все размеры изменяются адекватно. Но как только список разрастается - начинаются (вполне ожидаемо для такого подхода) тормоза.

А теперь вопрос: Как правильно изменить Bounds каждого ProgressBar-а в соответствии с Bounds соответствующего ему Subitem-а? Ведь по-любому должен быть другой, более быстрый и эффективный способ решить эту проблему, но я его просто не знаю. Заранее спасибо.

P.S.: Сторонние штуки желательно не предлагать

Бонусом: Наглядная иллюстрация проблемы введите сюда описание изображения


Ответы (0 шт):