2012-12-20 39 views
-3

这个问题可能已经回答了,我可能会在google中输入错误的问题,但是我想运行form1上的函数time_refresh,并且从form2运行良好。这是我走到这一步:c#在form1上运行form1的功能

Form1中

public void time_refresh() 
    { 
     run_stop.Text = Properties.Settings.Default.s_update + " " + Properties.Settings.Default.s_update_int; 
     run_stop.ForeColor = Color.Green; 
    } 

窗体2

private Main_form_1 form1 = null; 

form1.time_refresh(); 

但它得到一个错误

未将对象引用设置为对象的实例。 c#的新东西,所以任何帮助将是优秀的。

+0

First创建窗体'form1 = new Main_form_1();'然后调用方法'form1.time_refresh();' –

+1

@Mario:他可能需要原始窗体。 – SLaks

+0

@SLaks其实,我看的问题越多,我理解的越少=)也许这只是错误的命名。 –

回答

0

解决此问题的正确方法是通过事件。 Form2不应直接访问Form1,它应该只是通知Form1它需要通过事件自行更新。

Form2创建这样一些事件:

public Action event Refresh; //TODO rename as appropriate 

然后,在Form2只要你想Form1知道,它需要对自己进行刷新就可以触发这个事件:

public void OnRefresh() //call this method to fire the event 
{ 
    if(Refresh != null) 
     Refresh(); 
} 

然后在Form1你可以附上一个事件处理程序:

Form2 other = new Form2(); 
other.Refresh +=() => time_refresh(); 
other.Show(); 
+0

好,干净,以及说。:) –

-1

您必须实例化Form1的新实例。试着宣布这样的:

private Main_form_1 form1 = new Main_form_1();

然后你就可以调用form1.time_refresh();

另外,你可以做的是有你需要的Form2 Form1的一个实例。

public Main_form_1 _form1; // global variable 
public Form2(Main_form_1 form1) 
{ 
    _form1 = form1; 
} 

从那里你可以调用的功能,它应该会影响你的原始形式。

+0

感谢它停止错误,但不运行的功能:( –

+1

嗯,从技术上说,它确实运行的功能,只是不在表格的正确的实例。 – Servy

0

你得到那个错误,因为你没有分配form1值。

就可以了,例如在form2创建一个属性:

public Main_form_1 Form1 { get { return form1; } set { form1 = value; } } 

,并从form1form2初始化为它分配:

// code from some form1 method 
var form2 = new form2(); 
form2.Form1 = this; 
form2.Show(); 
0

你应该初始化变量form1你的窗体2中。
由于是,它有一个空值(这意味着它没有被分配到Main_form_1的任何有效的实例)

最明显的方法是当你创建一个通过当前​​的实例的类型Main_form_1的变量Form2的实例。
例如,在当前的​​内部创建Form2的实例。
此时你传递当前Main_form_1

Form2 f = new Form2(this); 

的参考和窗体2的构造

public Form2(Main_form_1 f) 
{ 
    form1 = f; 
} 

现在你的窗体2的实例有一个正确的参考运行​​并可以调用time_refresh()正确的Main_form_1实例上的方法

0

您可能想要在form 2的构造函数中设置form1的实例使用

private Form1 _currentForm1; 
Public Form2(Form1 currentForm1) 
{ 
    _currentForm1 = currentForm1; 
} 

,并在Form1上(在构造函数为例)

private Form1 _thisForm1; 
public Form1() 
{ 
    _thisForm1 = this; 
} 

//in your method simply say 
Form2 form2 = new Form2(_thisForm1) 

这将允许你使用从Form1中的公共方法在窗体2的代码。虽然没有问题来实例化一个新的form1,因为这不会是向用户显示的表单。