【问题标题】:Accessing variables in other Windows Form class [closed]访问其他 Windows 窗体类中的变量 [关闭]
【发布时间】:2012-08-20 17:35:47
【问题描述】:

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

我有一个 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# 的新手,我已经对此进行了很多搜索,但似乎没有地方能准确回答我的问题。提前感谢您的帮助!

【问题讨论】:

  • 我不知道如何修复错误的格式...抱歉..new here
  • 这些编程基础知识有点过于宽泛,无法在 SO 帖子 (IHMO) 中回答。
  • 您的表单类可能位于不同的命名空间中。要让智能感知访问属性,您需要在类的顶部添加一个“使用”语句,其中包含这些名称空间。
  • 当你认为形式是different而不是class.Form 是一个 class时,所有的混乱都开始了。 想想你将如何访问另一个类的变量

标签: c# windows forms


【解决方案1】:

因此,您在父表单 (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;

【讨论】:

  • 您好,感谢您的帖子。我不知道如何使用属性来解决这个问题?是不是就像在form3中声明构造函数一样,所以在form2中创建form3的实例时,通过构造函数传递所有变量?
  • @John 这当然是这个几乎完全相同的解决方案的完美替代方案。我将进行编辑以显示创建属性的语法。
  • 非常感谢..你能告诉我为什么在 f3 中无法访问 f2 实例吗?是因为子表单无法访问父表单吗?另外,为什么将这些变量设为 public static 也可以做到这一点?我的意思是这些变量被分配了基于运行时用户输入的值。根据我的理解,公共静态仅适用于在运行时不会改变的值。抱歉问了这么多问题。我只是想了解整个事情,而不仅仅是解决问题。
  • @John 在您的原始代码中,f2 是一个私有实例变量,这意味着它只能通过非静态方法从该类中访问。如果您将其公开(您不应该这样做,因为使用公共实例变量被认为是不好的做法),那么如果您有一个 Form1 的实例(这是具有 @ 987654331@ 变量)。现在的问题是您没有 Form1 的实例,因此您仍然无法访问它。如果f2 是静态的,那么你不需要Form1 的实例来访问它的字段,你只需要类名。
  • 正如我在其他地方所说的那样,你不想那样做。这些表单变量应该是非静态的和私有的。您应该使用Form3 上的公共属性或构造函数中的参数来传递值,而不是使它们成为静态或更多地公开各种表单变量。
【解决方案2】:

男人,

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

【讨论】:

  • 谢谢。我认为这可行,但是为什么在子表单 (f3) 实例中无法访问父表单 (f2) 实例?
  • @John 因为它超出了范围。如果您在两个 Form 对象之间建立一个链接,只需在 Form3 中创建一个 Form 类型的父属性,并且当您调用 Form3 的构造函数时,将 form2 form3.Parent = form2 分配给该属性。
  • 请注意,按照罗德里戈的建议去做通常被认为是一种不好的做法。就像制作 static 的所有内容一样,它涉及公开公开的信息多于应公开的信息。
  • 好的,@Servy 是我的客人来回答这个问题。
  • @RodrigoReis 我指的是传递父表单引用的评论,这在我看来只是不好的代码气味,而不是你的答案内容(这是一个很好的解决方案+1 )。哦,为了记录,我不久前发布了这个问题的答案。
【解决方案3】:

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

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

【讨论】:

  • 根据上面@Uwe Keim 分享的链接,我强烈建议将它们设为公共属性,而不是公共变量。
  • 问题出在form3,f2在intellisense中甚至不存在,无论是否去除静电。
【解决方案4】:

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

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

既然所有的值都是在运行时赋值的,那么静态的怎么可能呢? 变量这样做?

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

【讨论】:

  • 一切都以public为前缀,我知道使用静态变量不需要创建类的对象,但我的困惑是,form2上的变量值无法预先确定但根据 form2 上的用户输入进行分配;但是在这种情况下,将这些变量设为静态确实可以解决问题……如何?
  • @John 让所有东西 public static 只是让所有东西都成为一个全局变量。在这种情况下,您并不真的希望这样。每个表单都有每个变量的副本是有意义的。它之所以有效,是因为只有一种形式。虽然它在简单的情况下确实有效,但这不是一个好的做法,它基本上会成为阻止你正确学习如何做的拐杖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2016-10-25
相关资源
最近更新 更多