假设datagrid在form1里,form里有如下的刷新函数
public void Refreshgrid()
{
ds.Clear();
myadapter.Fill(ds,"manager");
grid.DataSource = ds;
grid.DataMember = "manager";
grid.Refresh();
}
其中ds为dataset ,manager为数据库表名,grid为datagrid对象,在form1里面调用该函数可以实现datagrid的刷新
但是在窗口form2里面的一个按钮事件里面 有如下代码:
manager.Form5.mainform.Refreshgrid(); this.Dispose();
manager.Form5.mainform.gform.Dispose();
其中mainform为from1的一个对象 后两句代码为关闭两个打开的窗口
这样没有办法实现datagrid的刷新 请问应该怎么做?

解决方案 »

  1.   

    假设datagird在form1,只要把form1的实例传到form2中,就可以在form2中使用form1中的public函数和变量了,你可以用属性来把form1的实例传入form2中
    例如:
    form2窗体:
    private Form1 form1;
    public Form1 Form1
    {
        get { return form1 ; }
        set { form1 = value ;}
    }form1中的button按键如下:
    form2 temp = new form2();
    temp.Form1 = this;
    temp.Show();
    这样你就可以在form2中直接调用form1.Refreshgrid()函数了。
      

  2.   

    恩 这样是可以解决的
    不过 我的子窗口是二级子窗口  也就是主窗口打开一个子窗口后由子窗口打开的“孙子窗口” 怎么弄?如果我用中间的子窗口中的一个作为中间过度的话, 出现如下错误:
    未处理的“System.NullReferenceException”类型的异常出现在 manager.exe 中。
    其他信息: 未将对象引用设置到对象的实例。请问应该怎么弄?谢谢了
      

  3.   

    就是在一级子窗口中设一个 public Form1 form1; 在父窗口中 sub.form1 = this;
    在二级子窗口中也设置一个 public Form1 form1; 在一级子窗口中 grandsun.form1 = form1;这样写对吗?
      

  4.   

    to 未将对象引用设置到对象的实例出现这种问题应该是空引用了,也就是说你的form1已经不存在了,但是你还用form1.Refreshgrid()。所以就出现这个问题了。
    一般来讲,如果两个窗体没有什么关系的话,是不建议用属性来相互传值的,应该用delegate来做,如果用的话,在用之前要先判断,如:
    if ( form1 != null || !form1.IsDisposed )
     form1.Refreshgrid();如果form2是依附于form1的子窗体的话,最好用owner属性。如
    form2 temp = new form2();
    temp.owner = this;
    temp.Form1 = this;
    temp.Show();
    这样form2就一直在form1的前面,如果form1被关闭了,那么form2也就被关闭了。
      

  5.   

    to 
    就是在一级子窗口中设一个 public Form1 form1; 在父窗口中 sub.form1 = this;
    在二级子窗口中也设置一个 public Form1 form1; 在一级子窗口中 grandsun.form1 = form1;没错,这样也可以,但是form1还是不能被关闭,否则还会出现NULL的异常
      

  6.   

    睡觉了,有事在csdn中发短信给我
      

  7.   

    但是我form1没有关闭啊  一直没有关闭  但还是不行
    在每一个子窗口的构造函数里面是不是要加上form1 = new Form1();?对不起 刚上手c#  请指点
      

  8.   

    如果datagrid在form1里的话。就把刷新函数放到form1里面,代码如下:public static bool IsExist = false;//标识form1是否已经存在或实例化 - 默认为不存在...//form1加载时改变标记
    private void form1_Load(object sender, System.EventArgs e)
    {
       IsExist = true;
    }////form1关闭后还原标记
    private void form1_Closed(object sender, System.EventArgs e)
    {
       IsExist = false;
    }
    //静态的...注意把DataSet和DataGrid也定义成静态的...
    public static void Refreshgrid()
    {
       //如果form1已经实例化或在内存中存在时,运行以下操作...
       if(IsExist)
       {
          ds.Clear();
          myadapter.Fill(ds,"manager");
          grid.DataSource = ds;
          grid.DataMember = "manager";
          grid.Refresh();
       }
    }实现在form里面刷新form1的datagrid。只要在form的Button事件里加如下代码就可以了:form1.Refreshgrid();
    另外一种方法。就更好了
    用委托事件就可以
    在委托的方法里面用this.IsDisposed来判断form1是否存在来实现功能就可以了
    实现步骤虽然比较复杂。但是效率更高...
    此种方式,强烈推荐...
      

  9.   

    请教"//静态的...注意把DataSet和DataGrid也定义成静态的... ",怎么弄?