Как связать Bounds динамически созданных контролов (Windows Forms)
Суть:
Появилось у меня желание слегка кастомизировать ListView, путём прикручивания к его Subitems[ind] элемента 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.: Сторонние штуки желательно не предлагать
Бонусом: Наглядная иллюстрация проблемы
