C# 刷新DataGridView数据源后,Winforms图形将消失

C# 刷新DataGridView数据源后,Winforms图形将消失,c#,winforms,datagridview,graphics,C#,Winforms,Datagridview,Graphics,所以我继承了这个WinForms应用程序,它可以绘制很多图形。通过重复调用以下方法在表单上绘制排序网格: private void DrawCell(int startx, int starty, int width, int height, System.Drawing.Color fill, string text = "") { using (System.Drawing.Graphics formGraphics = this.CreateGraphics

所以我继承了这个WinForms应用程序,它可以绘制很多图形。通过重复调用以下方法在表单上绘制排序网格:

    private void DrawCell(int startx, int starty, int width, int height, System.Drawing.Color fill, string text = "")
    {
        using (System.Drawing.Graphics formGraphics = this.CreateGraphics())
        {
            using (System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(fill))
            {
                Rectangle temp = new Rectangle(startx, starty, width, height);
                formGraphics.FillRectangle(myBrush, temp);
                ControlPaint.DrawBorder(formGraphics, temp, System.Drawing.Color.Black, ButtonBorderStyle.Solid);

                if (text != "")
                {
                    Font font2 = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Point);
                    TextRenderer.DrawText(formGraphics, text, font2, temp, Color.Blue);
                }
            }
        }
    }
绘制该“网格”的过程是通过在组合框中选择一个项来启动的,该组合框调用“DrawGrid”方法来循环已知数量的行和列,并在循环中调用上述方法

我在表单中添加了一个DataGridView控件。除了更新上面的“网格”,我现在还想更新DataGridView。因此,在组合框的SelectedValueChanged事件中,我还调用了一个方法来获取数据值(简单的一维数字数组),并使用该数组更新DGV的数据源

问题是:当我在组合框中选择一个项目时,“假”网格只会在第一次绘制并立即消失,但此后一切正常。然后,“假”网格正确绘制,不会消失

无论以何种顺序绘制“假”网格或更新DataGridView,都会发生这种情况。如果我注释掉DGV数据源的行设置,“伪”网格工作良好,即使是第一次

你知道为什么会这样吗?我根本没有使用表单的OnPaint事件


谢谢…

this.CreateGraphics()-Winforms graphics基本规则#1:永远不要使用
control.CreateGraphics
!切勿尝试缓存
图形
对象!使用
Graphics g=Graphics.FromImage(bmp)
或在控件的
Paint
事件中,使用
e.Graphics
参数将bmp绘制到
位图中注意,在最小化表单后,它将消失。在您的情况下,您需要使用CellPaint事件及其e.Grpahics对象@陶,谢谢。我不是一个真正的图形人,我继承了这个应用程序。有办法解决这个问题吗?这只是一堆单元格,而不是位图。draw方法可以在不同的时间从不同的位置调用。是否有一种类型的控件我可以使用,然后利用它的油漆事件?谢谢…在DataGridView中,您可以而且应该使用CellPainting事件。请仔细查看它的许多参数,这些参数不仅可以为您提供有效的图形对象,还可以提供有关单元格及其内容和单元格边界的数据;另外还有一些方法,可以省去绘制内容、背景等的繁重工作。因此DataGridView与表单上绘制的“假”网格无关。我将其添加到表单的另一个区域以跟踪某些属性。它与“假”网格没有任何关系,我也不需要担心它的图形。“假”网格的基本绘图以及在程序运行期间对其进行更新是一个问题。那么我可以将所有代码移动到表单的on-paint事件中,并使用标志来控制要绘制的内容,然后在需要时强制重新绘制吗;控件(或窗体)绘图将位于其任何子控件下。如果需要在DGV上绘制栅格,可以使用DGV的绘制事件。但我有预感,你根本不想在DGV上画画?最直接的解决方法可能是:向DrawCell函数添加一个图形参数,并使用它,而不是以前创建的易失性参数。然后,在Paint事件中,触发DrawCell,传递e.Graphics,或者更可能有一个或两个循环,提供参数;然后把它传给那些。不管是哪一个。。