C# windows程序中,Form1为主窗体,Form2和Form3为子窗体。
通过Form1菜单新建生成Form2和Form3窗体,Form2和Form3窗体同时被创建,如果点击Form3上的按钮,使Form2窗体重新载入,或更新Form2上的DataGrid数据?最好请给出代码示例

解决方案 »

  1.   


    在form2上,增加一个public的方法,在该方法里来更新DataGrid数据.
    然后,在form1里调用Form2该方法.
      

  2.   

    还是说说大概思路吧。假设用于填充DataGrid的data source(如DataSet)在Form2的对象里,那么当点击Form3上的按钮时应该能够通知From2的DataGrid清空现在的DataSource,重新载入数据。
    // Form2对象必须能够订阅到Form3上按钮点击的事件(event)
    // 搞的简单些,把Form3上的button1改成public// Form1.cs
    public Form2 frm2;//弹出Form2的菜单
    Form2 frm2 = new Form2();
    this.frm2 = frm2;
    frm2.Show();//弹出From3的菜单
    Form3 frm3 = new Form3();
    if(frm2 != null)  //如果Form2已经打开
    {
        frm3.button1.Click += new EventHandler(frm2.LoadData); //订阅Form3的按钮点击事件
    }
    frm3.Show();// Form2.cs
    private DataSet ds;
    ds = new DataSet(); // 在构造函数里实例化//写一个从数据库填充数据到DataSet,并显
    //示在DataGrid的事件处理程序。Form3的
    //button1被点击时执行这个。
    public void LoadData(object sender, EventArgs e) 
    {
        ds.Clear(); //清空DataSet
        dataGrid1.DataSource = null;    SqlConnection conn = new SqlConnection();
        conn.ConnectionString = "server=MY_SERVER;uid=sa;pwd=;database=MY_DB";
        conn.Open();    SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "select * from MY_TABLE";
        cmd.Connection = conn;    SqlDataAdapter da = new SqlDataAdapter(cmd);    da.Fill(ds,"table");
        dataGrid1.DataSource = ds;
        dataGrid1.DataMember = "table";

        conn.Close();
    }private void Form2_Load(object sender, System.EventArgs e)
    {
        LoadData(this, EventArgs.Empty); //Form2启动时...
    }
      

  3.   

    观察过windows的资源管理器吗?一有文件变化自己就显示了,它是使用事件消息机制的,楼主的需求可类似作个事件委托来实现。
      

  4.   


    Form1 f2 = new Form1();
    Form1 f3 = new Form1(f2);
    f2.show();
    f3.show();改Form3构造函数
      

  5.   

    namhyuk(namhyuk)说得差不多啦
    先去试试
      

  6.   

    namhyuk的方法应该可以实现,不过新建两个窗口分别在两个menuItem_Click函数中,请问如何调用?并且Form3的Button还要触发自己的Click事件,感觉有点问题。请问用事件委托或消息如何处理?谢谢
      

  7.   

    to:luckyjia(佳佳) 
    >>新建两个窗口分别在两个menuItem_Click函数中,请问如何调用?
    这问题也太基础了吧?>>Form3的Button还要触发自己的Click事件...
    用户点击Form3上的Button时会自动触发Button的Click事件,谁说人工触发了?Form2只是订阅了Form3的Button被点击的事件而已。
      

  8.   

    您好,frm2要比frm3新创建是不是? 那么menuItem3_Click函数中新建的是frm3,frm2在menuItem2_Click函数中新建,在menuItem3_Click函数中怎么找到frm2?
      

  9.   

    所以才有
    if(frm2 != null)  //如果Form2已经打开
    {
        frm3.button1.Click += new EventHandler(frm2.LoadData); //订阅Form3的按钮点击事件
    }
    frm3.Show();还有
    // Form1.cs
    public Form2 frm2;你没仔细看代码吗?