winforms 如何创建一个类来清除按钮和其他控件的屏幕?

2vuwiymt  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(163)

我在我的程序中多次重复使用相同的代码来清除屏幕,我想过把它变成一个类,但我仍然不知道类是如何工作的,以及如何正确地创建一个类。
清除按钮和其他控件的代码如下:

List<RichTextBox> _richTextBoxes = this.Controls.OfType<RichTextBox>().ToList();
        List<Button> _buttons = this.Controls.OfType<Button>().ToList();
        List<Label> _labels = this.Controls.OfType<Label>().ToList();
        List<TextBox> _textBoxes = this.Controls.OfType<TextBox>().ToList();

        foreach (var rich in _richTextBoxes)
        {
            this.Controls.Remove(rich);
        }
        foreach (var button in _buttons)
        {
            this.Controls.Remove(button);
        }
        foreach (var label in _labels)
        {
            this.Controls.Remove(label);
        }
        foreach (var textBox in _textBoxes)
        {
            this.Controls.Remove(textBox);
        }
nkcskrwz

nkcskrwz1#

正如其他人已经提到的,在运行时删除/创建容器(窗体、面板等)的所有控件是一种罕见的做法,可能会浪费PC资源。
当然您可以用途:

Form.Controls.Clear();

或者

Panel.Controls.Clear();

但是,例如,将所有控件放在一个Panel中,然后简单地隐藏该面板,这有什么错呢?
如果您选择此选项,它就像下面这行代码一样简单:

Panel.Visible = false; // or true
u1ehiz5o

u1ehiz5o2#

隐藏数百或数千个控件既低效又浪费

与另一个答案的想法相反

Panel.Visible;

...在某种程度上更有效,它不是。隐藏控件不会释放任何资源控件可能会请求明显的窗口句柄。句柄、字体等都是GDI池的一部分,这是一个相当有限的资源。根据您运行的Windows版本,您可能会被限制为256到16之间的任何值,每个进程384个GDI句柄。
所以在隐藏100个控件之前先想一想。最好是直接销毁不需要的控件,创建你需要的控件。

回到问题

我在程序中多次重复使用相同的代码来清除屏幕
更大的问题是 * 你为什么要这样做 *
虽然这是一个合理的编程场景,但考虑到 but I still don't get how classes work,您不太可能处于 dynamic-UI-apps 阶段,例如,* 动态选择数据库表 *。
考虑通过设计器创建多个窗体,并且不要在运行时修改它们。如果动态UI不是一个真正的要求,这会容易得多。

在运行时更改内容的更简单方法

否则,如果您非常希望在运行时继续更改内容,请考虑将所有控件放在属于窗体的子Panel中。
然后您可以直接调用Clear():

myPanel.Controls.Clear(); // Job done

相关问题