【问题标题】:How to have a control redraw the Windows form?如何让控件重绘 Windows 窗体?
【发布时间】:2014-05-28 11:43:40
【问题描述】:

我不确定“重绘”是否是我正在寻找的内容...我是手动设计 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???
        }

    }

【问题讨论】:

  • 在下面查看我更新的分析器

标签: c# winforms visual-studio redraw


【解决方案1】:

试试

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

this.Refresh();

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

【讨论】:

  • 我试过这个——invalidate() 和 refresh() 分别和一起。我什至尝试直接在“Form”类本身(传递给此类对象的 TableLayout 的父级)上调用它。它没有用,我不知道为什么。这是我在网上看的时候得到的答案。 “刷新”的重新定义很简单,所以我不必通过 DataTableFrame.MyFrame.Refresh() 访问表格控件。因为我通过这个类对象路由控制“TableLayout” - 我只是给它自己的“刷新”定义。
  • 就像我说的,问题是这个类对象添加到传递的“TableLayoutPanel”中的所有子控件都不会显示,直到我执行一些调用 .Layout 事件的操作。将数据添加到表后,有没有办法以编程方式调用此事件?在调用“布局”事件后,它完全按照预期工作。
  • 你倒退了:ParentSize = MyFrame.Size 不会调整框架的大小。它只是将当前大小存储在一个变量中,因此分配的 Layout 事件方法可以检查“Layout”事件是否实际调整了框架的大小。否则,它不会将子组件重新处理为适合框架宽度的列。它可以避免水平滚动条。
  • 如果使用tableLayoutPanel的Resize事件或SizeChanged事件会怎样
  • 哦,我觉得自己很蠢——这是我的错。我已将子控件的评估逻辑放在“检查对象是否已调整大小”事件中。因此,在调整窗口大小之前,它实际上并没有创建任何子控件。 很抱歉浪费您的时间堆栈溢出。我以后在编写代码时提出问题时会尽量保持清醒。
猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2014-05-19
  • 2018-03-01
  • 1970-01-01
  • 2014-03-16
相关资源
最近更新 更多