如何让控件重新绘制 Windows 窗体?

7
我不确定“重绘”是否是我要找的东西……我还不熟悉手动设计Windows窗体。我创建了一个类,它将使用"TableLayoutPanel"作为传递变量,并在该表格布局面板内进行自身设计,以便可以重新使用该控件并调整其参数以适应其包含的数据。
我有一个事件,可以在框架调整大小时重新绘制控件,这很好用。然而,在我第一次.Show()显示窗体时,它不会显示类中的任何子控件。如果我手动调用从Resize事件调用的“resize”方法,它也不会重新绘制本身。
我只能得到一个空的“TableLayoutPanel”,直到我手动调整窗口大小才会调用父TableLayoutPanel上的“Resize”事件。
以下是我的类的截断版本,已经删除了不相关的方法:
    public class DataTableFrame : Form
    {

        TableLayoutPanel MyFrame;
        Size ParentSize;
        int Row = 1;
        int Col = 1;
        int LabelWidth = 75;
        int TextWidth = 150;            
        List<DataObject> MyData = new List<DataObject>();


        public class DataObject
        {...
        }

        public DataTableFrame() { }

        public DataTableFrame(TableLayoutPanel Parent)
        {
            MyFrame = Parent;
            MyFrame.AutoScroll = true;
            ParentSize = MyFrame.Size;
            MyFrame.Layout += new LayoutEventHandler(MyFrame_Layout);
        }

        void MyFrame_Layout(object sender, LayoutEventArgs e)...

        public void AddData(string Label, string Data)...

        public void EvaluateRowCol()...

        public void RowsColums(int Rows, int Cols)...

        public void PopulateControls()...

        public void Refresh()
        {
           // What do I put here to force a redraw???
        }

    }

see my updated anser below - Jade
1个回答

15

尝试

this.Invalidate(); //Refreshes or invoke the control to redraw
或者
this.Refresh();

注意:Refresh() 已经在 Form 对象属性中了,您不需要声明它。


1
我尝试了这个 - 分别和一起使用invalidate()和refresh()。我甚至尝试直接在“Form”类本身上调用它(传递给此类对象的TableLayout的父级)。它没有起作用,我不确定为什么。那是我在网上查找时遇到的答案。重新定义“refresh”的原因只是为了让我不必通过DataTableFrame.MyFrame.Refresh()访问表格控件。由于我正在通过此类对象路由“TableLayout”的控制权 - 我只是给它自己的“refresh”定义。 - ThisHandleNotInUse
就像我说的那样,问题在于直到我执行触发.Layout事件的操作之前,此类对象添加到传递的“TableLayoutPanel”的任何子控件都不会显示出来。是否有一种方式在向表中添加数据后以编程方式调用此事件?当调用“Layout”事件后,它的效果完全符合预期。 - ThisHandleNotInUse
你搞反了:ParentSize = MyFrame.Size 不会调整框架的大小。它只是将当前大小存储在变量中,以便分配的布局事件方法可以检查“布局”事件是否实际上已调整了框架的大小。否则,它不会重新处理子组件以适应框架宽度的列。它存在的目的是为了避免水平滚动条。 - ThisHandleNotInUse
如果您使用tableLayoutPanel的Resize事件或SizeChanged事件会怎样? - Jade
回复:Jade 我想我可以这样做。我原本打算使用调整大小事件而不是布局事件,但.NET文档建议不要使用它,而是推荐使用“Layout”(http://msdn.microsoft.com/en-us/library/system.windows.forms.control.resize%28v=vs.110%29.aspx)。该方法检查调整大小。问题仍然只是当加载表单并添加数据时,直到在表单上调用“Layout”事件才会显示出来。我刚开始手动编写表单设计,所以不知道何时引发事件,因此选择了更广泛的范围。 - ThisHandleNotInUse
4
哦,我感觉很愚蠢 - 这是我的错。我将子控件的评估逻辑放在了“检查对象是否已被调整大小”的事件中。因此,实际上它并没有创建任何子控件,直到窗口被调整大小。对于浪费您的时间,我向 Stack Overflow 表示抱歉。我以后会尽量在编写代码时保持清醒,在提问时更加注意。 - ThisHandleNotInUse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接