这个问题可能已经得到了解答,我可能在google中键入了错误的问题,但我想运行form1上的函数time_refresh
并且从form2运行良好。这就是我到目前为止所得到的:
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 :(得分:0)
您收到该错误是因为您未指定form1
值。
您可以在form2
上创建一个属性:
public Main_form_1 Form1 { get { return form1; } set { form1 = value; } }
并在form1
初始化form2
上分配
// code from some form1 method
var form2 = new form2();
form2.Form1 = this;
form2.Show();
答案 1 :(得分:0)
您应该初始化Form2中的变量form1
它是一个Main_form_1类型的变量,具有空值(意味着它没有分配给Main_form_1的任何有效实例)
最明显的方法是在创建Form2实例时传递当前Main_form_1
的实例。
例如,在当前Main_form_1
内部,您可以创建Form2的实例
此时,您传递当前Main_form_1
Form2 f = new Form2(this);
并在Form2的构造函数中
public Form2(Main_form_1 f)
{
form1 = f;
}
现在,您的Form2实例具有对正在运行的Main_form_1
的正确引用,并且可以在正确的Main_form_1实例上调用time_refresh()
方法
答案 2 :(得分:0)
您可能希望在表单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)
这将允许您在表单2代码中使用form1中的公共方法。虽然没有问题来实例化新的form1,因为它不会成为向用户显示的表单。
答案 3 :(得分: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();
答案 4 :(得分:-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;
}
从那里你可以调用这些函数,它应该影响你的原始形式。