我创建了一个继承自 UserControl 的自定义用户控件。它非常基本,目前有一些文本字段、下拉菜单和一些单选按钮。最终我想将 100 个并排串在一起,以便用户可以填写任意数量的内容。对此的理想解决方案是拥有一个 DataGridView,其中每一列都是我的自定义用户控件的一个实例。有办法做到这一点吗?或者也许是更好/替代的解决方案?
我最初的想法是我需要创建一个使用此自定义控件的自定义 DataGridViewCell,但我不知道这是否是 a) 可能和 b) 最有效的方法。
我正在使用 winforms。
最佳答案
您想要使用UserControl
作为DataGridView
中的列。要显示 UserControl
('yuc'
) 的分数/行/列,有多个选项。我想到的是以下三个:
删除 DGV 并转到
FlowLayoutPanel
。这很容易实现,并且几乎开箱即用。唯一的缺点是,如果您总共有太多控件,则性能会变得迟缓。假设您的 UC (yuc
) 有 10 个控件;几千个控件是 WinForms 中的限制,因此一些 (100-300) 个 yucs 就可以正常工作,但除此之外,您需要重新考虑设计。一路走下去,创建一个专门的
DataGridView
Cell 来托管您的yuc
。这是complete and nice walk-through 。正如您所看到的,这将带来相当多的额外工作;要添加的类、要实现的接口(interface)等。而且,更糟糕的是:所有这些实际上都是为了使新的单元类型像常规 DGV 单元一样工作,读取它将保留并允许您编辑只有一个值。这比您的yuc
可能能做的要少得多..选项 3:作弊!如果您在 中仅显示一个
yuc
,则可以将yuc
数据和DGV
显示性能的优势结合起来。 >当前单元格,通过覆盖它并使所有其他单元格显示它们的yucs
的样子。
第三个选项将允许您添加内存允许的尽可能多的行,但值得一提的是总列宽不能超过 64k。
我可以想到两种方法来创建正确的显示:单元格可以显示它们在Tag
结构中保存的位图
以及其他数据,或者它们可以绘制它们位于 CellPaint
事件中。前者需要更多内存,但运行速度应该更快。
您需要为您的 yuc
创建一个数据类 yucData
,其中包含初始化 yuc
所需的所有数据>。它还可以保存 yuc
可以使用 DrawToBitmap
方法创建的Bitmap
。
现在,每次移动当前单元格时,您都会显示/移动编辑 yuc
并将其初始化为单元格 Tag
中的数据。当值发生更改时,您将更新位图
。
并在 CellPainting
事件中将Bitmap
绘制到每个单元格中。
See here有关将 UserControl
覆盖到 DataGridView
上的示例。它覆盖了一整行,它像 Accordion 一样生长以容纳其所有大小。其他行和单元格非常规则。
我写的是关于行的内容,但您也可以将它们放入动态创建的列中。
但是,只有当您使用 FLP
达到 Winforms
中的控件限制时,这一切才真正值得。
好吧,如果 WPF
是一个选项,那么这一切都不会成为问题..
关于c# - 使用自定义 UserControl 作为 DataGridView 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335494/