【问题标题】:Update DataGridView after Child Form Closed子窗体关闭后更新 DataGridView
【发布时间】:2016-12-05 10:55:51
【问题描述】:

我知道有很多类似的问题。但是,我对 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();
}

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

我还在UpdateProductsList 中添加了一个MessageBox,我确定它被调用了,数据也被插入到数据库中,但是DataGridView 没有显示新记录。

那么,我哪里出错了?

【问题讨论】:

  • 为什么要新建Form“Products products = new Products();” ?只需将现有主窗体的引用发送到对话框即可。
  • 你能告诉我怎么做吗?我对这个 OOP 和 C# 有点陌生
  • 当您使用ShowDialog显示子表单时,您不需要从子表单调用UpdateProductList,而是可以检查ShowDialog的结果,如果是DialogResult.OK,调用方法。同样在您的子表单中,在您的保存按钮中,设置this.DialogResult = DialogResult.OK
  • 目前您的问题出在保存按钮的代码中,您已经创建了列表表单的新实例并调用了它的UpdateProductsList 方法。它对您可以看到的列表表单的打开实例没有任何影响。这是一个不同的例子。
  • 附带说明,Add_productProducts 不适合表单的名称。当您查看这些名称时,它们就像方法名称,ProductAddFormProductListForm 是更好的选择。

标签: c# .net forms winforms datagridview


【解决方案1】:

当您使用ShowDialog 显示子表单时,您不需要从子表单调用LoadData,而是可以检查ShowDialog 的结果,如果是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*/
}

子窗体中的保存按钮

this.SaveData(); /*Save Data in child form */
this.DialogResult = System.Windows.Forms.DialogResult.OK;

注意

  • ShowDialog被调用时,它后面的代码直到对话框关闭后才会执行。
  • 如果您使用ShowDialog 显示表单,设置FormDialogResult 属性会关闭表单。
  • 您可以在保存按钮中将DialogResult 设置为OK,并在取消按钮中将其设置为Cancel
  • 目前您的问题出在保存按钮的代码中,您已经创建了列表表单的新实例并调用了它的UpdateProductsList 方法。它对您可以看到的列表表单的打开实例没有任何影响。这是一个不同的例子。

【讨论】:

  • 谢谢!这解决了问题。并感谢旁注!修复了很多混乱。 :)
  • 老兄真是太感谢你了。你的建议也解决了我的问题
  • @CavidHummatov 很高兴听到它有帮助!
【解决方案2】:

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

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();
    }
}

【讨论】:

  • 我这样做了,但上面写着Object reference not set to an instance of an object.
  • 在哪里?哪条线?在您的情况下,您必须将“this”添加到此行:“Add_product obj = new Add_product(this);”
  • 为什么返回空表单?
猜你喜欢
  • 1970-01-01
  • 2011-01-24
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2012-07-14
  • 1970-01-01
相关资源
最近更新 更多