Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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调用带有地址的表单?_C#_Forms - Fatal编程技术网

C# 如何用C调用带有地址的表单?

C# 如何用C调用带有地址的表单?,c#,forms,C#,Forms,在这段简单的代码中,我想知道如何使用表单的实际地址而不是this.Hide调用表单,这样即使表单当前未处于活动状态,我也可以关闭/隐藏它。我的主要目的是隐藏Form2,单击按钮打开Form1,然后永远关闭Form2 与VisualBasic不同,C不会为您保留表单引用。你需要自己保存它们。Form2只是一种类型,它没有默认引用。其主要思想不是每个表单类型都有一个实例,根据需要隐藏和显示-它的表单与任何其他表单一样都是对象-以与任何其他对象相同的方式创建和处理它们。通常的工作流不是Form1.Hi

在这段简单的代码中,我想知道如何使用表单的实际地址而不是this.Hide调用表单,这样即使表单当前未处于活动状态,我也可以关闭/隐藏它。我的主要目的是隐藏Form2,单击按钮打开Form1,然后永远关闭Form2


与VisualBasic不同,C不会为您保留表单引用。你需要自己保存它们。Form2只是一种类型,它没有默认引用。其主要思想不是每个表单类型都有一个实例,根据需要隐藏和显示-它的表单与任何其他表单一样都是对象-以与任何其他对象相同的方式创建和处理它们。通常的工作流不是Form1.Hide;表格2.展览;及它更像是Application.runnewmainform。。。使用var form=new Form1{form.ShowDialog;}。这并不意味着VB方法不能在C语言中使用,它只是意味着你必须自己实现它或者切换到VB.NET。如果它有意义的话——这个设计已经有一段时间不受欢迎了,所以请确保你对为什么要这样做有一个好的想法,而不仅仅是惯性

听起来,您真正的问题在于您试图实现某种向导,或通过多个表单的流程。这意味着您应该使用向导,或者更改整个应用程序的构建方式

查看你的程序.cs。了解它的作用。当传递给Application.Run的表单关闭时,整个应用程序将关闭。有很多方法可以重写它,但我们不能在一般情况下真正帮助您-我可以告诉您的是,如果您的应用程序不适合主窗口+其他窗口模式,那么默认的应用程序设置将不适用于您

应该有人对你的两种形态的生命周期负责。我们无法真正告诉您是谁-可能是程序类,可能是其中一个窗体,可能是在一系列模式对话框中打开这两个窗体的主窗体。我们根本不知道——这是一个需要你解决的设计问题。但是负责人还将在正确的时间点处理关闭和打开单个表单的操作。

这是Form2实例中的实际“地址”。因此,将其隐藏在表单本身中会执行以下操作:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        Hide(); // or this.Hide()
    }
}
如果您想在其他地方隐藏它,您需要使用引用调用它。比如:

var f = new Form2();
f.Show();
// Do stuff with form
f.Hide();

您不需要引用,因为您已经在表单中了。这将指向上下文中类的当前实例,它将执行以下操作:

this.Hide();
或者,因为它知道上下文:

Hide();
如果你在Form2中工作,就用这个

您还可以使用:

public Form2()
        {
            InitializeComponent();
            Hide();
        }
你不需要称之为Form2 form=newform2;仅当您以其他形式工作时,例如:

public Form1()
        {
            Form2 form = new Form2();
            form.Show(); //or form.Hide();

        }

那么,谁持有Form2的引用?请参阅我的两个表单项目:@jdweng非常感谢!你的解决方案给了我一种方法来解决我想做的事情!我如何/在哪里可以自己给它一个引用?@Zenektric-How@Zenektric在代码中的某个点上,您可以执行一些类似于newform2的操作来创建引用。将它存储在某个地方,以后再使用该引用。或者重新考虑一下你的设计——如今,VB风格或多或少被弃用了。你确定它很适合你的用例,还是你只是出于惯性而使用它?不正确。Application.openforms不要称之为@Zenektric这是最好的答案,不知道为什么其他人都过于复杂。我隐藏form2来打开form1,然后我需要form2来关闭,而不是活动的form2,所以我无法使用它来关闭它。您的代码显示从form2隐藏form2。这样就可以了。没有“主动一号”之类的上下文。只有当前表单。@由于OP不想关闭当前表单,因此该表单被删除。这可能是解决方案的一部分,但不是解决方案。当然,这个问题不是很容易用上下文来回答。。。
public Form2()
        {
            InitializeComponent();
            Hide();
        }
public Form1()
        {
            Form2 form = new Form2();
            form.Show(); //or form.Hide();

        }