2011-05-26 99 views
2

我在c#Express 2010编程,我在程序中有很多形式。我希望一个表单能够以另一种形式查看变量和方法,比如Form 8可以看到并使用Form 5中定义的方法,我应该如何在表单8中定义一个类型为form 5的对象?一个表单如何在c#中看到另一种形式的变量?表单之间的连接

感谢

+1

你应该给你的表单比“表格5”更好的名称。 – svick 2011-05-27 00:06:43

+1

事实上,她会*有*,因为空格不起作用。 – MusiGenesis 2011-05-27 01:11:30

回答

1

创建你所需要的共同的价值观一类,然后传递形式构造函数的参数之间的类的实例。我不能创建代码示例,因为您没有提到需要哪些数据元素。

+1

您甚至可以将父窗体作为参数传递给子窗体构造函数,将该arg复制到子窗体变量(例如,称为“parentForm”),然后从parentForm访问(公用)变量和消息。 – dar7yl 2011-05-26 23:39:42

+0

更简单(虽然不一定更好)的方法是只使用带有'Owner'参数的'Show'和'ShowDialog'的重载(将'this'作为所有者传递)。然后,从子窗体引用父窗体,将子窗体的“所有者”属性转换为“Form1”(或任何父窗体的类型)。 – MusiGenesis 2011-05-27 01:15:45

3

您可以在这里做两件事情:

1)由于@Yuck建议,创建一个类,将包含你需要这两种形式之间共享的成员,并传递类的实例创建一个新的时一个表格(在构造函数中,或通过财产等)

2)的情况下创建一个静态类,将有这样一个地方,这两种形式可以访问所需的字段,然后,你就可以要做:

Information.Field1 
Information.Field2 
Information.Method1() 

假设类别为Information,某些属性为Field1Field2和方法Method1()

当然,第二个选项是无法实现的,因为它可以依靠非静态字段等

编辑:
另一个要考虑的是通过一个事件内的对象。您可以使用其中一种形式创建活动,并以其他形式订阅活动。

当然,这取决于你需要做什么,但这3个是在两种形式之间共享对象的有效选项。

1

这听起来不像是一个非常好的设计。为了您的问题,您可以在实例化form2时通过构造函数将form1的实例传递给form2,然后form2将可以访问form1的所有公共字段。告诉我们更多关于你想要做什么的问题,可能有更好的方法,而不必传递你的表单及其数据的实例。

+0

谢谢!我有一个计算风险的程序,所以我在form1和form2中有其他问题,我想在form2的文本框中添加问题答案的结果,有时form2需要使用form1中的方法,有什么帮助? – Sarah 2011-05-26 23:59:15

+1

创建一个单独的静态类,它存储所有表单问题的答案。这样您就可以将数据存储从用户界面中分离出来,任何需要访问的类都只需要引用存储数据的静态类即可。其他用户已经在这里提出了这个答案,它似乎是解决您的问题的最佳解决方案。 – alexD 2011-05-27 00:06:17

0

您不需要创建一个新的类来保存共享(全局)值。您可以简单地将这些值定义为任何形式的属性(使用适当的getter和setter),并将它们称为SomeFormOrAnother.ThisProperty。这比简单地将表单变量本身公开。

请注意,对于一个复杂的应用来说,这可能不是最好的设计,但对于相对简单的事情来说,它是快速有效的。

+0

嗯..如果他有Form1和Form2,他想显示Form2并使用Form1中的一些属性......他应该怎么做?我的意思是,他必须将Form1实例传递给Form2,或者以某种方式将Form2引用到它们的父级(如果使用ShowDialog()或类似的方式显示)。 – 2011-05-27 01:41:49

0

有很多不同的方式来处理表单之间的通信。既然你把它描述成一个类似的问卷,我会假设第二种形式是你模式地展示的形式(意思是说当你打开时你不能点击下面的形式),你在其中收集了一些与功能相关的形式并将它们全部添加到主表单中,以更简单的格式显示。在按钮点击方法

假设你正在展示从按钮单击第二个形式,把这样的代码:

using (ChildForm child = new ChildForm()) 
{ 
    child.ShowDialog(this); // the "this" is important, since it lets 
          // the child reference the parent form in 
          // a simple way 

    // the code here will block (or stop) on the above line until the user 
    // closes the form. Then you can still reference the child's properties, 
    // even though it's no longer visible. 
    string something = child.something; 
} 

为了使子窗体的something属性可见,声明它作为public子窗体,像这样:

public string something = String.Empty; 

根据许多,这是错误的 - 你应该让something入店这样的:

private string _something = String.Empty; 
public string something 
{ 
    get 
    { 
     return _something; 
    } 
} 

我会把这个辩论留给别人。在你的孩子的形式,当你需要查阅到的方法在父窗体(你做任何这样的方法public),你做这样的:

ParentForm parent = (ParentForm)this.Owner; 
int someValueOrOther = parent.callSomePublicMethod(); 
1

使用Application.OpenForms让所有打开的窗体您的应用程序 然后遍历它像

foreach (var frm in Application.OpenForms) 
     { 
      if (frm.GetType() == typeof(Form2)) 
      { 
       (frm as Form2).Method1(); 
      } 

     } 

您可以访问每个窗体和铸造它原来的类型,你可以使用公共变量,这种形式的方法。