关闭子窗体时如何刷新datagridview?

Posted

技术标签:

【中文标题】关闭子窗体时如何刷新datagridview?【英文标题】:How to refresh datagridview when closing child form? 【发布时间】:2011-01-24 15:14:50 【问题描述】:

我的主窗体上有一个 dgv,有一个按钮可以打开另一个窗体以将一些数据插入到与 dgv 绑定的数据源中。我想当子窗体关闭 dgv 自动刷新时。我试图在子窗体关闭事件中添加它,但它没有刷新:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
        
            frmMain frmm = new frmMain();

            frmm.itemCategoryBindingSource.EndEdit();
            frmm.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
            frmm.dataGridView1.Refresh();
        

但是,当我在父窗体上的按钮中添加此代码时,它确实起到了作用:

        this.itemCategoryBindingSource.EndEdit();
        this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
        this.dataGridView1.Refresh();

【问题讨论】:

【参考方案1】:

有很多方法可以做到这一点,但以下是最简单的,它会做你想做的事情并让你开始。

在主窗体上创建一个公共方法。 将第二种形式的构造函数修改为采用主形式。 创建传递主表单对象的第二个表单的实例。 关闭第二个窗体时,调用主窗体对象的公共方法。

表格1

public partial class Form1 : Form 
    public Form1() 
        //'add a label and a buttom to form
        InitializeComponent();
    
    private void button1_Click(object sender, EventArgs e) 
        Form2 oForm = new Form2(this);
        oForm.Show();
    
    public void PerformRefresh() 
        this.label1.Text = DateTime.Now.ToLongTimeString();
    

Form2

public class Form2 : Form 
    Form1 _owner;
    public Form2(Form1 owner) 
        _owner = owner;
        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
    
    private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
        _owner.PerformRefresh();
    

【讨论】:

@rockyashkumar:代码在 Form1 和 Form2 之间拆分。我会更新答案。【参考方案2】:

我们也可以这样进行:

我们有 form_1 和 form_2

    在form_1 中,创建一个公共方法。在这个公共方法中,我们放置了我们的东西; 在 form_2 中,我们创建了一个全局表单变量; 还在form_2中,通过form_2构造函数将form_1传入form_2; 仍在 form_2 中,让您的全局变量(我们在步骤 2 中创建的那个)接收我们在 form_2 构造函数中创建的新 form_1 实例; 在 closing_event 方法中,我们调用包含我们的东西的方法。

使用我们的东西的方法是填充我们的 form1 列表、dataGridView、comboBox 或任何我们想要的方法。

Form_1:

public fillComboBox()//Step 1. This is the method with your stuff in Form1

     foreach(var item in collection myInfo)
     myComboBox.Items.Add(item)


Form_2:

Form1 instanceForm1;//Step 2
public Form2(Form1 theTransporter)//Step 3. This the Form2 contructor. 
 
    InitializeComponent();
    instanceForm1 = theTransporter;//Step 4


private void Form2_FormClosing(object sender, FormClosingEventArgs e)

    instanceForm1.fillComboBox();//Step 5 we call the method to execute the task updating the form1

希望对你有帮助……

【讨论】:

【参考方案3】:

您正在创建一个不影响实际主窗体实例的主窗体的新实例。您需要做的是,在主窗体本身上调用代码,就像您说的代码在按钮单击上起作用一样:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)

    this.itemCategoryBindingSource.EndEdit();
    this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
    this.dataGridView1.Refresh();

【讨论】:

frmNew 不包含这些项目的定义,我必须创建一个 frmMain 实例才能访问它们。【参考方案4】:

那里的答案很好!另一种方法是:

    检查您要更新的表单是否已打开。

    调用方法来刷新你的gridVieW。

    **在form1 中的refreshMethod() 中,确保将datasource 设置为null **

 if (System.Windows.Forms.Application.OpenForms["Form1"]!=null)
            
                (System.Windows.Forms.Application.OpenForms["Form1"] as Form1).refreshGridView("");
            

【讨论】:

以上是关于关闭子窗体时如何刷新datagridview?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform怎么实现子窗体关闭时刷新父窗体数据

C# winform DataGridView刷新慢

如何实现我另一个窗口关闭时,刷新这个窗口(C#中问题)

关于winform子窗体刷新父窗体

WPF关闭子窗口时刷新父页面列表数据,WPF窗体间传参

winform中(当数据库的数据有变化时)datagridview 刷新的问题