Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c Windows窗体应用程序窗体问题_C#_Windows_Forms - Fatal编程技术网

C# c Windows窗体应用程序窗体问题

C# c Windows窗体应用程序窗体问题,c#,windows,forms,C#,Windows,Forms,我有一个c windows窗体应用程序,其中包含多个窗体 通常,例如,在form1中,我创建form2的一个实例,然后 form1.hide(); form2.show(); 但有时我希望前一个表单显示并处理当前表单。我怎样才能调用上一个表单 提前感谢。 < P>您可以考虑扩展表单以包括允许访问其他表单的一些属性/字段。表单类可以像大多数其他.Net类一样从中继承 你也可以考虑在程序的.Car文件中做一些管理,这是你的项目的一部分,如果两个表单都不应该是另一个孩子的。 如果从Form继承for

我有一个c windows窗体应用程序,其中包含多个窗体

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

form1.hide();
form2.show();
但有时我希望前一个表单显示并处理当前表单。我怎样才能调用上一个表单


提前感谢。

< P>您可以考虑扩展表单以包括允许访问其他表单的一些属性/字段。表单类可以像大多数其他.Net类一样从中继承

你也可以考虑在程序的.Car文件中做一些管理,这是你的项目的一部分,如果两个表单都不应该是另一个孩子的。

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


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

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

你也可以考虑在程序的.Car文件中做一些管理,这是你的项目的一部分,如果两个表单都不应该是另一个孩子的。

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


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

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

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

要回答您的问题,您需要在视图中维护彼此的引用。虽然这可能会起作用,但它混乱且容易出错。听起来您的所有控制逻辑都可能包含在表单类代码中,我建议您不要这样做,将您的关注点分开

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

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

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

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

为了进一步的启发,请检查一下如何干净地使用数据、业务逻辑和UI。

为了回答您的问题,您需要在视图中维护彼此之间的引用。虽然这可能会起作用,但它混乱且容易出错。听起来您的所有控制逻辑都可能包含在表单类代码中,我建议您不要这样做,将您的关注点分开

Form2 myform = new Form2();

myform.show();
this.hide();
如果您创建一个控制器类,该类至少以您认为合适的方式管理表单的创建和处理,那么解决表单管理问题就变得非常简单

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

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

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

对于进一步的教益,请检查干净地使用数据、业务逻辑和UI。

您可以在表单1中执行此操作:

Form2 myform = new Form2();

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


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

您可以在表单1中执行此操作:

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


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

此逻辑应在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;
    }
}
由于程序是静态的,您可以通过以下方式访问该项目中的任意位置的MyForm1和MyForm2:

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

如果您计划有许多表单/复杂的逻辑,我建议将其移动到一个单独的类。也可以考虑使用一个窗体并在其内部旋转用户控件。

< P>这个逻辑应该在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;
    }
}
由于程序是静态的,您可以通过以下方式访问该项目中的任意位置的MyForm1和MyForm2:

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

如果您计划有许多表单/复杂的逻辑,我建议将其移动到一个单独的类。也可以考虑使用单个表单并在里面旋转用户控件。

哦,我是哑巴。我忘了父母了。哦,我是个笨蛋。我忘了父母,真的。我建议在Program.cs中处理这个问题,这是MVC方法的一个非常非常简单的版本,这是处理这个问题的一个更好的方法。@Digit:MVC在这里有点夸张,因为OP没有提到模型,但是Program.cs肯定可以用作一个简单的控制器。在引导之外,我倾向于尽可能少地使用Program.cs,因为在那里扎根源代码会把一切都弄得一团糟
nd变得很难重构。非常正确。我建议在Program.cs中处理这个问题,这是MVC方法的一个非常非常简单的版本,这是处理这个问题的一个更好的方法。@Digit:MVC在这里有点夸张,因为OP没有提到模型,但是Program.cs肯定可以用作一个简单的控制器。在引导之外,我倾向于尽可能少地使用Program.cs,因为在那里扎根源代码会让一切变得一团糟,并且很难重构。如果太晚了,应用程序将失去对另一个应用程序的关注。FormClosing是正确的。如果太晚,应用程序将失去对其他应用程序的关注。FormClosing是正确的。使用应用程序。运行,而不是DoEvents并在循环中睡眠!使用Application.Run,而不是DoEvents,并在循环中睡眠!