从另一个类访问对象
本文关键字:对象 访问 另一个 | 更新日期: 2023-09-27 18:16:58
我试图改变定时器的间隔值(在Form1)从我的设置形式。我用static Form1 formInstance;
来表示形式1但是当我改变值时,它会在实例上抛出空异常。我也尝试过Form1 form1 = new Form1();
,但是当我打开设置表单时应用程序崩溃了。请注意,我已经将定时器修改器设置为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();
}
你似乎有两个类:
- 一个Form1类,它有一个你想要改变的定时器,
- A settings Form,在Form1 中设置定时器
在windows中,更常见的是让表单记住所有更改的设置,直到操作人员按下OK或Cancel,而不是在操作人员更改值时立即更新设置。
- 优点:操作员可以多次更改数值,甚至可以按取消键。只有按下OK键,时间值才会被设置。
- 优点:如果设置表单控制了几个相互关联的设置,当操作员在按OK时表示他完成了更改值时,检查更改值的有效性要容易得多
- 缺点:操作员在按下OK后才知道改变值的效果。 这个缺点可以通过提供立即申请按钮来解决。注意OK/Cancel/Apply Now是标准的Windows行为。每个人都知道会发生什么,而一个方法,改变你的表单的一些设置立即和一些不可能混淆。
说了这些,我假设如下:
- 在某些事件(可能是点击按钮,或选择菜单项)下,表单决定是时候显示其设置表单了。
- 操作员更改零个或多个设置并按OK或Cancel
- 如果操作员按OK键,则通知主表单。它将要求设置表单进行设置并相应地更新设置。
我们举个例子:
- 我们有一个Form1与button1和timer1,它有几个设置,例如TimerTimeout, Setting1和Setting2。
- 如果操作员单击button1,则显示设置表单。
- 最初设置表单显示timerTimeout, Setting1和Setting2的当前值。
- 操作员可以更改这些设置的值。 当他完成后,他可以点击取消或确定
代码如下:
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();
}
}
}
现在让我们展示一下当button1点击Form1时的设置表单:
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的表单使用settings表单。
你是否也注意到,如果用户按取消键,或按设置表单右上角的十字键,或按alt-F4键,或任何可以用来取消的方法,使用原始设置是多么容易。
还要注意,在更改过程中,操作符可能有不兼容的设置,例如完成一半的字符串,不正确的计时器时间等。只有当他按下OK键时,软件才会检查是否正确填写了所有值。
将form1作为参数传递给setingform的构造函数
private Form1 _objForm1;
public SettingForm (Form1 objForm1)
{
_objForm1 = objForm1;
}
Private ButtonClicked(sender,...)
{
_objForm1.timer1.Stop();
_objForm1.timer1.Interval = 60000;
_objForm1.timer1.Start();
}
使用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;
}
如果你想访问定时器,但不是从实例,
Form1.timer.Interval = 4;
你必须进入" form。designer。cs"找到它写着
的地方public Timer timer1;
并将其更改为
public static Timer timer1;