2016-02-13 5 views
3

Я относительно новичок в программировании окон. Я разрабатываю приложение формы Windows, которое требует, чтобы пользователь просматривал форму (я использовал FlowLayoutPanel с AutoScroll = True внутри формы). Источник панели содержит пользовательский элемент управления, который зацикливается в зависимости от количества записей.Winforms: прокручиваемая FlowLayoutPanel с тысячами пользовательских элементов управления. Как предотвратить утечку памяти и правильное размещение объектов?

Например, если в БД имеется 10 записей, тогда 10 элементов управления создаются и добавляются в Панель при загрузке Формы, и пользователь сможет прокручивать 10 элементов. (См. Образец изображения, который изображаю этот сценарий) Sample Screen Image

Издание:

проблемы возникает, когда есть большее количество записей (скажем, 1000), так как объекты UserControl не настроенные и предел Handle превышен, сбой приложения (с сообщение: Ошибка при создании дескриптора окна). Я знаю, что это утечка памяти или проблема с плохим дизайном.

Но я не могу найти надежное решение здесь, я подумал о приведенных ниже вариантов (для преодоления проблемы), но не уверен, как действовать на них:

  1. нагрузки только элементы управления UserControl видны на (как пользователь прокручивает или когда нажата кнопка «вверх/вниз»)
  2. Можно ли визуализировать пользовательские элементы управления как изображение на панели, а также при наведении или нажатии любой части пользователя управление может быть повторно инициализировано и запущено для загрузки (таким образом, фактический пользовательский объект управления не будет находиться в памяти)

Не могли бы вы предложить подходящее решение/правильный способ обработки объектов UserControl в контексте этого требования

+0

Рассматривали вы с помощью той или иной форме пейджинга? Например, ваш LayoutPanel всегда будет отображать 10 UserControls (без полосы прокрутки), а затем добавлять номера страниц для навигации по вашим записям по 10 за раз? Это обычный метод, когда вы хотите избежать загрузки большого количества данных и загромождать пользовательский интерфейс? – LightBulb

+3

То, что UserControl не очень хорошо масштабируется, должно быть изучено в школе Hard Knocks. Операционная система ограничивает количество элементов управления, которые вы можете создать, что UserControl плюс все его дочерние элементы управления не может превышать 10 000. Используйте тот элемент управления, который может отображать несколько строк информации, например ListView и DataGridView. И посмотрите на Google для правильного способа представления десятков тысяч результатов. –

+0

@LightBulb: Да, я рассмотрел Paging, это решит проблему, но это не очень удовлетворительно для пользователей (поскольку они не хотят перемещаться с использованием подкачки, а скорее прокручивают), и поэтому я пытаюсь понять если что-нибудь еще можно сделать –

ответ

1

Я предлагаю идти на DataGridView.

Я смогу хранить 1000 записей.

У вас есть выбор: либо

  • придерживается своего прямого решетчатого макетя или
  • выбрал гибридную схему

Под этим я имею в виду Solutuion, который показывает все, но ток записывать как одну строку в сетке; текущий может быть увеличен и наложен одним экземпляром вашего UserControl, который загружается из данных базовой строки всякий раз, когда выбранная строка изменяется.

См. this post для примера этой техники; там я покажу, как заменить текущую строку с большей площадью, много в коей мере аккордеон управления будет работать ..

Строки в DGV, на самом деле просто Bitmap и поэтому дешево прокрутки; обычный способ использования DGV состоит в том, чтобы полагаться на его способность накладывать одну ячейку с помощью элемента управления редактирования правильного типа.

«Аккордеонный трюк» расширяет его до произвольного UserControl, накладывающего всю строку.

Обратите внимание, что остальные строки займет намного меньше места, что я вижу, как бонус ..

+0

Спасибо за ответ. вы упомянули, что строки в DGV являются растровыми изображениями. так есть ли способ манипулировать «всем», который пользователь контролирует как отдельные строки внутри DGV (вместо отображения сетки и наложения только одной строки за раз?). –

+0

Нет смысла добавлять все эти UC, это именно то, что вы пробовали с FLP. Растровое изображение, о котором я упоминаю, не существует для каждой строки; он создается как один (внутренний) растровый рисунок, который показан точно так же, как изображение. Тысячи элементов управления просто отлично работают в Winforms. WPF может справиться с этим с легкостью, хотя .. Вы могли бы пойти вперед, хотя и нарисовать растровое изображение с любым макетом, который вам нравится, и закодировать панель или графический ящик, чтобы отобразить его, и сопоставить все действия с мышью и клавиатурой, чтобы реагировать и вызывать новую обновленную версию. Но это будет какая-то работа, в зависимости от степени интерактивности. Не рекомендуется – TaW