从另一个类访问对象

时间:2015-10-10 11:32:49

标签: c# class object

我正在尝试从我的设置表单更改计时器的间隔值(在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();
        }

4 个答案:

答案 0 :(得分:2)

看来你有两个班级:

  • 具有您想要更改的计时器的类Form1,
  • 要在Form1中设置计时器的设置表单

在Windows中,更常见的是让表单记住所有更改的设置,直到操作员按OK或取消,而不是在操作员更改值时立即更新设置。

  • 优点:操作员可以多次更改数值,甚至可以按取消按钮。只有按下确定按钮,才会设置时间值。
  • 优点:如果设置表单控制了几个相互关联的设置,当操作员表示他正在完成按OK时更改值时,更容易检查更改值的有效性
  • 缺点:操作员在按下OK之前不知道更改值的影响。
  • 这个缺点可以通过提供“立即申请”按钮来解决。
  • 请注意,“确定/取消/立即应用”是标准的Windows行为。每个人都会知道会发生什么,而一种方法可以立即更改表单的某些设置,而某些设置可能会让人感到困惑。

话虽如此,我假设如下:

  • 在某些事件(可能是单击按钮或选择菜单项)时,表单决定是时候显示其设置表单。
  • 操作员更改零个或多个设置,然后按确定或取消
  • 如果操作员按下OK,则通知主表格。它将询问设置的设置表格并相应地更新其设置。

让我们举一个例子:

  • 我们有一个带有button1和timer1的Form1,它有几个设置,例如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();
        }
    }
}

现在,让我们在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;