c #Windows表单应用程序表单问题

时间:2011-02-25 18:52:05

标签: c# windows forms

我有一个c#windows表单应用程序,其中包含多个表单。

通常,例如,在form1中,我创建了一个form2的实例,然后是

form1.hide();
form2.show();

但有时我希望以前的表格显示和处理当前表格。我怎样才能打电话给以前的表格?

提前致谢。

6 个答案:

答案 0 :(得分:4)

要回答您的问题,您需要在视图中保持对彼此的引用。虽然这可能会起作用,但它很麻烦且容易出错。听起来你的所有控制逻辑都可能包含在你的表单类代码中,我建议远离它并分离你的顾虑。

如果您创建一个控制器类,至少可以以您认为合适的方式管理表单的创建和处理,那么解决表单管理问题变得非常简单。

因此,您的代码示例实际上将从控制器类启动,如:

public class FormsController
{
    private Form form1 = new Form();
    private Form form2 = new Form();

    public void SwitchForms()
    {
        form1.hide();
        form2.show();
    }
}

要进一步了解,请检查MVC architectural pattern以便干净地使用数据,商业逻辑和用户界面。

答案 1 :(得分:1)

您可以考虑扩展Form以包含一些允许您访问其他表单的属性/字段。 {(1}}类可以像大多数其他.Net类一样继承。

您也可以考虑在Program.cs文件中进行一些管理,这是您项目的一部分,如果这两种形式都不应该是另一种形式的孩子。

如果您从Form继承了form1的新类并添加了Form之类的方法,则可以将其关闭并处理第二个表单。

可能有很多不同的方法来解决这个问题。这些只是少数。

答案 2 :(得分:1)

如果将新表单的所有者设置为对当前表单的引用,则可以从新表单中引用该表单。您还可以从旧表单订阅新表单的Closed()事件,并使用代码来处理它(尽管表单可以通过重写OnClosed来处置自己,如果它不会发生在那里)。

答案 3 :(得分:1)

此逻辑应在Program.cs中处理。 Main()方法初始化Form1。你想在那里控制而不是将控制传递给表格。

示例:

static class Program
{
    internal static Form1 MyForm1;
    internal static Form2 MyForm2;
    /// 
    /// The main entry point for the application.
    /// 
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Application.Run(new Form1());

        // Initialize Form1
        MyForm1 = new Form1();
        MyForm1.FormClosing += new FormClosingEventHandler(MyForm1_FormClosing);

        // You may want to initialize Form2 on-demand instead of up front like here.
        MyForm2 = new Form1();
        MyForm2.FormClosing += new FormClosingEventHandler(MyForm2_FormClosing);

        // Show Form1 first
        MyForm1.Show();

        // Now we need to occupy the thread so it won't exit the app. This is normally the job of Application.Run.
        // An alternative to this is to have a third form you pass on control to.
        while (true)
        {
            Application.DoEvents();
            System.Threading.Thread.Sleep(10);
        }
    }

    static void MyForm1_FormClosing(object sender, FormClosingEventArgs e)
    {
        // Do something, for example show Form2
        MyForm2.Show();

        // EXAMPLE: We only want to hide it?
        e.Cancel = true;
        MyForm1.Visible = false;
    }
    static void MyForm2_FormClosing(object sender, FormClosingEventArgs e)
    {
        // Do something, for example show Form1
        MyForm1.Show();

        // EXAMPLE: We only want to hide it?
        e.Cancel = true;
        MyForm2.Visible = false;
    }
}

由于程序是静态的,您可以通过以下方式访问该项目中的MyForm1MyForm2

Program.MyForm1.Show();
Program.MyForm2.Hide();

如果您计划有许多表单/复杂逻辑,我建议将其移至单独的类中。另外,请考虑使用单个表单并在其中旋转用户控件。

答案 4 :(得分:0)

Form2 myform = new Form2();

myform.show();
this.hide();

答案 5 :(得分:0)

您可以在form1中执行此操作:

...
var form2 = new form2();
form2.Closing += (form2_Closing);
this.hide();
form2.show();
...


private void form2_Closing(object sender, System.EventArgs e)
{
    this.show();
}