当前位置:编程学习 > C#/ASP.NET >>

如何在子窗体刷新父窗体的datagridview

父窗体中有个datagridview,
方法datashow为它绑定数据
子窗体是从父窗体中创建的,是用来新建数据的
在子窗体里有个保存按钮
请问如何在按钮事件中激发父窗体的datashow方法来给datagridview重新绑定数据
看了资料说要用 委托
请哪位高手给写个代码
谢谢。。
--------------------编程问答-------------------- 用子窗体的DialogResult判断
父窗体的写法
if (子窗体.DialogResult==DialogResult.Ok){
   刷新数据
}
子窗体的写法。
如果是子窗体关闭以后刷新父窗体,就在子窗体的关闭事件中写this.DialogResult=DialogResult.Ok
否则就在保存事件中写 --------------------编程问答-------------------- 父窗体要在哪个事件中写呢? --------------------编程问答-------------------- 父窗体
 public Form4()
        {
            InitializeComponent();
            DataBind();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form3 frm = new Form3();
            this.Hide();
            frm.Show();
        }
        void DataBind()
        {
            Form3 frm = new Form3();
            if (frm.DialogResult == DialogResult.OK)
            {
                MessageBox.Show("大家好!");
            }
        }
子窗体
 public Form3()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form4 frm = new Form4();
            frm.Show();
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
这样试试 --------------------编程问答-------------------- vb.net 怎么写?
谢谢
--------------------编程问答-------------------- 你这个好像是弹出子窗体时
父窗体隐藏了
我要求的父窗体并不隐藏
子窗体关闭时
父窗体要在哪个事件中知道子窗体已关闭?
引用 3 楼 qfgyd2004 的回复:
父窗体 
public Form4() 
        { 
            InitializeComponent(); 
            DataBind(); 
        } 

        private void button1_Click(object sender, EventArgs e) 
        { 
            Form3 frm = new Form3(); 
            this.Hide(); 
            frm.Show(); 
        } 
        void DataBind() 
        { 
            Form3 frm = new Form3(); 
            if (frm.Dialo…
--------------------编程问答-------------------- 将父窗口的datagridview作为构造参数传递给子窗口可以解决这个问题. --------------------编程问答-------------------- 是不是点击完保存关闭子窗体,刷新父窗体,如果这样,在子窗体ShowDialog代码之后刷新就可以了 --------------------编程问答-------------------- 请问在vb2005中,怎样将父窗口的datagridview作为构造参数传递给子窗口?
引用 6 楼 hefei0603 的回复:
将父窗口的datagridview作为构造参数传递给子窗口可以解决这个问题.
--------------------编程问答-------------------- 子窗体ShowDialog代码?
引用 7 楼 cowboy0000 的回复:
是不是点击完保存关闭子窗体,刷新父窗体,如果这样,在子窗体ShowDialog代码之后刷新就可以了
--------------------编程问答-------------------- private DataGridView mainDataGridView;
public Form4(DataGridView dgv)
        {
            InitializeComponent();
            DataBind();
            mainDataGridView=dgv;
        }
对mainDataGridView的操作就是对主窗口的datagridview了.
--------------------编程问答-------------------- 比较简单的方法是将datashow方法Public
然后在子窗体中的按钮事件中执行
CType(Me.Owner, 父窗体类名).datashow()
--------------------编程问答-------------------- vb2005要怎么写
谢谢 
引用 10 楼 hefei0603 的回复:
private DataGridView mainDataGridView; 
public Form4(DataGridView dgv) 
        { 
            InitializeComponent(); 
            DataBind(); 
            mainDataGridView=dgv; 
        } 
对mainDataGridView的操作就是对主窗口的datagridview了. 
--------------------编程问答-------------------- 子窗体的“CType(Me.Owner, 父窗体类名).datashow() ”
提示没有实例化
引用 11 楼 xldata 的回复:
比较简单的方法是将datashow方法Public 
然后在子窗体中的按钮事件中执行 
CType(Me.Owner, 父窗体类名).datashow() 
--------------------编程问答-------------------- 主窗体:

一个button,用于打开SQL填写界面


Imports System.Data
Imports System.Data.SqlClient
Public Class Form8
    Private connstr As String = "Server=(local);packet size=4096;Database=testwater;User ID=sa;Password=;Trusted_Connection=False"
    Private Conn As New SqlConnection(connstr)
    Public sql As String
    Private Sub Form8_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If sql = "" Then
            sql = "select * from [test] order by id asc"
        End If
        l(sql)
    End Sub

    Private Sub l(ByVal sql As String)
        ' Dim sql As String = "select * from [test] order by id asc"
        Dim cmd As New SqlDataAdapter(sql, Conn)
        Dim ds As New DataSet
        cmd.Fill(ds, "工")
        MsgBox(ds.Tables("工").Rows.Count)
    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim c As New Form9
        c.ShowDialog()
        If c.DialogResult = Windows.Forms.DialogResult.OK Then
            sql = c.TextBox1.Text.Trim
        End If
        l(sql)
    End Sub
End Class


子窗体:
一个textbox,用于输入SQL语句;一个button确定语句输入完成并反回主窗体

Public Class Form9

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        DialogResult = Windows.Forms.DialogResult.OK
    End Sub
End Class
--------------------编程问答-------------------- 不好意思~发错了~~~~~~~~对不起啊~ --------------------编程问答-------------------- 再问 --------------------编程问答-------------------- 看了一下楼上各位的答案,目前的问题我觉得如果是在子窗口关闭后判断DialogResult是否为OK再进行刷新的话应该是简单的,楼主应该也会写。如果对于有些需求来说,要求在子窗口不关闭的情况下去刷新父窗口的DataGridView(例如可以连续新增,增加一行后父窗口自动将这行显示出来而不关闭子窗口),那么这时候我建议还是在子窗口中定义一个自定义事件。在子窗口的保存按钮代码成功执行后,触发本窗口的这个自定义事件。由父窗口接收事件并刷新自己的DataGridView。这要求在打开子窗口时就将订阅子窗口的这个自定义事件(抱歉由于很久不用VB.net了,所以只能给出一部分C#代码):

        //父窗口有关代码
        vehicle.vehicleOutDetailForm outForm = new vehicleOutDetailForm();
        outForm.RaiseVehicleChangedEvent += new EventHandler<VehicleChangEventArgs>(outForm_RaiseVehicleChangedEvent);
        outForm.ViewMode = vehicleOutDetailForm.VehicleOutFormViewMode.AddNew;
        outForm.ShowDialog();

        void outForm_RaiseVehicleChangedEvent(object sender, VehicleChangEventArgs e)
        {
            RefreshList();
        }
        
    //子窗口中定义事件,为了扩展需要即使不传递参数还是尽量声明一个自定义事件参数类
     public class VehicleChangEventArgs : EventArgs
    {
        public VehicleChangEventArgs(string vehicleNo)
        {
            this.vehicleNo = vehicleNo;
        }
        private string vehicleNo;
        public string VehicleNo
        {
            get { return vehicleNo; }
        }
    }

    public event EventHandler<VehicleChangEventArgs> RaiseVehicleChangedEvent;

    //在保存按钮中可用此函数激发事件,如OnRaiseVehicleChangedEvent(new VehicleChangEventArgs(""));
    protected virtual void OnRaiseVehicleChangedEvent(VehicleChangEventArgs e)
    {
        EventHandler<VehicleChangEventArgs> handler = this.RaiseVehicleChangedEvent;
        if (handler !=null)
        {
            handler(this, e);
        }
    }



    个人感觉会写VB.net相关代码的话看懂以上代码不难,仅供参考。 --------------------编程问答-------------------- 用JAVA实现就简单多了,匿名内部类很方便. --------------------编程问答-------------------- VB2005 可以在子窗体中使用form1.datagridview 这样的代码直接对父窗体form1的控件进行操作。 --------------------编程问答-------------------- 学习 一下 --------------------编程问答-------------------- 学习;了  --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 我也想知道
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,