C#在对话框中更新设置时重新加载/重画表单

C#在对话框中更新设置时重新加载/重画表单,c#,winforms,C#,Winforms,我有一个C#Win表单应用程序,我根据类中的两个属性在面板中动态绘制按钮。行和列 我还打开了一个对话框,它使用两个文本框设置这些属性 我在对话框上有一个名为“save”的按钮,按下该按钮后,会将主类中的属性(行、列)更新为设置的任何值 我希望主窗体根据应用的新设置(行和列)重新绘制动态绘制的按钮。我该怎么做 编辑: 刷新不起作用 另一个可能很重要的注意事项是:我的按钮动态绘图出现在“Form1\u Load”方法中。Panel.Refresh() 将强制重新绘制所有子控件。您不应在窗体的绘制事件

我有一个C#Win表单应用程序,我根据类中的两个属性在面板中动态绘制按钮。行和列

我还打开了一个对话框,它使用两个文本框设置这些属性

我在对话框上有一个名为“save”的按钮,按下该按钮后,会将主类中的属性(行、列)更新为设置的任何值

我希望主窗体根据应用的新设置(行和列)重新绘制动态绘制的按钮。我该怎么做

编辑:

刷新不起作用

另一个可能很重要的注意事项是:我的按钮动态绘图出现在“Form1\u Load”方法中。

Panel.Refresh()


将强制重新绘制所有子控件。

您不应在窗体的
绘制事件之外进行任何绘制。这就是表单未正确重画的原因。将自定义绘图移到那里,重画应该会正常进行。

基本上有三种方法可以强制控件重画自己,即Refresh()、Update()和Invalidate()。正如Adam Robinson指出的,启用自定义绘制的最简单方法是重写绘制事件。把所有的绘画逻辑放在这里。使用PaintEventArgs参数提供的图形对象

那么上面的电话有什么区别呢

Invalidate将控件(区域或rect)标记为需要重新绘制,但不会立即重新绘制(当所有其他内容都已处理且应用程序处于空闲状态时,会触发重新绘制)

更新使控件在任何部分无效时立即重新绘制

刷新导致控件失效,然后更新(即立即重新绘制自身)


我认为使用Invalidate()是一个好习惯,除非您有特殊的需求需要满足。在大多数情况下,它将使您的程序更高效。如果这样做,您甚至不需要在加载事件中使用绘制逻辑。这很可能在您看到表单之前就被覆盖并失效了,具体取决于您在加载事件中执行的其他操作。

当我尝试这样做时,会出现一个错误,说明我没有名为Form1\u Load的方法。我不明白您在说什么。不要在
Load
事件中绘制图形,请在
Paint
事件中绘制。同样,不要在
Form1\u Load
中进行任何绘图。这就是问题的根源。如果您删除了Form1_Load方法,而它正在抱怨,可能是因为它在Form1.Designer.cs或其他文件中被引用了。如果有必要,请从中删除它。visual studio似乎创建了太多的文件,并使简单任务的处理变得复杂。我添加了一个按钮,我甚至看不到显示的按钮的代码。@Sev:我无法解释为什么您看不到代码这一事实意味着Visual Studio创建了太多文件并使事情变得复杂……我不想听起来有点屈尊俯就,但这是相当基本的东西。您应该花一些时间阅读一本好的WinForms编程书籍,并学习一些概念。我正在使用OnPaint方法重写,这导致按钮现在根本无法绘制。另外,它要求我有一个Form1_加载方法,我现在没有任何东西。当我在Form1_Load方法中创建按钮代码时,它至少在绘制按钮。那么,您在哪里覆盖了OnPaint?在形式本身?在这种情况下,您将在窗体上绘制,但任何包含的控件都将显示在您绘制的内容的顶部。听起来你想做一些自定义控件。你到底想做什么?你愿意发布你的代码吗?谢谢你深思熟虑的回答。它并没有直接帮助我解决问题,但它确实指引了我正确的方向。发布一些代码会让你得到更精确的答案,比如如何完成这一任务的代码示例。