使用自定义UserControl作为DataGridView中的列

时间:2016-03-31 13:54:29

标签: c# winforms datagridview user-controls

我创建了一个继承自UserControl的自定义用户控件。这是非常基本的,它现在有一些文本字段,下拉菜单和一些单选按钮。最后,我想将这些并排的100个字串在一起,以便用户尽可能多地填写。对此的理想解决方案是使用DataGridView,其中每列是我的自定义用户控件的实例。有没有办法实现这个目标?或者更好/替代解决方案?

我最初的想法是我需要创建一个使用此自定义控件的自定义DataGridViewCell,但我不知道这是否可能,以及b)最有效的方法。< / p>

我正在使用winforms。

2 个答案:

答案 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)

对不起。我不会写英文。

但我写的示例代码可能有助于解决这个问题,如果发生这种情况,我很高兴。

Display user controls in C # 4.0 Winforms DataGridView