Member 11040029 Ответов: 1

Datagridview vs tablelayoutpanel для табличного ввода


У меня должен быть табличный элемент управления, который будет содержать ячейки, размещающие различные элементы управления в Столбцах. Каждый столбец будет содержать один и тот же элемент управления. Например, все ячейки в столбце 1 будут содержать метку типа элемента управления.

Среди тех, кто контролирует, мало расширений встроенные элементы управления, такие как метки и текстового поля, а несколько пользовательских элементов управления.

Как первый вариант я выбрал в качестве DGV управления хостингом.
Я просмотрел все документы MSDN и воспользовался помощью google, чтобы узнать, что доступно с помощью DGV. Я сделал пользовательский DGVControl и соответственно столбцы для размещения этих элементов управления.
Поначалу это была долгая и грязная работа. Потребовался почти месяц, чтобы построить DGV с моими требованиями. Каким-то образом я достиг 80% требуемой функциональности, а остальные 20% кажутся мне трудными, так как существуют сотни строк кода для того, чтобы размещенный элемент управления взаимодействовал с бизнес-моделью, а также удовлетворял базовым свойствам элемента управления DGV.
Затем я решил не использовать DGV, так как он может быть не масштабируемым в будущем.

В качестве 2-го варианта я решил использовать TLP (TableLayoutPanel).
Я расширил базовый TLP в своем классе и добавил необходимые методы.
Управление хостингом в TLP намного проще, чем в DGV. Потребовалось всего 3 дня, чтобы построить его по мере необходимости.
Так или иначе, TLP занимает значительное время, чтобы нарисовать себя. Поскольку в TLP нет встроенной функции для удаления определенной строки, я удалил элементы управления из нужной строки вручную и переместил все строки ниже нее на одну строку вверх. Имея всего 20 записей, TLP занимает почти 1,5 секунды, чтобы перекрасить себя.
Для кода нет циклов, которые работают слишком долго, и нет тяжелого фонового потока, который может вызвать это.
Я думаю, что TLP не создан для той функциональности, которая мне нужна. Это просто панель для компоновки элементов управления на форме для правильного UX.

Я не знаю, что использовать для этой самой цели. Пожалуйста, проводите.

Что я уже пробовал:

Потратил много времени на то, чтобы DGV и TLP работали по мере необходимости, но никакой помощи.

1 Ответов

Рейтинг:
2

Midi_Mick

Я сделал нечто подобное с панелью компоновки таблицы, но вместо того, чтобы удалить элементы управления, я просто сделал их невидимыми. Строки были настроены так, чтобы их высота соответствовала содержимому, но поскольку в строке не было видимого содержимого, высота сама настраивалась на ноль. Таким образом, требуется гораздо меньше перерисовки элементов управления. Это означает, что вам нужно сохранить индекс номеров строк TLP до логических номеров строк, но это не слишком сложно поддерживать.

Не слишком уверен, что эта методология подойдет в вашем случае, но концепция может помочь.


Member 11040029

спасибо @Midi_Mick! Я тоже пробовал. Это здорово. Но как вы думаете, возникнут ли какие-либо проблемы с производительностью, если TLP содержит почти 200 строк? Под производительностью я подразумеваю что-нибудь, например нагрузку на потоки, проблемы с рендерингом или что-то еще?

Member 11040029

Кроме того, не могли бы вы оценить этот вопрос, чтобы этот вопрос мог привлечь внимание.

Midi_Mick

Производительность перерисовки будет во многом зависеть от того, сколько строк на самом деле видно в окне просмотра. Однако, просто установив одну строку в основном невидимой, ему не нужно пересчитывать макеты для любого элемента управления, который не виден. Вы должны найти значительное улучшение по сравнению с вашим предыдущим методом изменения мест управления.
Еще одна вещь, которую вы должны сделать, и это очень помогает, - это установить call SuspendLayout для TLP перед установкой видимости содержащихся элементов управления и call ResumeLayout после того, как все изменения будут сделаны-это обеспечит только одну перерисовку на набор изменений.

Member 11040029

Я попробовал этот путь. Подвеска помогает. Но этого недостаточно. Рендеринг все еще значительно медленен после добавления всего 10 строк :(
Я сильно застрял в этом вопросе!