【问题标题】:Application Windows Form C# use menu (User control)应用程序 Windows 窗体 C# 使用菜单(用户控件)
【发布时间】:2015-10-11 19:37:54
【问题描述】:

我有一个包含 2 个表单的应用程序,对于这些表单,我创建了一个菜单,我将其放置在两个表单上。

菜单上只有一个menuStrip项,我只想点击“test1”时重定向到Form1,点击“test2”时我想重定向到Form2。

但如果 test1 已经打开/显示,我不想再次显示他,对于 test2 也是如此。

我的菜单中的代码:

 public partial class Menu : UserControl
{
    public Menu()
    {
        InitializeComponent();
    }

    private void test1ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        Form2 f2 = new Form2();
        f2.Hide();
        f1.Hide();
        f1.ShowDialog();
    }

    private void test2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        Form2 f2 = new Form2();
        f1.Hide();
        f2.Hide();
        f2.ShowDialog();
    }
}

我的表格1:

我的 Form2 :

我只想要与 Form1 和 Form2 中的按钮相同的结果:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();
        Form1 f1 = new Form1();

        f1.ShowDialog();
    }

}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();
        Form2 f2 = new Form2();

        f2.ShowDialog();
    }
}

我认为表单的 Visible 属性可以帮助我,但不能...

问题是当我点击按钮时,它会打开一个新窗口,但是当我的表单已经打开时,我不想再次打开它。

感谢您的回复,我希望我提前对我的英语感到抱歉。

【问题讨论】:

    标签: c# forms user-controls


    【解决方案1】:

    您当前正在每次执行点击处理程序代码时创建一个新表单。

    这是一种方法,但它很讨厌,我不会真的推荐它。我假设 form1 是您的应用程序的入口,它也是应用程序的出口。此解决方案使用单例来保存 f1/f2 实例。

    public static class Global
    {
        static Global()
        {
            f2 = new Form2();
        }
        public static Form f1;
        public static Form f2;
    }
    

    您的菜单已更改:

    public partial class Menu : UserControl
    {
        public Menu()
        {
            InitializeComponent();
        }
    
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            Global.f2.Hide();
            Global.f1.Hide();
            Global.f1.Show();
        }
    
        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            Global.f1.Hide();
            Global.f2.Hide();
            Global.f2.Show();
        }
    
        public void SetForm1(Form form)
        {
            Global.f1 = form;
        }
    
        public void SetForm2(Form form)
        {
            Global.f2 = form;
        }
    }
    

    还有形式:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            Global.f1 = this;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
            Global.f2.ShowDialog();
        }
    }
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
            Global.f1.Show();
        }
    }
    

    希望这会有所帮助。

    【讨论】:

    • 简单易行。我认为您需要在完成后处理表格 - 取决于您将如何管理它们。见这里stackoverflow.com/questions/8081822/…。此外,您可能对 Application.OpenForms 集合感兴趣 - 但现在保持简单,以这种方式进行。
    • 您好,感谢您的回复。是的,我的问题在这里,当我单击按钮时,它会创建一个新表单。你能告诉我更多我如何将我的对象 f1 和 f2 存储在我的用户控件中吗?我不明白抱歉
    • 我已经用可能的解决方案更新了上面的回复。
    • 非常感谢您的帮助 Paul,它有效我现在了解如何在表单之间传递表单对象。
    【解决方案2】:

    你的逻辑是错误的。

    在我看来,您希望根据“menuStrip”上的用户选择显示不同的内容。您需要查看动态控件加载而不是不同的表单加载。

    您可以只拥有一个带有“menuStrip”和面板的 MainForm。定义一些用户控件并根据用户选择动态地将它们添加到该面板。

    片段

    public MainForm : Form
    {
        public MainForm()
        {
             // code
        }
    
        public void MenuStrip_OptionSelected(object sender, EventArgs e)
        {
            Panel1.Controls.Clear();
            switch(MenuStrip.SelectedValue)
            {
                case "UserControl1" : Panel1.Controls.Add(new UserControl1()); break;
                ...
            }
        }
    }
    
    
    public UserControl1 : UserControl
    {
        // code
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2011-10-09
      相关资源
      最近更新 更多