【问题标题】:owner drawn grid - .NET所有者绘制的网格 - .NET
【发布时间】:2010-12-01 17:55:22
【问题描述】:

我想就我是否应该自己从头开始编写以下内容或使用第 3 方组件提出建议。如果有符合要求且没有太多行李的第 3 方组件,我将不胜感激。

我想要一个单元格矩阵的组件,例如网格控件。我不需要编辑,不需要选择,不需要动态调整列的大小,不需要默认的单元格绘制行为,鼠标移动时不需要任何效果,不需要键盘快捷键。

我需要做的就是自己绘制每个单元格,如果网格的大小超过了父组件的可用空间,那么应该会出现滚动条。

换句话说,我想说: grid.Invalidate()

然后我得到每个可见单元格的回调,如下所示:

void DrawCell(int x, int y, Graphics g, Rectangle cellDrawingRect)

【问题讨论】:

  • 您最多需要显示多少个单元格?总行/列?

标签: .net grid drawing components


【解决方案1】:

我的建议?计算网格的大小,制作相应大小的图像,绘制网格,然后将图像放入 PictureBox,然后将该 PictureBox 放入 ScrollableControl。

您不需要弄乱 Control.Paint,因为图片框会为您处理。

如果您愿意,可以将所有这些都放在 UserControl 中。这使您的代码更具可重用性和可移植性。

【讨论】:

  • 使用这种方法是否也可以平滑更新picturebox正在显示的图像的点点滴滴,还是每次都必须用新图像完全替换?
  • 不,您可以在同一张图像上重新绘制。只需确保在完成绘图后调用 PictureBox.Invalidate()。
【解决方案2】:

如果您只是编写自己的控件(从 ScrollableControl 派生),这似乎很简单。处理 Control.Paint 来绘制单元格并使用 Horizo​​ntalScroll 和 VerticalScroll 属性来调整滚动条。

【讨论】:

    【解决方案3】:

    这是我之前对这个主题的咆哮:

    Need help creating control to display data

    我肯定会建议您自己执行此操作,尤其是因为它本质上是一个只读控件。大多数现成的网格组件的功能远远超出您的需要,而将它们拼凑成您需要的形状可能比从头开始编写自己的网格组件更容易。

    正如 Charlie Salts 所提到的,在一个大的 PictureBox 上绘制整个东西然后在一个较小的 Panel 上移动它可能更容易,但这取决于整个网格必须有多大。位图会占用大量内存。

    【讨论】:

    • 是的,我忘记了位图大小。这就是为什么有人应该处理 Control.Paint 的一个很好的理由。
    • 不要太大。也许最大 2500x2500 像素。其可视子集将小于或等于标准窗口大小。
    • @freddy:这是 25 MB 左右的位图,这对于您的目的可能没问题。我在 .Net Compact Framework 中做了很多工作,其中一个大的位图将是灾难性的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2023-03-03
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多