从另一个类访问对象

本文关键字:对象 访问 另一个 | 更新日期: 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;