【问题标题】:Is this the right way to show/hide user controls?这是显示/隐藏用户控件的正确方法吗?
【发布时间】:2015-11-11 13:50:16
【问题描述】:

我只是想问一下这是否是在主窗体上显示/隐藏用户控件的好方法。

我有带有 3 个按钮(按钮 1、按钮 2、按钮 3)的 form1,我有用户控件(用户控件 1、用户控件 2、用户控件 3,它们什么都不包含)。

现在单击按钮 1 和用户控件 1 显示,单击按钮 2 和用户控件 2 显示并且用户控件 1 隐藏......等等(所以每次单击按钮时用户控件显示并隐藏其余按钮。

我使用了以下代码,它可以按我的意愿完美运行,但我的问题是: UserControl.BringToFront() 函数将用户控件带到前面,每次单击按钮时,它都会将该用户控件带到前面,那么其他用户控件会发生什么情况呢?我的意思是BringToFront() 将每个用户控件放在另一个之上,并且不会删除任何以前的用户控件。我觉得缺少一些东西,比如“删除”功能来删除以前的 UserControl。如果我留下这样的代码会发生什么(没有“删除”功能?请帮忙。谢谢。

这是代码,效果很好:

  • 用户 control1 名称是 UC1
  • 用户 control2 名称为 UC2
  • 用户 control2 名称是 UC3

    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            UC1 uc1 = new UC1();
            Controls.Add(uc1);
            uc1.BringToFront();
    
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
    
            UC2 uc2 = new UC2();
            Controls.Add(uc2);
            uc2.BringToFront();
    
        }
    
        private void button3_Click(object sender, EventArgs e)
        {
            UC3 uc3 = new UC3();
            Controls.Add(uc3);
            uc3.BringToFront();
        }
    }
    

【问题讨论】:

  • 它不会将“那个”用户控件带到前面,而是每次都将一个新的用户控件带到前面。所以不,这不是显示/隐藏用户控件的正确方法。您是否查看了 Show 和 Hide 方法或 Visible 属性?
  • 好吧,显然其他 UserControls 仍然存在——请注意,您可以使用 Tab 切换到它们。你已经在使用Controls.Add;你没注意到Controls.Remove
  • 很明显,他们将不再排在前面。如果您在 Z 顺序中推回的那个大于您带到前面的那个,那么您仍然可以看到它的边缘。明智的做法是在前一个上调用 Dispose() 方法。 从不调用 Remove(),这会泄漏控制并最终使您的程序崩溃。您现在正在做的事情是泄漏的,但至少它不是致命的,当用户关闭窗口时它们仍然会被释放。
  • 为什么不静态创建按钮并在每个点击处理程序中相应地设置 visible=false?
  • 嗨 Lasse V. Karlsen。是的,我使用了显示/隐藏,但只是想知道如何删除控件

标签: c# winforms


【解决方案1】:

每次按下按钮时不要重新创建控件,只需显示/隐藏控件:

private UC1 uc1 = new UC1() {
  Visible = false
};

private UC2 uc2 = new UC2() {
  Visible = false
};

private UC3 uc3 = new UC3() {
  Visible = false
};

private void VisualizeUC(Control value) {
  uc1.Visible = false;
  uc2.Visible = false;
  uc3.Visible = false;

  value.Visible = true; 
} 

private void Form1_Load(object sender, EventArgs e) {
  Controls.Add(uc1);
  Controls.Add(uc2); 
  Controls.Add(uc3);
}

private void button1_Click(object sender, EventArgs e) {
  VisualizeUC(uc1);
}

private void button2_Click(object sender, EventArgs e) {
  VisualizeUC(uc2);
}

private void button3_Click(object sender, EventArgs e) {
  VisualizeUC(uc3);
}

【讨论】:

  • 嗨德米特里·比琴科。你的代码工作得很好,但我不明白这一点:private void VisualizeUC(Control value) { uc1.Visible = false; uc2.Visible = 假; uc3.可见=假;价值。可见=真; } 你能解释一下吗?谢谢
  • @naouf:此代码隐藏问题的所有控件(uc1uc2uc3)然后显示提供的控件(value );所以如果你打电话给VisualizeUC(uc2);,除了uc2之外的所有控制都将被隐藏(u1uc3)和uc2将被显示
【解决方案2】:

您之前每次按下按钮时都会为每个控件创建一个新实例,这很快就会增加许多不必要的控件。

而是只创建和添加每个控件的一个实例,然后根据需要隐藏/显示:

// Put your controls here so they're accessible
UC1 uc1;
UC2 uc2;
UC3 uc3;

private void Form1_Load(object sender, EventArgs e)
{
    // Do this on form load so it only happens once

    // Instantiate your controls
    uc1 = new UC1();
    uc2 = new UC2();
    uc3 = new UC3();

    // Make them invisible
    uc1.Visible = false;
    uc2.Visible = false;
    uc3.Visible = false;

    // Add your controls
    Controls.Add(uc1);
    Controls.Add(uc2);
    Controls.Add(uc3);
}

private void button1_Click(object sender, EventArgs e)
{
    // You can keep using bring to front
    uc1.BringToFront();

    // OR

    // Use show/hide
    uc1.Show();
    uc2.Hide();
    uc3.Hide();
}

private void button2_Click(object sender, EventArgs e)
{
    uc2.BringToFront();

    // OR show hide...
}

private void button3_Click(object sender, EventArgs e)
{
    uc3.BringToFront();
}

【讨论】:

  • 嗨,Equalsk。您的代码有很大帮助,我相应地更改了代码,我不想使用“.show()”,因为我将拥有超过 13 个用户控件,并且显示/隐藏它们会令人困惑。另外我只是想知道为什么每次单击按钮时我们都没有看到类似“删除”功能来删除以前的 oppend 控件?我们使用 BringTofront() 来带来当前用户控件,但没有其他函数执行 Remove 任务! .谢谢
  • 如果您不想多次重复隐藏/显示,请按照 Dmitry 的操作,创建一个类似于他的示例中名为 VisualizeUC 的方法。每次都需要删除控件吗?或者你可以重复使用相同的吗?你的问题不清楚。如果你想移除控件就不要移除它们,你最好丢弃它们uc1.Dispose();
  • OK clear ;) 请再问一个问题:我将使用“dispose”,但您知道如何动态使用它吗?正如我所说,我有超过 13 个用户控件,但我不知道该怎么做。例如 。我单击 button1 UserControl1 显示并单击 button2 UserControl1 将处理并且 UserControl2 显示.......你能动态地做吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2021-08-27
相关资源
最近更新 更多