none
窗体中如何互相改变对象的属性?? RRS feed

  • 问题

  • 如题,例:有两个窗体Form1和Form2,其中Form1中有一个timer1,Form2中有一个Button2,要求当单击Button2时改变Timer1的Enable属性。
    2010年2月8日 13:06

答案

  • 这个简单呀:

    public class Form1 : public System.Windows.Forms.Form
    {
        // 把你的定时器对象public 出来
        public  System.Timers.Timer tmr = new Timer(10000);
       
        Form1()
        {
             // 在恰当的地方把Form1 赋值给Form2 的_frm1 成员, 放在构造函数里只是举例子, 具体视情况而定
             Form2._frm1 = this;
        }
    }

    public class Form2: public System.Windows.Forms.Form
    {
    private System.Windows.Forms.Button Button2 = new Button();
    public Form1 _frm1 = null;
    pirvate InitializeComponent()
    {
      // 界面创建代码省略
    }
    public Form2()
    {
        InitializeComponent();
        Button2.Click += new EventHandler(Button2_Click);
    }
    public Button2_Click(object sender, EventArgs e)
    {
       // 在这里设置
        _frm1.tmr.Enable = false;
    }
    }
    • 已标记为答案 Aflame9191 2010年2月9日 12:40
    2010年2月8日 13:42
  • 你好!
         实现的方式比较多,我认为用委托实现这个需求比较合适,其他方法比较容易增加代码的耦合度,给维护带来困难:
        public partial class ChildForm : Form
        {
            public delegate void TimerEnableChangedHandler(bool isEnable);
            public TimerEnableChangedEventHandler TimerEnableChanged;
            public ChildForm()
            {
                InitializeComponent();
            }

           
            private void btn_Ok_Click(object sender, EventArgs e)
            {           
                if (TimerEnableChanged != null)
                    TimerEnableChanged(true); //委托调用
               
            }
        }
    主窗体给委托变量赋值就可以了:
        public partial class MainForm : Form
        {
            private ChildForm loginForm = new ChildForm();
            public MainForm()
            {
                InitializeComponent();
                loginForm.TimerEnableChanged = new ChildForm.TimerEnableChangedEventHandler(loginForm_TimerEnableChanged);
            }

            protected void loginForm_TimerEnableChanged(bool isEnable)
            {
                this.timer1.Enable=isEnable;
            }

            private void button1_Click(object sender, EventArgs e)
            {
                loginForm.Show();
            }
        }
    周雪峰
    • 已标记为答案 Aflame9191 2010年2月9日 12:40
    2010年2月8日 14:39
    版主

全部回复

  • 这个简单呀:

    public class Form1 : public System.Windows.Forms.Form
    {
        // 把你的定时器对象public 出来
        public  System.Timers.Timer tmr = new Timer(10000);
       
        Form1()
        {
             // 在恰当的地方把Form1 赋值给Form2 的_frm1 成员, 放在构造函数里只是举例子, 具体视情况而定
             Form2._frm1 = this;
        }
    }

    public class Form2: public System.Windows.Forms.Form
    {
    private System.Windows.Forms.Button Button2 = new Button();
    public Form1 _frm1 = null;
    pirvate InitializeComponent()
    {
      // 界面创建代码省略
    }
    public Form2()
    {
        InitializeComponent();
        Button2.Click += new EventHandler(Button2_Click);
    }
    public Button2_Click(object sender, EventArgs e)
    {
       // 在这里设置
        _frm1.tmr.Enable = false;
    }
    }
    • 已标记为答案 Aflame9191 2010年2月9日 12:40
    2010年2月8日 13:42
  • 你好!
         实现的方式比较多,我认为用委托实现这个需求比较合适,其他方法比较容易增加代码的耦合度,给维护带来困难:
        public partial class ChildForm : Form
        {
            public delegate void TimerEnableChangedHandler(bool isEnable);
            public TimerEnableChangedEventHandler TimerEnableChanged;
            public ChildForm()
            {
                InitializeComponent();
            }

           
            private void btn_Ok_Click(object sender, EventArgs e)
            {           
                if (TimerEnableChanged != null)
                    TimerEnableChanged(true); //委托调用
               
            }
        }
    主窗体给委托变量赋值就可以了:
        public partial class MainForm : Form
        {
            private ChildForm loginForm = new ChildForm();
            public MainForm()
            {
                InitializeComponent();
                loginForm.TimerEnableChanged = new ChildForm.TimerEnableChangedEventHandler(loginForm_TimerEnableChanged);
            }

            protected void loginForm_TimerEnableChanged(bool isEnable)
            {
                this.timer1.Enable=isEnable;
            }

            private void button1_Click(object sender, EventArgs e)
            {
                loginForm.Show();
            }
        }
    周雪峰
    • 已标记为答案 Aflame9191 2010年2月9日 12:40
    2010年2月8日 14:39
    版主