2016-03-31 1 views
0

Я создал пользовательский элемент управления пользователя, который наследуется от UserControl. Это довольно просто, у него есть текстовые поля, выпадающие списки и некоторые переключатели прямо сейчас. В конечном счете, я хотел бы объединить 100 из этих бок о бок, чтобы пользователь мог заполнить столько, сколько они хотели бы. Идеальное решение для этого было бы иметь DataGridView, где каждый столбец является экземпляром моего пользовательского элемента управления пользователя. Есть ли способ сделать это? Или, возможно, лучшее/альтернативное решение?Использование пользовательского UserControl в качестве столбца в DataGridView

Моя первоначальная мысль: мне нужно создать пользовательский DataGridViewCell, который использует этот настраиваемый элемент управления, но я не знаю, возможно ли это: a) и b) самый эффективный способ сделать это.

Я работаю с winforms.

+0

Рассмотрим размещая некоторые из этих UserControls в FlowLayoutPanel. Если пользователю нужно заполнить больше, нажмите кнопку, которая добавит больше UserControls. – endofzero

+0

Hey :) Посмотрите здесь: http://stackoverflow.com/questions/18055737/add-a-panel-to-datagridview –

+0

Вы можете создать пользовательский столбец, в котором во время редактирования размещается составной элемент управления в ячейке. Но вместо создания такого столбца сетки вы можете использовать столбец кнопок и редактировать значения в окне, которое вы открываете над сеткой. Также вы можете использовать контейнер 'TableLayoutPanel', чтобы иметь сетевой интерфейс, подобный сетке. –

ответ

1

Вы хотите использовать UserControl в качестве столбца в DataGridView. Для отображения оценок/строк/столбцов вашего UserControl ('yuc') существует несколько вариантов. Вот три, которые приходят на ум:

  • Отбросьте DGV и пойти на FlowLayoutPanel. Это просто реализовать и будет работать в значительной степени из коробки. Единственный аргумент в том, что производительность будет вялой, если в ней будет слишком много элементов управления. Предположим, что ваш UC (yuc) имеет 10 элементов управления; несколько тысяч элементов управления являются лимитом в WinForms, поэтому несколько (100-300) yucs будут работать нормально, но помимо этого вам нужно переосмыслить дизайн.

  • Пройдите весь путь и создайте специальную ячейку DataGridView, в которой будет размещаться адрес yuc. Вот complete and nice walk-through. Как вы можете видеть, это будет довольно много дополнительной работы; классы для добавления, интерфейсы для реализации и т. д. И, что еще хуже: все это действительно означает, что новый тип ячейки действует как обычная ячейка DGV, прочитает ее и позволит вам редактировать только один значение , Это намного меньше, чем то, что может сделать ваш yuc.

  • Вариант 3: Чит! Вы можете объединить avantages из yuc данных и DGV работы дисплея, если вы показываете только одинyuc в тока клетки путем накладывания его и сделать все другие клетки, показать то, что их yucs будет выглядеть.

Этот третий вариант позволит вам добавить довольно много столько строк, сколько ваша память позволяет, хотя стоит отметить, что общая ширина столбцов не может превышать 64k.

Я могу придумать два способа создания правильного дисплея: ячейки могут отображать Bitmap, которые они держат вместе со своими другими данными в структуре Tag, или они могут рисовать их в событии CellPaint. Первый занимает больше памяти, но должен работать быстрее.

Вам нужно создать класс данныхyucData для yuc, который содержит все данные, необходимые для initalze в yuc. Он также может содержать Bitmap, который можно создать с помощью метода DrawToBitmap.

Теперь каждый раз, когда текущая ячейка перемещается, вы показываете/перемещаете редактирование yuc и инициализируете его данными в ячейке Tag. Когда значения изменены, вы обновите Bitmap.

И в случае CellPainting вы рисуете Bitmap в каждую ячейку.

See here для примера наложения UserControl на DataGridView. Там он накладывается на целый ряд, который растет на аккордеоне, как будто он имеет все размеры. Другие строки и ячейки довольно регулярны.

То, что я написал, это строки, но вы можете просто разместить их в столбцах, которые вы создавать динамически.

Но все это действительно только стоит, если вы попали в предел контроля в Winforms с FLP.

Ну, если WPF вариант, там все это не будет проблемой ..

+0

Wow, много информации здесь! Вы убедили меня, что DGV не нужен для моих целей. Я собираюсь изучить FlowLayoutPanels, а также TableLayoutPanels. Я ценю ваше время и силы, приветствия! –

0

Извините меня.Я не могу писать по-английски.

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

Display user controls in C# 4.0 Winforms DataGridView

+1

Пожалуйста, не оставляйте ссылки только для ответов. Вместо этого укажите в своем ответе конкретные шаги и примеры кода. ;) – Xarbrough

+0

Кроме того, ссылка в основном на японском языке. – dskrvk

+0

Благодарим за указание. Я буду отправлять образцы кода в будущем – simo

Смежные вопросы