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

标签 c# winforms datagridview user-controls

我创建了一个继承自 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/

相关文章:

c# - 如何在 C# 中将纯 html 表单链接到 Controller

c# - 在 vs2010 中开发 iphone\android 应用程序需要做什么?

mysql - SQL 数据库关系和 VB.Net 应用程序

c# - 什么用于 System.Windows.Forms.Control.ControlCollection 中的键?

c# - Datagridview Winform C# 拖放行

datagridview - C# WinForms : Cannot access a dispose object

c# - 如何将对象包装在动态对象中?

c# - 使用 c# 和 TPL 数据流的并发计数器模式

c# - ElementHost 内的 WPF 控件不可见

c# - 使用 SystemEvents.UserPreferenceChanged 和多个 UI 线程时 UI 卡住