【问题标题】:Panel changing the ownership?面板更改所有权?
【发布时间】:2012-02-13 16:09:09
【问题描述】:

在我的 C# 应用程序中,有一个带有面板 main_panel 的主窗体。每当用户在菜单中选择某些内容时,比如说“A”,主面板就会切换到表单 A 的面板(查看代码)A_panel

由于A_panel涵盖了表单A中的每个控件,我可以将表单A的所有控件召唤到主表单中。

if ((string)MainMenu.SelectedItem == "A")
{
    FormA A = new FormA();
    new_panel = A.Controls["A_panel"] as Panel;
}
this.main_panel.Controls.Clear();
this.main_panel.Controls.Add(new_panel);

我的问题是当用户再次选择菜单 A 时,我不想通过 new FormA() 再次重新创建 FormA。我这样做是因为当我将控件添加到 main_panel 时,A_panel 的所有权更改为主窗体,以便可以再次将控件添加到 main_panel

那么,如何将A_panel的所有权再次更改为Form A? 以及如何解决我的问题?

【问题讨论】:

    标签: c# winforms controls panel


    【解决方案1】:

    您有什么理由不能使用UserControl 并在表单上保留对它的引用?这样,您可以在用户想要更改视图时显示/隐藏它。扩展和交互会容易得多。 Here's MSDN 上的演练帮助您入门。

    【讨论】:

    • 但是我一次要处理超过 5~6 个菜单。所以你的意思是我必须把它们都放在一个表格中并修改它?
    【解决方案2】:

    听起来 UserControl 会更好地满足您的需求。在 FormA 上有一个实例,在 MainForm 上有另一个。

    如果由于某种原因您不能使用用户控件,您至少可以在自动生成的设计器文件之外提取代码(我认为这就是您使用 FormA 的原因)。

    如:

    FormA

    public FormA()
    {
        var mainPanel = CreateMainPanel();
        this.Controls.Add(mainPanel)
    }
    
    public Panel CreateMainPanel()
    {
        //...build up your control tree. Cut the code from the designer if necesssary
    }
    

    主窗体

    FormA _A = new FormA();
    
    public void HandleMainMenuClick(object sender, EventArgs e)
    {      
        if ((string)MainMenu.SelectedItem == "A")
        {    
            new_panel = _A.CreateMainPanel();
        }
        this.main_panel.Controls.Clear();
        this.main_panel.Controls.Add(new_panel);    
    }
    

    【讨论】:

    • 但是我一次要处理超过 5~6 个菜单。所以你的意思是我必须把它们都放在一个表格中并修改它?
    • 我不太明白李的问题。菜单数量与您的原始帖子有何关系?
    • 不,我的意思是,当我使用用户控件时
    猜你喜欢
    • 2018-05-18
    • 2012-04-03
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多