我想通过子窗体的一个按钮,刷新父窗体的数据,父窗体的数据能立即显现,请问如何实现?

解决方案 »

  1.   

    要么委托
    要么就这么些在父窗体中,写入如下静态构造
    public mainFrm main=null;在构造中写入main=this;然后把其mainFrm_load()事件改成公共public类型在子窗体中在按钮事件中直接引用
    mainFrm.main.mainFrm_Load(sender,e);就可以刷新了
      

  2.   

    在构造中写入main=this; 
    构造怎么写?
      

  3.   


     public mainfrom()
      {
        main=this;
      }
      

  4.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace EventTransData
    {
        public delegate void CallbackHander(string s);//委托,参数可修改,多参数可以自己定义一个类    public delegate void CallbackHander1(bool b);
        public partial class Form1 : Form
        {
            object thislock = new object();
            public Form1()
            {
                InitializeComponent();
            }
            public event CallbackHander GetString;//定义的事件,命名规则不对        System.Threading.Timer t ;
            private void button1_Click(object sender, EventArgs e)
            {            //我用的System.Threading.Timer,随便用的
                t = new System.Threading.Timer(new System.Threading.TimerCallback(SetData),"",1000,1000);//System.Threading.Timeout.Infinite);
            }        private void SetEnabled(bool b)
            {
                //这里你可以将你想要控制的控件添加进去,我只是简单的将所有的Controls做了一次判断
                //foreach (Control con in this.Controls)
                //{
                //    con.Enabled = b;
                //}
                this.Enabled = b;
            }        private void SetData(object o)
            {
                lock (thislock)
                {
                    if (this.InvokeRequired)
                    {
                        Invoke(new CallbackHander1(SetEnabled), false);
                    }
                    else
                    {
                        SetEnabled(false);
                    }
                    if (this.label1.InvokeRequired)//跨线程调用控件判断
                    {
                        Invoke(new CallbackHander(Refreshlabel), "开始");
                    }
                    else
                    {
                        Refreshlabel("开始");
                    }                if (GetString != null)//开始的事件
                    {
                        GetString("开始");
                    }
                    System.Threading.Thread.Sleep(5000);//你处理的过程
                    if (this.label1.InvokeRequired)
                    {
                        Invoke(new CallbackHander(Refreshlabel), "结束");
                    }
                    else
                    {
                        Refreshlabel("结束");
                    }
                    if (this.InvokeRequired)
                    {
                        Invoke(new CallbackHander1(SetEnabled), true);
                    }
                    else 
                    {
                        SetEnabled(true);
                    }
                    if (GetString != null)//结束的事件
                    {
                        GetString("结束");
                    }
                    System.Threading.Thread.Sleep(5000);
                }
                
            }
            private void Refreshlabel(string value)
            {
                this.label1.Text = value;
            }        private void button2_Click(object sender, EventArgs e)
            {
                //这两个窗体的关系如果不一样你需要自己修改
                Form2 f = new Form2();
                f.Owner = this;
                //f.Show();//非模态
                f.ShowDialog();//模态?
                
            }
        }
    }using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace EventTransData
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void Form2_Load(object sender, EventArgs e)
            {
                Form1 f = (Form1)this.Owner;
                f.GetString += new CallbackHander(f_GetString);
            }        void f_GetString(string s)
            {
                if (this.label1.InvokeRequired)
                {
                    Invoke(new CallbackHander( Refreshlabel),s);
                }
                else 
                {
                    Refreshlabel(s);
                }
            }
            private void Refreshlabel(string value)
            {
                this.label1.Text = value;
            }    }
    }
    前两天也想实现和你类似的功能,代码在上边,看能帮助你不!