3

如果有人可以帮助我,我将不胜感激。

我有一个 Windows 窗体应用程序,它具有三种形式:form1、form2、form3。form1 在应用程序激活时启动。在form1上,有一个按钮可以调出form2,隐藏form1。还有一个按钮可以调出form3并在form2上隐藏form2。

public partial class Form1 : Form
{

    Form2 f2= new Form2();
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();            
        f2.Show();        
    }
}


public partial class Form2 : Form
{
            Form3 f3 = new Form3();
    private void button1_Click(object sender, EventArgs e)
    {
         this.Hide();
         f3.Show();                
    }
 }

问题在form3上,我试图访问一些在form2中运行时分配了值的变量。我认为由于我将 f2 设为无模式形式,我应该能够通过简单地使用 f2.myvariables 来访问,但是智能感知并没有给我 f2 对象。这是为什么?我找到了一种将这些变量声明为 public static 的方法,因此我可以使用 form2.myvariables 进行访问。这是另一件让我感到困惑的事情。由于所有值都是在运行时分配的,静态变量如何做到这一点?我是 C# 的新手,我已经对此进行了很多搜索,但似乎没有地方能准确回答我的问题。提前感谢您的帮助!

4

4 回答 4

11

因此,您在父表单 (form2) 中拥有想要在子表单 (form3) 的方法中访问的信息。

  1. form3为它需要的信息创建属性。
  2. 创建form2它的实例form3时应该设置这些属性。

您不应该认为这不是让子表单向其父表单请求信息,而是父表单正在向其子表单提供信息。如果你相应地改变你的思维方式,代码不仅变得更容易编写,而且更符合良好的编码实践(更低的耦合,不向外部暴露比需要更多的信息等)

要创建属性,您可以执行以下操作form3

//TODO: give real name; adjust type as needed
public string SomePropertyName { get; set; }

然后form2你可以这样做:

f3.SomePropertyName = "hello from form2";

或者

f3.SomePropertyName = someVariableInForm2;
于 2012-08-20T17:43:39.257 回答
1

男人,

尝试创建Form3的构造函数方法的重载,将来自form2的变量值作为方法参数传递。

于 2012-08-20T18:35:39.933 回答
0

如果您已在 Form2 上公开了有问题的变量,那么您的问题是您也已将它们设为static. 当您将它们定义为static时,您将它们放置在类型 (Form2) 上而不是实例 (f2) 上。

从变量声明中删除静态,它们应该出现在 f2 的智能感知中。

于 2012-08-20T17:40:44.193 回答
0

我认为由于我将 f2 设为无模式形式,我应该能够通过简单地使用 f2.myvariables 来访问,但是智能感知并没有给我 f2 对象。这是为什么?

创建类的实例后,所有声明为 public 的变量和方法都应该可用。只需重新检查您是否已将变量声明为public.

由于所有值都是在运行时分配的,静态变量如何做到这一点?

不,静态变量和方法是在程序开始时定义的。它们不需要创建实例来引用它们。

于 2012-08-20T17:46:09.537 回答