我创建了一个继承自UserControl的自定义用户控件。这是非常基本的,它现在有一些文本字段,下拉菜单和一些单选按钮。最后,我想将这些并排的100个字串在一起,以便用户尽可能多地填写。对此的理想解决方案是使用DataGridView,其中每列是我的自定义用户控件的实例。有没有办法实现这个目标?或者更好/替代解决方案?
我最初的想法是我需要创建一个使用此自定义控件的自定义DataGridViewCell,但我不知道这是否可能,以及b)最有效的方法。< / p>
我正在使用winforms。
答案 0 :(得分:1)
您想在UserControl
中使用DataGridView
作为列。要显示UserControl
('yuc'
)的分数/行/列,有几个选项。以下是我想到的三个:
放弃DGV并转到FlowLayoutPanel
。这很容易实现,并且可以开箱即用。唯一的问题是,如果总共控制太多,性能会变得迟缓。我们假设您的UC(yuc
)有10个控件;几千个控件是WinForms的限制,因此一些(100-300)yucs
可以正常工作,但除此之外,您需要重新考虑设计。
一直走,并创建一个专门的DataGridView
单元格来托管您的yuc
。这是一个complete and nice walk-through。正如你所看到的,这将相当多的额外工作;要添加的类,要实现的接口等等。更糟糕的是:所有这些都是为了使新的单元格类型像常规的DGV单元格一样,读取它将保持并允许您编辑只有一个值。这比yuc
可能做的要少得多......
选项3:作弊!如果您在当前单元格中仅显示一个 yuc
,则可以结合DGV
数据和yuc
显示效果的优势strong>覆盖并使所有其他单元格显示yucs
的样子。
第三个选项允许您添加与内存允许的行数相同的行,但值得一提的是总列宽不能超过64k。
我可以考虑两种方法来创建正确的显示:单元格可以在Bitmap
结构中显示它们与其他数据一起显示的Tag
,或者可以在{{1}中绘制它们事件。前者占用更多内存,但应该更快。
您需要为CellPaint
创建数据类 yucData
,其中包含启动yuc
所需的所有数据。它还可以使用yuc
方法创建Bitmap
yuc
。
现在每次移动当前单元格时,您都会显示/移动编辑DrawToBitmap
并将其初始化为单元格yuc
中的数据。值更改后,您更新Tag
。
在Bitmap
事件中,您将CellPainting
绘制到每个单元格中。
See here有关将Bitmap
覆盖到UserControl
的示例。在那里,它覆盖了整排,手风琴般的形状可以容纳所有大小。其他行和单元格非常规则..
我写的是关于行但你也可以把它们放到你动态创建的列中。
但如果您使用DataGridView
点击Winforms
中的限制控件,那么这一切真的是值得的。
好吧,如果FLP
是一个选项,那么这一切都不会成为问题。
答案 1 :(得分:0)
对不起。我不会写英文。
但我写的示例代码可能有助于解决这个问题,如果发生这种情况,我很高兴。