我正在尝试从我的设置表单更改计时器的间隔值(在Form1中)。
我用static Form1 formInstance;
声明form1
但是当我更改值时,它会在forminstance上抛出null异常。
我也尝试了Form1 form1 = new Form1();
但是当我打开设置表单时应用程序崩溃了。请注意,我已经将timer修饰符设置为public。
public partial class SettingsForm : Form
{
static Form1 formInstance;
...
if (Properties.Settings.Default.sync != Convert.ToInt32(textBox1.Text))
{
formInstance.timer1.Stop();
formInstance.timer1.Interval = 60000;
formInstance.timer1.Start();
}
答案 0 :(得分:2)
看来你有两个班级:
在Windows中,更常见的是让表单记住所有更改的设置,直到操作员按OK或取消,而不是在操作员更改值时立即更新设置。
话虽如此,我假设如下:
让我们举一个例子:
代码如下:
public class SettingsForm : Form
{
public TimeSpan TimerTime {get; set;}
public int Setting1 {get; set;}
public string Setting2 {get; set;}
public void OnButtonOk_Clicked(object sender, ...)
{
if (!this.AllValuesOk())
{ // error in one of the values
// show message box
}
else
{
this.Close();
}
}
}
现在,让我们在Form1上单击button1时显示设置表单:
private void OnButton1_Clicked(object sender, ...)
{
using (var settingsForm = new SettingsForm)
{
settingsForm.TimerTime = this.TimerTime;
settingsForm.Setting1 = this.Setting1;
settingsForm.Setting2 = this.Setting2;
// now that the settings form is initialized
// we can show it and wait until the user closes the form
var dlgResult = settingsForm.ShowDialog(this);
// only use the new settings if the operator pressed OK:
if (dlgResult == DialogResult.OK)
{
this.TimerTime = settingsForm.TimerTime;
this.Setting1 = settingsForm.Setting1;
this.Setting2 = settingsForm.Setting2;
this.ProcessChangedSettings();
}
}
}
请注意,设置表单不必了解有关Form1的任何信息。这使它能够使用具有TimerTimer,Setting1和Setting2的任何表单的设置表单。
您是否还注意到,如果用户按下“取消”,或按下设置表单右上角的十字或按alt-F4,或者他可以用来取消的任何方法,使用原始设置是多么容易。
另请注意,在更改期间,操作员可能具有不可比的设置,例如,成品字符串减半,计时器时间不正确等。只有在他按下OK的时候,软件才会检查是否所有值都正确填写。
答案 1 :(得分:0)
将form1作为参数传递给settingForm
的构造函数private Form1 _objForm1;
public SettingForm (Form1 objForm1)
{
_objForm1 = objForm1;
}
Private ButtonClicked(sender,...)
{
_objForm1.timer1.Stop();
_objForm1.timer1.Interval = 60000;
_objForm1.timer1.Start();
}
答案 2 :(得分:0)
使用Form1中的属性并从另一个表单访问它。在设置表单中创建一个私有变量,例如:
private int interval;
创建一个getter setter方法:
public int Interval
{
get { return interval; }
set { interval = value; }
}
然后在SettingsForm中,在方法结束时返回this.DialogResult = DialogResult.OK;
对话框结果,例如在按钮点击事件结束时。
在Form1中打开SettingsForm时,您可以访问SettingsForm中设置的值:
if(settingsForm.ShowDialog() == DialogResults.OK)
{
timer1.Interval = settingsForm.Interval;
}
答案 3 :(得分:-1)
如果您想访问计时器而不是实例,
Form1.timer.Interval = 4;
你必须进入" Form1.designer.cs"并找到它所说的位置
public Timer timer1;
并将其更改为
public static Timer timer1;