有一个主窗体MainForm,他有2个子窗体ChildForm,DialogForm。 
一个数据类DataLib.
ChildForm上有datagridview1.和方法GetData()用于从DataLib加载数据到datagridview1.MainForm和DialogForm都有可能(非同时)更改DataLib内数据。要求更改后立即刷新ChildForm的datagridview1.请高手指教.
namespace SadelAsk
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }        private void button2_Click(object sender, EventArgs e)
        {
            DataLib.c1 = "加载值一";//数据更改了            cf.Close();
            button1_Click(null, null);
        }        ChildForm cf = null;
        private void button1_Click(object sender, EventArgs e)
        {
            if (cf == null || cf.IsDisposed) cf = new ChildForm();
            cf.MdiParent = this;
            cf.WindowState = FormWindowState.Normal;
            cf.Show();
            cf.Activate();
        }        private void button3_Click(object sender, EventArgs e)
        {
            DialogForm df = new DialogForm();
            df.ShowDialog();
        }
    }
}namespace SadelAsk
{
    public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();            GetData();
        }        private void GetDataBtn_Click(object sender, EventArgs e)
        {
            GetData();
        }        public void GetData()//怎么在外部调用此方法?
        {
            dataGridView1.RowCount = 3;
            for (int i = 0; i < 3; i++)
            {
                dataGridView1[0, i].Value = (i + 1).ToString();
                dataGridView1[1, i].Value = DataLib.c1;
            }
        }
    }
}namespace SadelAsk
{
    public partial class DialogForm : Form
    {
        public DialogForm()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            DataLib.c1 = "加载值二";//数据更改了            //怎么更新ChildFrom?
        }
    }
}namespace SadelAsk
{
    class DataLib
    {
        public static string c1;
    }
}

解决方案 »

  1.   

    把ChildForm的dataview控件公有化。在另两窗体里就可以操作这个控件刷新了。
      

  2.   

     你要在那两个窗体中都得到  show出childForm的那个对象 cf 用它能调那个public的GetData()方法
      

  3.   


    对于大型数据dataview公有化会否增加系统负担降低程序性能?
    dataview为私有的时候GetData()的public声明似乎被无视了?
      

  4.   

    更改通知可以使用委托。ChildForm向DataLib注册委托,DataLib数据一改变就调用注册的委托,进行通知。
    ChildForm接到委托通知后,进行刷新。
      

  5.   

    .NET窗体间共享成员的实现方法
      

  6.   

    这个问题应该要用事件来解决了。思路:在主窗体中用添加新事件,一旦数据改变,就立即触发修改childFrom的数据的事件函数,再在函数中刷新该窗体的数据。
      

  7.   


    DataLib代码 public delegate void UpdateNotification(int para); 
        public class DataLib
        {
            public event UpdateNotification theNotification;        public void UpdateItem()
            {
                // update data
                theNotification(2);//可以传参数告诉定购者什么东西改变了。 
            }
        }
    Form1 创建Form2并定购消息: DataLib lib = new DataLib();        private void button3_Click(object sender, EventArgs e)
            {
                lib.theNotification += new UpdateNotification(DataLibChanged);            Form2 form2 = new Form2();            form2.lib = lib;
                form2.Show();
            }        public void DataLibChanged(int para)
            {
                // Update UI;
                MessageBox.Show("Update");
            }
    Form2 修改数据public DataLib lib = null;        private void button1_Click(object sender, EventArgs e)
            {
                if (lib != null)
                {
                    lib.UpdateItem();
                }
            }
      

  8.   

    DataLib 对象增加数据变动事件,在内部数据发生变化时就触发该事件.ChildForm只是一个调用对象,当DataLib的实便里面的数据变动事件触发时,ChildForm重新调用数据或刷新就行了. 调用者被动刷新.
      

  9.   

    可以尝试用DataSet来操作。主、子窗体的DataGridView都使用各自的DataSet,但是在从主窗体调用子窗体时,将自己的DataSet传递给子窗体就可以了。因为DataSet是引用类型。