C# Datagridview绘制晶圆图

C# Datagridview绘制晶圆图,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,目前,我正在使用C#datagridview绘制一个包含>500行和>700列的晶圆图 然而,有几个问题: 缓慢的表现。因为我需要调整列宽,所以我必须循环并单独指定 for (int i = 0; i < this.dgvCompleteMapGrid.Columns.Count; i++) { this.dgvCompleteMapGrid.Columns[i].Width = 8; } 然而,它似乎会为大多数单元格绘制多个重复的边框 建议使用Datagridview吗?我尝试在

目前,我正在使用C#datagridview绘制一个包含>500行和>700列的晶圆图

然而,有几个问题:

  • 缓慢的表现。因为我需要调整列宽,所以我必须循环并单独指定

    for (int i = 0; i < this.dgvCompleteMapGrid.Columns.Count; i++)
    {
      this.dgvCompleteMapGrid.Columns[i].Width = 8;
    }
    
  • 然而,它似乎会为大多数单元格绘制多个重复的边框


    建议使用Datagridview吗?我尝试在面板上绘制矩形,但效果更差。

    这是我的Picturebox,允许像素化调整大小(相对于插值)。例如,类似于放大Microsoft Paint图片

    using System.Windows.Forms;
    
    namespace WireWorld
    {
        public class ZoomablePicturebox : PictureBox
        {
            public ZoomablePicturebox()
            {
            }
    
            protected override void OnPaint(PaintEventArgs pe)
            {
                pe.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
                pe.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
                pe.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
                pe.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
                base.OnPaint(pe);
            }
        }
    }
    
    要生成位图,我使用如下内容:

    // Pick width and height for your case
    Bitmap MyBitmap = new Bitmap(width, height);
    using (var g = Graphics.FromImage(retVal))
        g.Clear(BackColor); // Pick a background fill color
    // Draw your points, whatever your loop needs to be and your point definition is
    foreach (MyPointDef point in _Points)
    {
        MyBitmap.SetPixel(point.X, point.Y, point.Color);
    }
    
    然后我把一个图片框放在表格的面板上。然后,面板提供滚动。我可以按如下方式设置图片和缩放:

    canvasPB.SizeMode = PictureBoxSizeMode.Zoom; // Ensures picture is resized as we resize picturebox
    canvasPB.Image = MyBitmap;
    canvasPB.Height = canvasPB.Image.Height * Zoom; // Zoom is 1, 2, 3, etc, for 1X, 2X, ...
    canvasPB.Width = canvasPB.Image.Width * Zoom;
    

    canvasPB是我试图用作画布的表单上的Picturebox的名称。

    我认为您应该在
    双缓冲面板上绘制所有内容
    ,并计算视图中的所有点进行绘制
    700列
    对于
    DataGridView
    来说,即使您不做任何事情(自定义绘制),也可能会出现一点闪烁。您的绘图是要设置动画还是只是一次性的数据可视化?如果只是一次性的,请在位图上绘制所有内容,然后将其显示在面板中作为背景。如果是动画,你就得照金说的做。是的,DataGridView在这里不是正确的选择。谢谢你的回复。是的,我已经在使用双缓冲面板了。要在DGV中绘制>500列,最小列宽为1像素。是否可以绘制小于1像素的单元格?我想在一个屏幕中容纳>500列而不带滚动条。@Tombala如果DGV不是正确的选择,你能建议我应该尝试什么吗?我最近使用PictureBox(PB)为画布编写了一个Wire World模拟器。我在幕后绘制位图。当bmp就绪时,我设置PB.Image=bitmap。我得到了大约5 FPS必须完全重新生成整个位图,因此绘制只需少量时间。我确实创建了一个从PB派生的新PB类,覆盖了OnPaint,并在调用base.OnPaint之前设置SmoothingMode、InterpolationMode、CompositingMode和CompositingQuality以提高速度。
    canvasPB.SizeMode = PictureBoxSizeMode.Zoom; // Ensures picture is resized as we resize picturebox
    canvasPB.Image = MyBitmap;
    canvasPB.Height = canvasPB.Image.Height * Zoom; // Zoom is 1, 2, 3, etc, for 1X, 2X, ...
    canvasPB.Width = canvasPB.Image.Width * Zoom;