在子窗体关闭后更新DataGridView

时间:2016-07-31 03:48:41

标签: c# .net forms winforms datagridview

我知道很多类似的问题都存在。但是,我是C#的新手,所以无法弄清楚如何解决这个问题。

我在主表单上有一个DataGridView,我有一个对话框来添加新记录。所以,我想要的是在对话框关闭时重新加载/刷新主窗体上的DataGridView。 (按对话框上的保存按钮)。

所以,我在这个主窗体上有一个公共方法,我用这个方法加载数据:

public void UpdateProductsList()
{
  String query = "SELECT * FROM product";
  con = new SqlConnection(conString);
  con.Open();
  SqlDataAdapter sda = new SqlDataAdapter(query, con);    
  DataTable dt = new DataTable();
  sda.Fill(dt);
  dataGridView1.DataSource = dt; 
}

我使用此代码打开子表单:

private void AddProductButton_Click(object sender, EventArgs e)
{
    Add_product obj = new Add_product();
    obj.ShowDialog();
}

现在,当单击“保存”按钮时,我会在子窗体上调用此方法。

private void SaveProductButton_Click(object sender, EventArgs e)
{
    SaveProduct();
    Products products = new Products();
    products.UpdateProductsList();
}

但是,单击“保存”按钮时,这不起作用。奇怪的是,当我将此方法添加到主窗体上的本地按钮时,它的工作没有问题。

我还向MessageBox添加了UpdateProductsList,我确信它已被调用,数据也已插入数据库,但DataGridView未显示新记录。< / p>

那么,我哪里出错了?

2 个答案:

答案 0 :(得分:3)

使用ShowDialog展示子表单时,您不需要从子表单中调用LoadData,而是可以检查ShowDialog的结果,如果是{{1}调用方法。

同样在您的子表单中,在保存数据后的保存按钮中,设置DialogResult.OK

显示子表单

this.DialogResult = DialogResult.OK

以子窗体形式保存按钮

using (var f = new ChildForm())
{
    if(f.ShowDialog()== System.Windows.Forms.DialogResult.OK)
        this.LoadData(); /*Load data in list form*/
}

注意

  • 调用ShowDialog时,在关闭对话框之后才会执行其后面的代码。
  • 如果您使用this.SaveData(); /*Save Data in child form */ this.DialogResult = System.Windows.Forms.DialogResult.OK; 展示表单,则设置ShowDialog Form属性会关闭表单。
  • 您可以在保存按钮中将DialogResult设为OK,并在取消按钮中将其设为Cancel
  • 目前您的问题出在保存按钮的代码中,您已创建列表表单的新实例并调用其UpdateProductsList方法。它对您可以看到的列表表单的打开实例没有任何影响。这是一个不同的因素。

答案 1 :(得分:1)

这只是一个示例,如何从子窗体中调用主窗体中的公共方法:

public class Products : Form
{
    public void UpdateProductList()
    {
        // do something here
    }

    private void buttonOpenChildFormClick(object sender, EventArgs e)
    {
        using (var addProduct = new Add_product(this)) //send this reference of MainForm to ChildForm
        {
            addProduct.ShowDialog();
        }
    }
}

public class Add_product : Form
{
    private readonly Products _products;

    public Add_product(Products products) //send reference of MainForm to ChildForm
    {
        _products = products;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _products.UpdateProductList();
    }
}